Discussion:
LinQ to SQL dynamisch zusammensetzen
(zu alt für eine Antwort)
Moldaschl Helmut
2009-09-11 06:39:01 UTC
Permalink
Hallo

Bei bisherigen Zugriffen auf SQL Datenbanken habe ich sehr oft die
Möglichkeit ausgenutzt den SQL String den ich über den SQL Command
geschickt habe dynamisch zusammen zu setzen

Wie zb.:
sql = "SELECT * FROM TableX Where"
sql_bed = vbnullstring

if Bed1 = True then
if not SQL_BED = vbnullstring then sql_bed =sql_bed & " AND "
sql_Bed = sql_Bed & " (Feld1 = " & Var1 & ")
end if

if Bed2 = True then
if not SQL_BED = vbnullstring then sql_bed =sql_bed & " AND "
sql_Bed = sql_Bed & " (Feld2 = " & Var2 & ")
end if

...
usw.
und dann an einen SQL-Command (so wie oben oder parametiert) übergeben kann


Für LinQ to SQL habe ich noch keine Möglichkeit gefunden
den Ausdruck
Dim query = From L in Datacontext.Tablex Where L.Feld1 = Var1 AND L.Feld2 =
Var2 ...... SELECT L

so zu formulieren, dass ich das Where Kriterium frei und dynamisch
zusammensetzen kann, da es sich hier nicht um einen String handelt,
den ich zuerst zusammenstellen und im Anschluß einsetzen kann

Für Tipps wäre ich dankbar
Grüße
Helmut
Elmar Boye
2009-09-11 07:25:01 UTC
Permalink
Hallo Helmut,
Post by Moldaschl Helmut
Bei bisherigen Zugriffen auf SQL Datenbanken habe ich sehr oft die
Möglichkeit ausgenutzt den SQL String den ich über den SQL Command
geschickt habe dynamisch zusammen zu setzen
sql = "SELECT * FROM TableX Where"
sql_bed = vbnullstring
Etwas wie VbNullString sollte man in VB.NET längst nicht mehr
nötig haben, ...
Post by Moldaschl Helmut
if Bed1 = True then
if not SQL_BED = vbnullstring then sql_bed =sql_bed & " AND "
sql_Bed = sql_Bed & " (Feld1 = " & Var1 & ")
end if
und mit dem Einsatz eines StringBuilders solltest Du
Dich ebenfalls vertraut machen.
<URL:http://msdn.microsoft.com/de-de/library/2839d5h5.aspx>

Zudem ist der Einsatz von eingebetteten VAriablen anfällig
für SQL Injection <URL:http://de.wikipedia.org/wiki/SQL-Injection>
und der Einsatz von Parametern vorzuziehen. Zumal dadurch
die Performanz von Anweisungen erhöht wird,da Abfragepläne
häufiger wieder verwendet werden können.
Post by Moldaschl Helmut
und dann an einen SQL-Command (so wie oben oder parametiert) übergeben kann
Für LinQ to SQL habe ich noch keine Möglichkeit gefunden
den Ausdruck
Dim query = From L in Datacontext.Tablex Where L.Feld1 = Var1 AND L.Feld2 =
Var2 ...... SELECT L
Linq To Sql sieht das von Haus nicht vor, auch wegen der damit
aufgegebenen Typsicherheit. Das Entity Framework als
konkurrierende Zugrifftechnik kennt wiederum Entity SQL
<URL:http://msdn.microsoft.com/de-de/library/bb399560.aspx>
womit Dein obiges Vorgehen machbar ist.

Weitergehend mit Linq als Technik wäre realisierbar:
<URL:http://www.albahari.com/nutshell/predicatebuilder.aspx>

was auf Dynamic Linq aus den Technologie-Beispielen basiert:
<URL:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx>

Nur würde ich Dir empfehlen, Dich zunächst mit Linq als solchem
näher auszueinanderzusetzen, denn ohne die Grundlagen zu beherrschen
wirst Du wenig Erfolg haben:
<URL:http://msdn.microsoft.com/de-de/library/bb397926.aspx>

Gruß Elmar
Moldaschl Helmut
2009-09-11 08:19:01 UTC
Permalink
Hallo Elmar,
Post by Elmar Boye
Hallo Helmut,
Post by Moldaschl Helmut
Bei bisherigen Zugriffen auf SQL Datenbanken habe ich sehr oft die
Möglichkeit ausgenutzt den SQL String den ich über den SQL Command
geschickt habe dynamisch zusammen zu setzen
sql = "SELECT * FROM TableX Where"
sql_bed = vbnullstring
Etwas wie VbNullString sollte man in VB.NET längst nicht mehr
nötig haben, ...
OK - was würdes Du hier statt dessen vorschlagen?
Post by Elmar Boye
Post by Moldaschl Helmut
if Bed1 = True then
if not SQL_BED = vbnullstring then sql_bed =sql_bed & " AND "
sql_Bed = sql_Bed & " (Feld1 = " & Var1 & ")
end if
und mit dem Einsatz eines StringBuilders solltest Du
Dich ebenfalls vertraut machen.
<URL:http://msdn.microsoft.com/de-de/library/2839d5h5.aspx>
Mit dem StringBuilder muss ich mich erst vertraut machen, habe aber bis dato
keine Speicher- oder Performance Probleme gehabt.
Post by Elmar Boye
Zudem ist der Einsatz von eingebetteten VAriablen anfällig
für SQL Injection <URL:http://de.wikipedia.org/wiki/SQL-Injection>
und der Einsatz von Parametern vorzuziehen. Zumal dadurch
die Performanz von Anweisungen erhöht wird,da Abfragepläne
häufiger wieder verwendet werden können.
die SQL-Injektion Problematik ist mir bewusst, in Abfragen die eine mehr
oder weniger freie
Eingabe einer Variablen durch den User vorsehen die in eine SQL-Abfrage
geschaufelt wird,
wird grundsätzlich parametriert, die o.a. Weise gibt es nur ins
Ausnahmefällen für kurze Abfragen
wo durch das Programm im Vorfeld die Variable festgelegt wird
Grundsätzlich bevorzuge ich StoredProcedures am SQL - Server für Ausführung
und Datenlieferung
um damit die Arbeit an den Server zu delegieren.
Post by Elmar Boye
Post by Moldaschl Helmut
und dann an einen SQL-Command (so wie oben oder parametiert) übergeben kann
Für LinQ to SQL habe ich noch keine Möglichkeit gefunden
den Ausdruck
Dim query = From L in Datacontext.Tablex Where L.Feld1 = Var1 AND L.Feld2 =
Var2 ...... SELECT L
Linq To Sql sieht das von Haus nicht vor, auch wegen der damit
aufgegebenen Typsicherheit. Das Entity Framework als
konkurrierende Zugrifftechnik kennt wiederum Entity SQL
<URL:http://msdn.microsoft.com/de-de/library/bb399560.aspx>
womit Dein obiges Vorgehen machbar ist.
<URL:http://www.albahari.com/nutshell/predicatebuilder.aspx>
<URL:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx>
Nur würde ich Dir empfehlen, Dich zunächst mit Linq als solchem
näher auszueinanderzusetzen, denn ohne die Grundlagen zu beherrschen
<URL:http://msdn.microsoft.com/de-de/library/bb397926.aspx>
Ich beginne gerade mich mit LinQtoSQL auseinander zu setzen, stehe aber vor
der Notwendigkeit
beim Umstieg bestehende Applikationen nicht komplett wegschmeißen zu können.
Danke für den Link auf die Beispiele.
Post by Elmar Boye
Gruß Elmar
Danke
Grüße Helmut
Elmar Boye
2009-09-11 09:20:47 UTC
Permalink
Post by Moldaschl Helmut
Hallo Elmar,
Post by Elmar Boye
Hallo Helmut,
Post by Moldaschl Helmut
Bei bisherigen Zugriffen auf SQL Datenbanken habe ich sehr oft die
Möglichkeit ausgenutzt den SQL String den ich über den SQL Command
geschickt habe dynamisch zusammen zu setzen
sql = "SELECT * FROM TableX Where"
sql_bed = vbnullstring
Etwas wie VbNullString sollte man in VB.NET längst nicht mehr
nötig haben, ...
OK - was würdes Du hier statt dessen vorschlagen?
Nothing: <URL:http://msdn.microsoft.com/de-de/library/0x9tb07z.aspx>
Post by Moldaschl Helmut
Post by Elmar Boye
Post by Moldaschl Helmut
if Bed1 = True then
if not SQL_BED = vbnullstring then sql_bed =sql_bed & " AND "
sql_Bed = sql_Bed & " (Feld1 = " & Var1 & ")
end if
und mit dem Einsatz eines StringBuilders solltest Du
Dich ebenfalls vertraut machen.
<URL:http://msdn.microsoft.com/de-de/library/2839d5h5.aspx>
Mit dem StringBuilder muss ich mich erst vertraut machen, habe aber bis dato
keine Speicher- oder Performance Probleme gehabt.
Etwas erst einzusetzen, wenn es so weit kommt, wäre ein klein wenig spät.
Das ist mehr ein Frage ob man .NET als Technik beherrscht bzw. beherrschen will.
Post by Moldaschl Helmut
Post by Elmar Boye
Zudem ist der Einsatz von eingebetteten VAriablen anfällig
für SQL Injection <URL:http://de.wikipedia.org/wiki/SQL-Injection>
und der Einsatz von Parametern vorzuziehen. Zumal dadurch
die Performanz von Anweisungen erhöht wird,da Abfragepläne
häufiger wieder verwendet werden können.
die SQL-Injektion Problematik ist mir bewusst, in Abfragen die eine mehr
oder weniger freie Eingabe einer Variablen durch den User vorsehen die
n eine SQL-Abfrage geschaufelt wird,
Es ist wie auch oben nur als Hinweis gedacht.
Proaktiv wäre hier besser, als zu warten bis das Kind doch mal im Brunnen landet.
Post by Moldaschl Helmut
Post by Elmar Boye
Post by Moldaschl Helmut
Für LinQ to SQL habe ich noch keine Möglichkeit gefunden
den Ausdruck
Dim query = From L in Datacontext.Tablex Where L.Feld1 = Var1 AND L.Feld2 =
Var2 ...... SELECT L
Linq To Sql sieht das von Haus nicht vor, auch wegen der damit
aufgegebenen Typsicherheit. Das Entity Framework als
konkurrierende Zugrifftechnik kennt wiederum Entity SQL
<URL:http://msdn.microsoft.com/de-de/library/bb399560.aspx>
womit Dein obiges Vorgehen machbar ist.
Nur würde ich Dir empfehlen, Dich zunächst mit Linq als solchem
näher auszueinanderzusetzen, denn ohne die Grundlagen zu beherrschen
<URL:http://msdn.microsoft.com/de-de/library/bb397926.aspx>
Ich beginne gerade mich mit LinQtoSQL auseinander zu setzen, stehe aber vor
der Notwendigkeit beim Umstieg bestehende Applikationen nicht komplett
wegschmeißen zu können.
Du brauchst/solltest auch nichts wegschmeißen -
meint ein langjähriger SQL Server MVP.

Nur ist die Notwendigkeit dynamisches SQL einzusetzen gar
nicht so häufig, und vieles lässt sich in Visual Basic Funktionsausdrücken
erledigen: <URL:http://msdn.microsoft.com/de-de/library/cc138590.aspx>

Und vor Linq2Sql (oder Entity Framework) sollte man den Umgang
mit Linq (To Objects) gelernt haben, das macht die Auswahl beim
Einsatz deutlich leichter.

Gruß Elmar
Frank Dzaebel
2009-09-12 09:31:06 UTC
Permalink
Hallo Moldaschl,
Post by Moldaschl Helmut
StringBuilders [...]
Mit dem StringBuilder muss ich mich erst vertraut machen, habe aber
bis dato keine Speicher- oder Performance Probleme gehabt.
Der StringBuilder wäre auch in Deinen geposteten Fällen
(mit wenigen Konkatenationen) eher eine Performance-
Verschlechterung!

Man kann sich aber als Faustregel merken:
"bei mehr als 5 String-Konkatenationen den StringBuilder benutzen".
Post by Moldaschl Helmut
Für LinQ to SQL habe ich noch keine Möglichkeit gefunden
Dim query = From L in Datacontext.Tablex
Where L.Feld1 = Var1 AND L.Feld2 = Var2 ......
SELECT L
so zu formulieren, dass ich das Where Kriterium frei
und dynamisch zusammensetzen kann [...]
Das geht auf vielerlei Arten mit 'Linq to Sql'.
Zunächst natürlich mit den bekannten ExecuteQuery, oder
den "partial Überschreibungs-Möglichkeiten":

[LINQ to SQL (Part 8 - Executing Custom SQL Expressions) - ScottGu's Blog]
http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

und dann natürlich auch über das Erzeugen von Linq 'Expression' - Objekten.
Als Aufruf dann z.B.: query = Datacontext.Tablex.Where(deineExpression)

[Gewusst wie: Verwenden von Ausdrucksbaumstrukturen zum Erstellen
dynamischer Abfragen]
http://msdn.microsoft.com/de-de/library/bb882637.aspx

Linq to SQL oder besser noch das Entity Framework
ist sehr empfehlenswert.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Moldaschl Helmut
2009-09-14 09:13:01 UTC
Permalink
Hallo Frank
Post by Frank Dzaebel
Hallo Moldaschl,
Post by Moldaschl Helmut
StringBuilders [...]
Mit dem StringBuilder muss ich mich erst vertraut machen, habe aber
bis dato keine Speicher- oder Performance Probleme gehabt.
Der StringBuilder wäre auch in Deinen geposteten Fällen
(mit wenigen Konkatenationen) eher eine Performance-
Verschlechterung!
"bei mehr als 5 String-Konkatenationen den StringBuilder benutzen".
Danke für den Hinweis
Post by Frank Dzaebel
Post by Moldaschl Helmut
Für LinQ to SQL habe ich noch keine Möglichkeit gefunden
Dim query = From L in Datacontext.Tablex
Where L.Feld1 = Var1 AND L.Feld2 = Var2 ......
SELECT L
so zu formulieren, dass ich das Where Kriterium frei
und dynamisch zusammensetzen kann [...]
Das geht auf vielerlei Arten mit 'Linq to Sql'.
Zunächst natürlich mit den bekannten ExecuteQuery, oder
[LINQ to SQL (Part 8 - Executing Custom SQL Expressions) - ScottGu's Blog]
http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
und dann natürlich auch über das Erzeugen von Linq 'Expression' - Objekten.
Als Aufruf dann z.B.: query = Datacontext.Tablex.Where(deineExpression)
[Gewusst wie: Verwenden von Ausdrucksbaumstrukturen zum Erstellen
dynamischer Abfragen]
http://msdn.microsoft.com/de-de/library/bb882637.aspx
Linq to SQL oder besser noch das Entity Framework
ist sehr empfehlenswert.
Danke für den Link zu Scott Guthrie, hier habe ich auch die Möglichkeit
gefunden
meine bestehenden umfangreichen SPROC's zur zur Datenabfrage in LinQ to SQL
zu verwenden
Post by Frank Dzaebel
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Grüsse
Helmut

Loading...