vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Datenbanken
Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Preisser
Datum: 23.08.11 17:36

Hallo,

naja, also du könntest ja den Suchstring über das Leerzeichen in ein Array zerlegen, und dann für jeden Eintrag einen WHERE-Teilausdruck mit der entsprechenden INSTR() bzw. CHARINDEX()-Funktion zum SQL-String hinzufügen.

Also wenn der Suchstring "DasProdukt DerName" ist, dass dann z.B. ein solcher SQL-Audruck generiert wird:

SELECT Name FROM Products WHERE (INSTR(1, Name, 'DasProdukt') > 0 OR INSTR(1, Name, 'DerName') > 0));

(Für Access heißt die Funktion INSTR(), bei SQL Server heißt sie CHARINDEX(), mit anderen Parameterwerden).

Bei Verwendung von LIKE ist zu beachten, dass man dann die Zeichen, die bei einem LIKE-String eine spezielle Bedeutung haben, escapen müsste.

Außerdem wäre es besser, die Parameter nicht in den SQL-String hineinzu-"frickeln", sondern beispielsweise ein Parametrized Statement zu verwenden (oder zumindest die eingefügten Strings bei SQL-Zeichen zu escapen), da der Anwender ansonsten leicht die DB-Abfragen manipulieren kann.

Beitrag wurde zuletzt am 23.08.11 um 17:39:27 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 16:06

Hallo

Damit ich mit mehreren Suchbegriffen die in einer Textbox mit Leerzeichen eingegeben werden, auch über mehrere Spalten einer Datenbanktabelle ein Ergebnis bekomme, habe ich mir fogenden Code zusammengebastelt.

Mein Problem besteht darin, das die Suchabfrage als solches zwar funktioniert, aber nur mit den Spalten EAN und ProductID. Egal ob nach einer Zahl oder nach Text gesucht wird.

In der Spalte Name lässt sich partue nichts finden??????????!!!!!!!!!!!!!!

' Ersetzt die Leerzeichen mit >> ',' <<
vSearch = " ": vReplace = "','": vString = Replace(strText, vSearch, vReplace)
 
' sqlString -> größere Sql-Abfrage über 3 Tabellen - funktioniert ohne Probleme
 
With grid1
  Set .Recordset = oDB_ShopDB.OpenRecordset(sqlString & " WHERE (P.Name IN ('" _
    & vString & "') OR P.EAN IN ('" & vString & "') OR P.ProductID IN ('" & _
    vString & "')) AND PD.ElType = 2 ORDER BY P.Name")
  .Refresh
  .Row = 1
End With
Das Suchen nach EAN-Nummer "123456789" oder auch nach Artikelnnumer wie "AN123" bringt das richtige Ergebnis.

Suche ich aber nach "Produktname" - dann gibt es gar nix zu sehen?!

Auch das alleinige angeben von

Set .Recordset = oDB_ShopDB.OpenRecordset(sqlString & " WHERE P.Name IN ('" & _
  vString & "')")
oder

Set .Recordset = oDB_ShopDB.OpenRecordset("Select Name From Products WHERE Name" & _
  "IN ('Produktname')")
bringt kein Ergebnis...

Ich hoffe Ihr hab ne Idee wieso das so ist oder wo bei mir der Denkfehler ist.

Danke im Vorraus für Eure Hilfe

Gruß

Andreas

Beitrag wurde zuletzt am 23.08.11 um 16:10:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: wb-soft
Datum: 23.08.11 16:24

Hi!

Für exakte Aussagen habe ich zu wenige Infos. Du solltest die aber auf jeden Fall den Operator LIKE ansehen.


mfg

WB
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 16:37

Danke für deine schnelle Antwort

Hab ich schon, funktioniert ja auch.

Ich möchte aber eine Art intelligente Suche hinbekommen, die mir auch Ergebnisse liefert wenn z.B.

in der Spalte 'Name' steht : "1. Produkt mit Name sowieso" und ich suche aber nach "Name Produkt" liefert mir die Likeanweisung kein Ergebnis auch nicht mit "*" oder "%".

So soll also der eingegebene String zerlegt werden in "Name" & "Produkt" und nach jedem einzelnen Suchbegriff gesucht werden. Rauskommen müsste auch mit "Name Produkt" das Ergebnis = "1. Produkt mit Name sowieso"

Danke

Beitrag wurde zuletzt am 23.08.11 um 16:38:43 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 17:08

Also im Prinzip das hier : http://unckel.de/v6/post.aspx?id=168 - nur für VB6!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 18:01

@Preisser

Außerdem wäre es besser, die Parameter nicht in den SQL-String hineinzu-"frickeln", sondern beispielsweise ein Parametrized Statement zu verwenden (oder zumindest die eingefügten Strings bei SQL-Zeichen zu escapen), da der Anwender ansonsten leicht die DB-Abfragen manipulieren kann.

Wat? Ich versteh nur Bahnhof... ich bin ANFÄÄÄÄÄNGERRRRR! - hatte ich glaub ich vergessen zu erwähnen.

Über das Zusammenbauen des SQL-String´s hatte ich mir schon Gedanken gemacht. Anzahl der einzelnen Wörter ermitteln, dann jeweils für die entsprechende Spalte die Sql-Abfrage zusammensetzen und die abzufragenden Spalten miteinander verbinden und schliesslich den gesamten SQL-String ausführen...

also etwa so: 3 Wörter sind in der Textbox mit Leerzeichen getrennt : "Wort1 Wort2 Wort3"

3 Spalten der Datenbank sollen durchsucht werden, würde also so aussehen pro Spalte:

... WHERE (Spalte1 Like *Wort1* OR Spalte1 Like *Wort2* OR Spalte1 Like *Wort2*) ...

dann die 3 Spalten zusamenfügen

(Spalte1 Like *Wort1* OR Spalte1 Like *Wort2* OR Spalte1 Like *Wort3*) OR
(Spalte2 Like *Wort1* OR Spalte2 Like *Wort2* OR Spalte2 Like *Wort3*) OR
(Spalte3 Like *Wort1* OR Spalte3 Like *Wort2* OR Spalte3 Like *Wort3*)

Bin leider noch nicht sehr weit gekommen. Das Statement von http://unckel.de/v6/post.aspx?id=168 ist genau das was ich benötige, nur eben für vb6...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Preisser
Datum: 23.08.11 18:08

Hallo,

ja, wenn du es lieber mit LIKE machen willst, sollte das schon so gehen. Man muss halt nur aufpassen, dass man dann die entsprechenden Zeichen wie "[" in "[[]" umwandelt, da der Anwender ja sonst den Like-String manipulieren könnte (bei INSTR() bzw. CHARINDEX() ist das nicht erforderlich).

Was genau funktioniert denn noch nicht?

Beitrag wurde zuletzt am 23.08.11 um 18:08:58 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 18:27

@Preisser

hab gerade erst angefangen... zunächst such ich gerade ne möglichkeit die anzahl der übergebenen wörter zu ermittel, der rest sollte wohl "relativ" einfach gehen, da die abzufragendnen spalten ja feststeht.

das dass nich die sauberste lösung ist mir schon klar, aber wenn es funktioniert bin ich zufrieden.

danke für deine hilfe
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Preisser
Datum: 23.08.11 18:44

Hallo,

du könntest dir z.B. eine Funktion machen, der du ein Array aus Spalten sowie ein Array aus Suchwörtern übergibst (sowie einen Parameter, der besimmt, ob alle Wörter vorkommen müssen oder nur eins davon), und diese generiert dann den SQL-String. z.B.
Public Function GenerateSQLSearchString(Columns() As String, Words() As String, _
  AlleWorterVorkommen As Boolean) As String
    Dim sqlString As String
    Dim i As Long, j As Long
    For i = 0 To UBound(Words)
        If Len(Words(i)) > 0 Then 'Wenn das Wort leer ist, keinen Ausdruck 
        ' angeben
            If i > 0 Then sqlString = sqlString & _
                IIf(AlleWorterVorkommen, " AND ", " OR ")
            sqlString = sqlString & "("
            For j = 0 To UBound(Columns)
                If j > 0 Then sqlString = sqlString & " OR "
                sqlString = sqlString & Columns(j) & " LIKE '%" + Words(i) + _
                  "%'"
            Next
            sqlString = sqlString & ")"
        End If
    Next
    GenerateSQLSearchString = sqlString
End Function
Man könnte sie dann z.B. so aufrufen:
Dim Spalten() As String
ReDim Spalten(2)
Spalten(0) = "Spalte1"
Spalten(1) = "Spalte2"
Spalten(2) = "Spalte3"
 
Dim Suchstring As String
Suchstring = "Wort1 Wort2"
Dim Woerter() As String
Woerter = Split(Suchstring, " ") 'Suchstring über Leerzeichen in String-Array 
' splitten
MsgBox GenerateSQLSearchString(Spalten, Woerter, False)
(der Suchstring wäre dann natürlich später variabel). Dann generiert die Funktion einen entsprechenden SQL-Ausdruck, welcher an den WHERE-Teil eines SQL-Strings angehängt werden kann.

Diese Funktion demonstriert jetzt nur das Prinzip und sollte so natürlich keinesfalls in fertigen Programmen so verwendet werden, da:
- LIKE-Spezialzeichen nicht espaced werden (und der Anwender dadurch selbst LIKE-Operatoren verwenden kann (was die Ergebnisse verfälscht), außer natürlich dies ist ausdrücklich so gewollt).
- Parameter einfach in den SQL String eingefügt werden, was SQL Injection ermöglicht
- der Fall nicht gehandhabt wird, wenn nur leere Wörter (mit 0 Zeichen) oder ein leeres Array vorliegt, da dies einen leeren String zurückgibt. Man könnte aber beim Aufruf der Funktion testen, ob die Länge des Strings 0 ist, und wenn ja, z.b. den WHERE-Parameter weglassen (damit nicht etwas ungültiges wie "SELECT .. FROM Tabelle WHERE;" generiert wird).

Des Weiteren könnte man die Anzahl der Wörter, die man zur Suche zulässt, beschränken, um nicht einen zu langen SQL-Ausdruck zu produzieren.

Da bei einer Datenbank standardmäßig ein Stringvergleich verwendet wird, der Groß-Kleinschreibung entsprechend verarbeitet, wird auch eine Spalte mit "TeSt" bei der Suche nach "test" gefunden, ohne dass man die Strings vorher normalisiert.

Beitrag wurde zuletzt am 23.08.11 um 19:01:22 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 19:01

@Preisser

Boa, HAMMER! Danke für den Schubs in die richtige Richtung und natürlich für den Quellcode.

Vielen Vielen Dank.

Ich werds mal ausprobieren...

Andreas
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: wb-soft
Datum: 23.08.11 19:48

Hi!

Preisser hat hier die "GT-Ausführung" aufgezeigt.

Zum besseren Verständnis schau dir z. B. diesen Thread an:
http://www.vbarchiv.net/forum/read.php?id=13&t=15310&i=15310&v=f
Da wird die Vorgangsweise am Beispiel Hochkomma gezeigt.

SQL-Injection ist ein anderes, riesengroßes Thema. Für einen Einsteiger vielleicht zu steil.
Wenn auch "nicht vertrauenswürdige" User mit der DB arbeiten, solltest du dich aber doch über dieses Thema schlau machen.


mfg

WB
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 19:49

@Preisser

Danke es funzt!!!!!! Vielen Vielen Dank Du hast mir sehr geholfen!!!!!!!!!!!!!!!!!

Andreas
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Suchen mit Leerzeichen über mehrere Spalten 
Autor: Callimero
Datum: 23.08.11 19:55

@wb-soft

Danke für den Tipp. Werd ich mir reinziehen und Dank an Euch alle...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel