SQL Fill/GetData Platzhalter

someone-m

Grünschnabel
SELECT WarenID, Gruppe, Text1, Text2, MwSt, Preis
FROM Waren
WHERE (Text1 LIKE '%' + @text + '%') OR
(Text2 LIKE '%' + @text + '%')

Diese SQl Abfrage Funktioniert einwandfrei im Abfrage Generator, rufe ich die Abfrage aus dem Prgramm ab funktionieren die Platzhalter nicht... Ich bekomme nur einen Datensatz wenn ich exakt einen der Inhalte der Textfelder eingebe...

Bin etwas Ratlos, jemand eine Idee oder workaround für mich ?

Danke

Jörg

Ich hab das auch mit einen Beispielprogramm von Microsoft gegengecheckt. Auch bei dem Programm funktioniert es nur im Abfrage Generator
 

Norbert Eder

Erfahrenes Mitglied
Zeig halt mal den relevanten Sourcecode her, dann können wir dir schon sagen, was du falsch machst ...

Und sollte das Statement nicht eher so aussehen:

Code:
SELECT WarenID, Gruppe, Text1, Text2, MwSt, Preis
FROM Waren
WHERE (Text1 LIKE '%@text%') OR
(Text2 LIKE '%@text%')
 

someone-m

Grünschnabel
Der Code ist:
Me.WarenTableAdapter.FillBySuchText(Me.XpressPizzaDataSet.Waren, SuchstringTB.Text)

Hinter FillBySuchText verbirgt sich die SQL Abfrage

Wie schon geschrieben, die SQL Abfrage ist Ok solange sie nicht im Programm aufgerufen wird.
 

rumsrumsrums

Grünschnabel
someone-m hat gesagt.:
SELECT WarenID, Gruppe, Text1, Text2, MwSt, Preis
FROM Waren
WHERE (Text1 LIKE '%' + @text + '%') OR
(Text2 LIKE '%' + @text + '%')

Diese SQl Abfrage Funktioniert einwandfrei im Abfrage Generator, rufe ich die Abfrage aus dem Prgramm ab funktionieren die Platzhalter nicht... Ich bekomme nur einen Datensatz wenn ich exakt einen der Inhalte der Textfelder eingebe...

Bin etwas Ratlos, jemand eine Idee oder workaround für mich ?

Danke

Jörg

Ich hab das auch mit einen Beispielprogramm von Microsoft gegengecheckt. Auch bei dem Programm funktioniert es nur im Abfrage Generator

Jörg hab das selbe Problem. Du willst ja das deine Textbox als Suchkreterium für die Abfrage dient, und du automatisch mit Platzhaltern wärend der Laufzeit arbeiten möchtest.

Sprich ich will alle finden die mit Mü anfangen.

Versuchs mal so:



im SQL Statement deines SQLDataAdpaters:

SELECT WarenID, Gruppe, Text1, Text2, MwSt, Preis
FROM Waren
WHERE (Text1 LIKE @text)

und im Code deines Click Events:


WarenTableAdapter.SelectCommand.Parameters("@text").Value = SuchstringTB.Text

jetzt sollte es in der Laufzeit klappen. Jedoch muss der Platzhalter selbst eingegeben werden.

z.b. Muster%

Hab jedoch selber das Problem , das ich dem Anwender die selbsteingabe der Platzhalter ersparn möchte.

Vielleicht Hilft dir das hier weiter hab das bei MSDN gefunden:


Wenn Parameter keinen Namen besitzen (wie in gespeicherten Prozeduren), werden die Elemente in der Auflistung den vom Befehl benötigten Parametern nach der Position zugeordnet. Wenn der Befehl eine gespeicherte Prozedur ist und einen Wert zurückgibt, wird das erste Element in der Auflistung (Element Null) für diesen Rückgabewert reserviert.

Sie können daher über die Indexposition in der Auflistung auf einzelne Parameterobjekte verweisen. Allerdings unterstützen Parameterobjekte auch eine ParameterName-Eigenschaft, die die Möglichkeit bietet, unabhängig von der Reihenfolge der Parameter auf die verschiedenen Parameter zu verweisen. Die beiden folgenden Anweisungen könnten z. B. äquivalent sein (vorausgesetzt, der zweite Parameter in der Auflistung hat den Namen Title_Keyword):

' Visual Basic
' Encloses the keyword in SQL wildcard characters.
titleKeyword = "%" & txtTitleKeyword.Text & "%"
OleDbDataAdapter1.SelectCommand.Parameters(1).Value = titleKeyword
OleDbDataAdapter1.SelectCommand.Parameters("Title_Keyword").Value = titleKeyword


Die Verwendung eines Parameternamens ist im Allgemeinen viel besser als der Verweis auf Parameter über einen Indexwert, weil sich der Verwaltungsaufwand reduziert, wenn die Anzahl der Parameter geändert wird. Sie müssen sich dann nicht merken, ob eine gespeicherte Prozedur einen Wert zurückgibt. Verweise auf Parameter nach Namen sind zwar mit etwas mehr Aufwand verbunden als Verweise über den Indexwert, der Mehraufwand wird aber durch eine komfortablere Programmierung und eine einfachere Verwaltung der Anwendung ausgeglichen.

Erstellen von Parameterwerten
Der Wert eines Parameters kann auf zwei Arten erstellt werden:

Durch explizites Festlegen der Value-Eigenschaft eines Parameters.
Durch Zuordnen der Parameter zu Spalten in einer Dataset-Tabelle, so dass die Werte bei Bedarf aus Datenzeilen extrahiert werden können.
Sie legen den Parameterwert für Auswahlparameter explizit fest, wenn Sie ein Dataset mit Daten füllen oder einen Befehl aufrufen. Die Anwendung im obigen Beispiel mit der Suche nach Büchern könnte ein Textfeld besitzen, in das Benutzer ein Titelschlüsselwort eingeben. Sie würden den Wert des Parameters in diesem Fall explizit auf den Text des Textfelds setzen, bevor Sie die Fill-Methode des Adapters aufrufen. Der dafür erforderliche Code könnte dann wie unten gezeigt aussehen.



In diesem Beispiel wird der Inhalt eines Textfelds vor dem Füllen eines Datasets als Parameter erstellt.

Jetzt kommt der Interessante Teil!
Code für das Event!

' Visual Basic
' Encloses the keyword in SQL wildcard characters.
titleKeyword = "%" & txtTitleKeyword.Text & "%"
OleDbDataAdapter1.SelectCommand.Parameters("Title_Keyword").Value = titleKeyword
OleDbDataAdapter1.Fill(dsAuthors1)

Versuchs mal in dem du den Code auf deinen Anpasst:

müsste so sein

textTB= "%" & SuchstringTB.text & "%"
WarenTableAdapter.SelectCommand.Parameters("@text").Value = textTB

wie gesagt nur ne paar Vorschläge

Falls du es hinbekommen solltest meld dich hier mal.

Gruss Sven
 
Zuletzt bearbeitet:

someone-m

Grünschnabel
Moin, moin,
habe das Problem gelöst. Der "Fehler" war folgender:

Die Textvariablen wurden intern von VB auf "NChar" gesetzt. Dadurch wurden nur strings in fester länge gesucht. Nachdem ich das in "NvarChar" geändert hatte funktioniert es Problemlos. Im Dataset.xsd über die entsprechenden Eigenschaften der Variablen in den Tabellen. Das Problem entsteht wohl auch nicht, wenn man beim Anlegen der Tabellen nvarchar als Typ festlegt. Habe ich allerdings nicht ausprobiert.

DIe Lösung habe ich über den Support von MS erhalten. 2 Anfragen sind da ja kostenlos ;)


Gruß

Jörg
 

rumsrumsrums

Grünschnabel
Hallo Jörg, du bist der beste!

hab mir die Frechheit erlaubt und deinen Typ mal ausprobiert. Und siehe da, es geht.

So ne blöder , hab die letzten Wochen nur an diesem Problem gehockt.

deine Where Klausel funktioniert genauso wie ich mir es gewünscht hab. Soll man erstmal drauf kommen das man den DataTyp auf NVarChar zu setzen hat.

Aber am Ende ist es meist wieder Logisch.


Ist einfach nichts für Leute mit ner Denkschwäche :D

Also nochmal besten Dank

hast mir mit deinem Post ne Menge nerven gespart.

Gruss aus Kiel

Sven