Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Prós e contras de usar o SqlCommand Prepare em C #?


Da documentação do MSDN:

"Antes de chamar Prepare, especifique o tipo de dado de cada parâmetro na instrução a ser preparada. Para cada parâmetro que tem um tipo de dado de comprimento variável, você deve definir a propriedade Size para o tamanho máximo necessário. Prepare retorna um erro se essas condições não forem atendidas.

Se você chamar um método Execute após chamar Prepare, qualquer valor de parâmetro que seja maior que o valor especificado pela propriedade Size será truncado automaticamente para o tamanho original especificado do parâmetro e nenhum erro de truncamento será retornado.

Os parâmetros de saída (preparados ou não) devem ter um tipo de dados especificado pelo usuário. Se você especificar um tipo de dados de comprimento variável, também deverá especificar o tamanho máximo."

Além disso, "Se a propriedade CommandType estiver definida como TableDirect, o Prepare não fará nada. Se CommandType estiver definido como StoredProcedure, a chamada paraPrepare deverá ser bem-sucedida, ..."

Isso em geral é usado para garantir que o usuário final não esteja usando uma técnica de SQL Injection para adicionar ou remover informações que você não deseja também do banco de dados.

Eu olhei para ele e confira este artigo http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Seu problema é que você precisa definir seus parâmetros antes de executar .Prepare() e, em seguida, definir seus parâmetros depois de executar .Prepare(). Agora você está fazendo as duas coisas antes. Eu tentaria algo assim (Observe que não testei, então minha sintaxe pode estar um pouco errada).
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()) {

                }
            }
    }
}