Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Pro e contro dell'utilizzo di SqlCommand Prepare in C#?

Dalla documentazione MSDN:

"Prima di chiamare Prepare, specificare il tipo di dati di ciascun parametro nell'istruzione da preparare. Per ogni parametro che ha un tipo di dati di lunghezza variabile, è necessario impostare Sizeproprietà sulla dimensione massima necessaria.Prepare restituisce un errore se queste condizioni non sono soddisfatte.

Se chiami un metodo Execute dopo aver chiamato Prepare, qualsiasi valore di parametro maggiore dei valori specificati dalla proprietà Size viene automaticamente troncato alla dimensione originale specificata del parametro e non vengono restituiti errori di troncamento.

I parametri di output (preparati o meno) devono avere un tipo di dati specificato dall'utente. Se specifichi un tipo di dati a lunghezza variabile, devi specificare anche la Dimensione massima."

Inoltre, "Se CommandTypeproperty è impostata su TableDirect,Prepare non fa nulla. Se CommandTypeè impostato su StoredProcedure, la chiamata aPrepare dovrebbe riuscire,..."

Questo in generale viene utilizzato per assicurarsi che l'utente finale non stia utilizzando una tecnica di SQL Injection per aggiungere o rimuovere dal database informazioni che non desideri anche loro.

L'ho esaminato e ho controllato questo articolo http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Il tuo problema è che devi definire i tuoi parametri prima di eseguire .Prepare() e quindi impostare i parametri dopo aver eseguito .Prepare(). In questo momento stai facendo entrambe le cose prima. Proverei qualcosa del genere (nota che non l'ho testato, quindi la mia sintassi potrebbe essere un po' storta).

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()) {

                }
            }
    }
}