Was ist vorbereitete Version des SQL Befehls oder warum zeigt SQL Profiler keine Abfragen

betrifft: C# csharp MS SQL

SQL Profiler in SQL Server Management Studio lässt alle Abfragen  beobachten, die im Hintergrund der Applikation laufen. Das bringt Vorteile für Entwickler beim Debugging eigener Software und hilft Prozesse der fremden Software zu verstehen. Der Nachteil ist, dass solche Befehle von der Injektion nicht geschützt sind. Abhilfe schafft vorbereiteten Befehl. Die unterschied besteht darin, dass die Parameter nicht sofort übergeben werden, sondern werden vom System zuerst geprüft.

Hier ist Codebeispiel auf c#

using System;

 

using System.Collections.Generic;

 

using System.Data;

 

using System.Data.SqlClient;

 

using System.Linq;

 

using System.Text;

 

using System.Threading.Tasks;

 

 

namespace ConsoleApplication1

 

{

 


classProgram

 


{

 


privatestaticstring connStr = „Here should You writ Your
ConnectionString“
;

 


staticvoid Main(string[] args)

 


{

 


SqlCommandPrepare(connStr);

 


}

 

 

 


privatestaticvoid SqlCommandPrepare(string connStr)

 


{

 


using (SqlConnection
conn =
newSqlConnection(connStr))

 


{

 


conn.Open();

 


SqlCommand comm = newSqlCommand(null, conn);

 


comm.CommandText =
„INSERT INTO myTable (ID, myFied) VALUES (@ID, @myField)“;

 


SqlParameter ID = newSqlParameter(„@ID“, SqlDbType.Int, 0);

 


SqlParameter myField = newSqlParameter(„@myField“, SqlDbType.Text,
512);

 


ID.Value = 5;

 


myField.Value =
„Test“;

 


comm.Parameters.Add(ID);

 


comm.Parameters.Add(myField);

 


comm.Prepare();

 


comm.ExecuteNonQuery();

 


}

 


}

 


}

 

}

Wenn man Ablauf im SQL Manager beobachtet, dann sieht man
SQL Befehl

INSERT INTO myTable (ID, myFied) VALUES (@ID, @myField)

 


nicht.

Stattdessen wird  angezeigt

EXECsp_execute10, 5,‚Test‘

In den Moment ist der Befehl schon vorbereitet. Den kann

man sehen, wenn man (unter Sql Server 2008 und höher) folgende Abfrage ausführt

selecttext

 

fromsys.dm_exec_requests

 

crossapplysys.dm_exec_sql_text(plan_handle)

 

where session_id = 10

Wobei 10 ist SPID von Profiler, 5 und „Test“ unsere Parameterwerte.

Wie kann man den Befehl anzeigen lassen?

Dafür muss man im Profiler unter Event StoredProcedure;CacheHit, sowie SQL:StmtCompleted
und RPC:Completed
häkchen setzen.

 

Und nun sollte unser
vorgebereiteter Befehl sichtbar sein.