string stmt = "SELECT " +
"bierflasche " +
"FROM kühlschrank " +
"WHERE temperatur < 8";
StringBuilder sb = new StringBuilder();
sb.Append("SELECT ");
sb.Append("bierflasche ");
sb.Append("FROM kühlschrank ");
sb.Append("WHERE temperatur < 8");
string stmt = sb.ToString();
string stmt = @"SELECT
bierflasche
FROM kühlschrank
WHERE temperatur < 8";
|
|
Ich würde folgende schreibweise verwenden:
#Region SQL-Statements
const string stmt = @"
SELECT bierflasche
FROM kühlschrank
WHERE temperatur < @temperatur
";
#end Region
//..
SqlCommand cmd= new SqlCommand(stmt, conn);
cmd.Parameters.Add(new SqlParameter("@temperatur", 8));
//...
|
|
string stmt = @"
SELECT bierflasche
FROM kühlschrank
WHERE temperatur < @temperatur
";
SqlCommand command = new SqlCommand(stmt, conn);
command.Parameters.Add(new SqlParameter("@temperatur", 8));
|
|
using (var context = new KuechenEntities())
{
var bierflaschen =
from p in context.kuehlschrank
where p.temperatur < 8
orderby p.haltbarkeitsdatum
select p.bierflasche;
}
|
|
|
|
string stmt = "SELECT bierflasche FROM kühlschrank WHERE temperatur < 8";
string stmt = "SELECT\r\nbierflasche\r\nFROM kühlschrank\r\nWHERE temperatur < 8";
string.Concat()(und damit "xx" + "yy"), wenn man mehrere Strings zusammenfügen will, die nicht zur Kompilierzeit bekannt sind.
|
|
|
Doch, ich denke schon, dass der StringBuilder schneller ist, hier muss schließlich nur 1 Objekt erzeugt werden, bei der Konkatenation von 3 Strings wie in meinem Beispiel schon 3. Das ist jetzt aber Erbsenzählerei.
– chriscolm 27.09.2011
|
||
|
So lange Du die strings als Konstanten zusammenfügst (und das machst Du), optimiert der compiler bereits. Du hast am Ende also nur einen einzigen string, der direkt verwendet werden kann (siehe oben).
StringBuilder lohnt sich nicht immer (bei 3 Zeilen schon gar nicht) und hat im Gegensatz zur direkten Verwendung den Nachteil, dass der string erst mal rein und danach auch wieder raus muss. Damit erstellst Du ein weiteres Objekt und kopierst Daten unnötig hin und her - ergo langsamer (wobei man das kaum merken wird). Beim Zusammenfügen unbekannter strings (z.B. aus Dateiinhalt) geb ich Dir recht – WolfgangKluge 28.09.2011
|
StringBuilder var1 = new StringBuilder();
var1.Append("CREATE FUNCTION Inffkfrom(@tbID INT, \n");
var1.Append(" @colID SMALLINT) \n");
var1.Append("RETURNS VARCHAR(2000) \n");
var1.Append("AS \n");
var1.Append(" BEGIN \n");
var1.Append(" DECLARE @r VARCHAR(2000), \n");
var1.Append(" @a VARCHAR(200) \n");
var1.Append(" \n");
var1.Append(" SELECT @r = '', \n");
var1.Append(" @a = '' \n");
var1.Append(" \n");
var1.Append(" DECLARE cs CURSOR FOR \n");
var1.Append(" SELECT fkfrom=CONVERT(VARCHAR(200), Object_name(rkeyid)+'.'+r.[name]) \n");
var1.Append(" FROM sysforeignkeys c \n");
var1.Append(" JOIN syscolumns f \n");
var1.Append(" ON c.fkeyid = f.[id] \n");
var1.Append(" AND c.fkey = f.colid \n");
var1.Append(" JOIN syscolumns r \n");
var1.Append(" ON c.rkeyid = r.[id] \n");
var1.Append(" AND c.rkey = r.colid \n");
var1.Append(" WHERE fkeyid = @tbID \n");
var1.Append(" AND fkey = @colID \n");
var1.Append(" ORDER BY keyno \n");
var1.Append(" \n");
var1.Append(" OPEN cs \n");
var1.Append(" \n");
var1.Append(" FETCH NEXT FROM cs INTO @a \n");
var1.Append(" \n");
var1.Append(" WHILE @@FETCH_STATUS = 0 \n");
var1.Append(" BEGIN \n");
var1.Append(" SELECT @r = @r + CASE \n");
var1.Append(" WHEN Len(@r) > 0 THEN ', ' \n");
var1.Append(" ELSE '' \n");
var1.Append(" END + @a \n");
var1.Append(" \n");
var1.Append(" FETCH NEXT FROM cs INTO @a \n");
var1.Append(" END \n");
var1.Append(" \n");
var1.Append(" CLOSE cs \n");
var1.Append(" \n");
var1.Append(" DEALLOCATE cs \n");
var1.Append(" \n");
var1.Append(" RETURN( @r ) \n");
var1.Append(" END");
StringBuilder var11 = new StringBuilder();
var11.Append(" \n");
var11.Append("GO ");
String var1 = "";
var1 = var1 +"CREATE FUNCTION Inffkfrom(@tbID INT, "+"\n";
var1 = var1 +" @colID SMALLINT) "+"\n";
var1 = var1 +"RETURNS VARCHAR(2000) "+"\n";
var1 = var1 +"AS "+"\n";
var1 = var1 +" BEGIN "+"\n";
var1 = var1 +" DECLARE @r VARCHAR(2000), "+"\n";
var1 = var1 +" @a VARCHAR(200) "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" SELECT @r = '', "+"\n";
var1 = var1 +" @a = '' "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" DECLARE cs CURSOR FOR "+"\n";
var1 = var1 +" SELECT fkfrom=CONVERT(VARCHAR(200), Object_name(rkeyid)+'.'+r.[name]) "+"\n";
var1 = var1 +" FROM sysforeignkeys c "+"\n";
var1 = var1 +" JOIN syscolumns f "+"\n";
var1 = var1 +" ON c.fkeyid = f.[id] "+"\n";
var1 = var1 +" AND c.fkey = f.colid "+"\n";
var1 = var1 +" JOIN syscolumns r "+"\n";
var1 = var1 +" ON c.rkeyid = r.[id] "+"\n";
var1 = var1 +" AND c.rkey = r.colid "+"\n";
var1 = var1 +" WHERE fkeyid = @tbID "+"\n";
var1 = var1 +" AND fkey = @colID "+"\n";
var1 = var1 +" ORDER BY keyno "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" OPEN cs "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" FETCH NEXT FROM cs INTO @a "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" WHILE @@FETCH_STATUS = 0 "+"\n";
var1 = var1 +" BEGIN "+"\n";
var1 = var1 +" SELECT @r = @r + CASE "+"\n";
var1 = var1 +" WHEN Len(@r) > 0 THEN ', ' "+"\n";
var1 = var1 +" ELSE '' "+"\n";
var1 = var1 +" END + @a "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" FETCH NEXT FROM cs INTO @a "+"\n";
var1 = var1 +" END "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" CLOSE cs "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" DEALLOCATE cs "+"\n";
var1 = var1 +" "+"\n";
var1 = var1 +" RETURN( @r ) "+"\n";
var1 = var1 +" END";
String var11 = "";
var11 = var11 +" "+"\n";
var11 = var11 +"GO ";
CREATE FUNCTION Inffkfrom(@tbID INT,
@colID SMALLINT)
RETURNS VARCHAR(2000)
AS
BEGIN
DECLARE @r VARCHAR(2000),
@a VARCHAR(200)
SELECT @r = '',
@a = ''
DECLARE cs CURSOR FOR
SELECT fkfrom=CONVERT(VARCHAR(200), Object_name(rkeyid)+'.'+r.[name])
FROM sysforeignkeys c
JOIN syscolumns f
ON c.fkeyid = f.[id]
AND c.fkey = f.colid
JOIN syscolumns r
ON c.rkeyid = r.[id]
AND c.rkey = r.colid
WHERE fkeyid = @tbID
AND fkey = @colID
ORDER BY keyno
OPEN cs
FETCH NEXT FROM cs INTO @a
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @r = @r + CASE
WHEN Len(@r) > 0 THEN ', '
ELSE ''
END + @a
FETCH NEXT FROM cs INTO @a
END
CLOSE cs
DEALLOCATE cs
RETURN( @r )
END
GO
|
|
|
+1 Gut zu wissen, dass es das Ding gibt - aber da er Variante 3 nicht kann, kommt er zumindest für C#-Formatierung für mich nicht in Frage.
– Matthias Hlawatsch 28.09.2011
|
||
|
Hi Matthias. Variante 3 würde ja eigentlich nur heissen das du string stmt = @" vor mein drittes Beispiel packst und am ende den string wieder schliesst mit "; - Oder habe ich dich falsch verstanden?
– Thomas Sczyrba 28.09.2011
|
||
|
Hm, vielleicht war ich da etwas vorschnell. Mit der dritten Variante könnte es gehen wie von Dir vorgeschlagen, plus Escapen von Sonderzeichen. In String-Literalen, die mit @ eingeleitet werden, muss man aber in C# nur die " escapen, oder hab ich was übersehen? Das wäre praktisch, denn die kommen in SQL-Befehlen selbst höchstens mal in String-Literalen vor, also fast nie. Und wenn, dann meckert der Compiler sehr schnell und deutlich.
– Matthias Hlawatsch 28.09.2011
|
|
|