Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Vor- und Nachteile der Verwendung von SqlCommand Prepare in C#?

Aus der MSDN-Dokumentation:

"Bevor Sie Prepare aufrufen, geben Sie den Datentyp jedes Parameters in der Anweisung an, die vorbereitet werden soll. Für jeden Parameter, der einen Datentyp mit variabler Länge hat, müssen Sie die Size-Eigenschaft auf die maximal benötigte Größe setzen. Prepare gibt einen Fehler zurück, wenn die Bedingungen nicht erfüllt sind." P>

Wenn Sie nach dem Aufrufen von Prepare eine Execute-Methode aufrufen, wird jeder Parameterwert, der größer als die durch die Size-Eigenschaft angegebenen Werte ist, automatisch auf die ursprünglich angegebene Größe des Parameters gekürzt, und es werden keine Kürzungsfehler zurückgegeben.

Ausgabeparameter (ob vorbereitet oder nicht) müssen einen benutzerdefinierten Datentyp haben. Wenn Sie einen Datentyp mit variabler Länge angeben, müssen Sie auch die maximale Größe angeben."

Außerdem:"Wenn die CommandType-Eigenschaft auf TableDirect gesetzt ist, macht Prepare nichts. Wenn CommandType auf StoredProcedure gesetzt ist, sollte der Aufruf von Prepare erfolgreich sein, ..."

Dies wird im Allgemeinen verwendet, um sicherzustellen, dass der Endbenutzer keine SQL-Injection-Technik verwendet, um Informationen hinzuzufügen oder zu entfernen, die Sie nicht möchten.

Ich habe es mir angesehen und diesen Artikel http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx gelesen. Ihr Problem ist, dass Sie Ihre Parameter definieren müssen, bevor Sie .Prepare() ausführen, und dann Ihre Parameter festlegen, nachdem Sie .Prepare() ausgeführt haben. Im Moment machst du beides vorher. Ich würde so etwas versuchen (Hinweis:Ich habe es nicht getestet, daher könnte meine Syntax etwas abweichen).

public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
    const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni,  @varStopaOdniesienia) AS 'Benchmark'";
    using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
    using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {

        sqlQuery.Parameters.Add("@varPortfelID");
        sqlQuery.Parameters.Add("@varStopaOdniesienia");
        sqlQuery.Parameters.Add("@data");
        sqlQuery.Parameters.Add("@varBenchmarkPoprzedni");

        sqlQuery.Prepare();
        sqlQuery.ExecuteNonQuery();//This might need to be ExecuteReader()

        sqlQuery.Parameters[0].Value = varPortfelID;
        sqlQuery.Parameters[1].Value = varStopaOdniesienia;
        sqlQuery.Parameters[2].Value = data;
        sqlQuery.Parameters[3].Value = varBenchmarkPoprzedni;

        using (var sqlQueryResult = sqlQuery.ExecuteReader())
            if (sqlQueryResult != null) {
                while (sqlQueryResult.Read()) {

                }
            }
    }
}