Mit SQLParameter erzeugten SQL-String debuggen

15/08/2008 - 14:13 von joneigel | Report spam
Hi Group,
nachdem ich meinen SQL-Befehl nicht mehr selbst zusammenbastle,
sondern dafür die Parameter von Sqlcommand nehme, fehlt mir für das
Debuggen nun doch der komplette SQL-String.

Oder gibt es etwas, den aus den Parametern erzeugten SQL-Befehl zu
betrachten?

Oder gibt es ein Hinweis, bei welchem Parameter ein Fehler vorliegt,
z.B. wenn es heißt 'Inhalt würde abgeschnitten werden' ?

sqlCmd = New SqlCommand("UPDATE TEST set a=@a, b=@b, c=@c", DbConn)
sqlCmd.Parameters.Add(New SqlParameter("@a", "12345"))
sqlCmd.Parameters.Add(New SqlParameter("@b", "12345"))
sqlCmd.Parameters.Add(New SqlParameter("@c", "12345"))
sqlRet = sqlCmd.ExecuteNonQuery()

Gruß Jo
 

Lesen sie die antworten

#1 Elmar Boye
15/08/2008 - 15:18 | Warnen spam
Hallo Jo,

schrieb:
nachdem ich meinen SQL-Befehl nicht mehr selbst zusammenbastle,
sondern dafür die Parameter von Sqlcommand nehme, fehlt mir für das
Debuggen nun doch der komplette SQL-String.

Oder gibt es etwas, den aus den Parametern erzeugten SQL-Befehl zu
betrachten?



Verwende den SQL Server Profiler, der zeigt Dir den gesendeten Befehl.

Unten wàre das in etwa
sp_executesql N'UPDATE...',
N'@a nvarchar(5), @b nvarchar(5), @c nvarchar(5)'
N'12345', N'12345', N'12345'

Oder gibt es ein Hinweis, bei welchem Parameter ein Fehler vorliegt,
z.B. wenn es heißt 'Inhalt würde abgeschnitten werden' ?



Einen direkten Hinweis erhàlst Du weder bei selbstgebasteltem wie bei
parameterisiertem SQL. Denn der Fehler tritt (wie die meisten) erst
beim SQL Server auf, wenn er erkennt, dass die Daten für die Spalte
zu groß/lang sind.

Und der rückt keine Spalten Informationen dazu raus - was
wiederum bei fast allen Fehlern gilt, die mehrere Spalten
betreffen könn(t)en.

sqlCmd = New SqlCommand("UPDATE TEST set a=@a, b=@b, c=@c", DbConn)
sqlCmd.Parameters.Add(New SqlParameter("@a", "12345"))
sqlCmd.Parameters.Add(New SqlParameter("@b", "12345"))
sqlCmd.Parameters.Add(New SqlParameter("@c", "12345"))



Diese Parameter Erstellung ist seit .NET 2.0 schon obsolet
und sollte durch AddWithValue ersetzt werden.

Wodurch ebenfalls keine Lànge definiert wird, da sie aus der Lànge
der übergebenen Zeichenkette ermittelt wird, und ADO.NET nimmt hier
Unicode an.

Besser ist es die Làngeninformationen für die Spalten bereits im Client
zu prüfen und gar nicht erst bei der Datenbankschnittstelle ankommen
zu lassen.

Bei eigenen Objekten sollte das im Property Set überprüft werden.
Bei einer DataTable kann dies durch die DataColumn MaxLength Eigenschaft
überprüft werden.
Was Dir eine Ausnahme um die Ohren wirft, mit der Du den Anwender
konfrontieren mußt bzw. anderweitig damit umgehen.
(Bei Steuerelementen sollte deswegen MaxLength gesetzt sein,
um solches Ansinnen an der Quelle zu unterbinden)

Gruß Elmar

Ähnliche fragen