String zusammensetzten SQL Statement
-
Ich habe ein Formular mit mehreren Felder -> Textboxen.
Wenn auf Button Suche geklickt wird sollte ein SQL Statement "zusamengebaut" und ausgeführt werden.Problem:
Wenn ein Feld nicht angegeben wurde ist der SQL Statement falsch.
Bsp.Select blablabla where bla = 1 and bla2 = 2 and <- (AND am schluss ist der fehler)
Wie kann ich das am besten lösen ?
Pseudocode:
if(alle felder leer) dann führe ohne where aus (Sqlstmnt) else sqlstmnt + " where " if feld bla != leer dann { sqlstmnt + "Bla = '" +TextBox +"'" sqlstmtn + " and " } if feld bla2 != leer dann { sqlstmnt + "Bla = '" +TextBox +"'" sqlstmtn + " and " } ....
Es sind ca 10 Felder, Wenn 1 irgendwo ausgelassen wird kommt ein komischer sql statement raus, der natürlich fehlerhaft ist
Hoffe jemand kann helfen
Gruss
(Poste es bewusst in Rund um die Programmierung -> Es ist mehr ein überlegungsfehler)
-
Das was du machst, solltest du komplett vermeiden, da du so SQL-Injections Tür und Tor öffnest. Du solltest immer mit SQL-Parametern arbeiten.
Ansonsten ist dein Pseudo-Code aber doch in Ordnung.
-
Prozedurale Programmierung?
function sqlForField (name, feld) { if(feld == leer) return ''; return name + '=\'' + SECURE(feld) + '\''; } Feld felder = { a, b, c, ... ca. 10 }; string sql = '...'; foreach(feld in felder) { sql += sqlForField(feld.name, feld.value); sql += ' AND '; } sql = sql.schneideLetzte5ZeichenAb();
Soetwas?
MfG SideWinder
-
dEUs schrieb:
Das was du machst, solltest du komplett vermeiden, da du so SQL-Injections Tür und Tor öffnest. Du solltest immer mit SQL-Parametern arbeiten.
Ansonsten ist dein Pseudo-Code aber doch in Ordnung.Lässt sich bei dynamischen SQL-Statements aber imho nicht vermeiden, oder? Gibt es schon soetwas wie dynamic SQL-Parameter-Abfragen?
MfG SideWinder
-
SideWinder schrieb:
Prozedurale Programmierung?
function sqlForField (name, feld) { if(feld == leer) return ''; return name + '=\'' + SECURE(feld) + '\''; } Feld felder = { a, b, c, ... ca. 10 }; string sql = '...'; foreach(feld in felder) { sql += sqlForField(feld.name, feld.value); sql += ' AND '; } sql = sql.schneideLetzte5ZeichenAb();
Soetwas?
MfG SideWinder
Ja genau ! Weis aber nicht ob man das in VBA so lösen könnte.
Hab mir gerade überlegt ob ich soetwas machen könnte:if feld != leer{ sqlstmnt + "bla = '" textbox "'" counter + 1 } if so oft 'and' in sqlstmnt - counter = 1{ schneide die letzten 5 Zeichen aus }
Wenn ich nichts falsches überlegt habe, müsste ich nur noch wissen wie man herausfindet wie oft ein string in einem string befindet in vba.
-
SideWinder schrieb:
dEUs schrieb:
Das was du machst, solltest du komplett vermeiden, da du so SQL-Injections Tür und Tor öffnest. Du solltest immer mit SQL-Parametern arbeiten.
Ansonsten ist dein Pseudo-Code aber doch in Ordnung.Lässt sich bei dynamischen SQL-Statements aber imho nicht vermeiden, oder? Gibt es schon soetwas wie dynamic SQL-Parameter-Abfragen?
MfG SideWinder
Vielleicht stehe ich gerade auf dem Schlauch, aber das ist doch unabhängig davon, ob es dynamisches SQL ist oder nicht.
Der Feldname muss ja eindeutig sein, wenn er in der where-Bedingung auftaucht. Dann kann man den Feldnamen als Parameternamen verwenden und schon hat man "keine" Probleme mehr.
In C# beispielsweise:private static SqlCommand CreateSql(IEnumerable<KeyValuePair<string, string>> fields) { var result = new SqlCommand(); result.CommandText = "SELECT * FROM TABLE WHERE 1=1"; foreach (var field in fields) { AddConditionForField(result, field); } return result; } private static void AddConditionForField(SqlCommand sqlCommand, KeyValuePair<string, string> field) { if (string.IsNullOrEmpty(field.Value)) { return; } sqlCommand.CommandText += " AND " + field.Key + " @" + field.Key; sqlCommand.Parameters.Add(field.Key, field.Value); }
-
Setz das and einfach an den Anfang, etwa so:
if(alle felder leer) dann führe ohne where aus (Sqlstmnt) else whereParam = "" if feld bla != leer dann { whereParam + " and Bla = '" +TextBox +"'" } if feld bla2 != leer dann { whereParam + " and Bla = '" +TextBox +"'" } // hier noch erste 5 Buchstaben aus whereParam entfernen sqlstmntParam + " where " + whereParam ....
-
Habs so gemacht und es funktioniert
abfrage
if alle felder leer dann
{
führe abfrage aus
beende funktion
}else
abfrage + " where "
if feld bla != leer dann
{
abfrage = abfrage + "bla = " textboxbla
abfrage = abfrage + " and "
}...
// in jedem fall wird " and " am ende des String stehen
abfrage - letze 5 zeichen
if letzte 6 zeichen = "where "
{
schneide letze 6 zeichen aus
}abfrage ausführen
Danke für euere Hilfe
Gruss Mr. Snrub