sql >> Base de Datos >  >> RDS >> Sqlserver

¿Pros y contras de usar SqlCommand Prepare en C#?

De la documentación de MSDN:

"Antes de llamar a Prepare, especifique el tipo de datos de cada parámetro en la instrucción que se va a preparar. Para cada parámetro que tenga un tipo de datos de longitud variable, debe establecer la propiedad Size en el tamaño máximo necesario. Prepare devuelve un error si no se cumplen estas condiciones.

Si llama a un método Execute después de llamar a Prepare, cualquier valor de parámetro que sea mayor que el valor especificado por la propiedad Size se trunca automáticamente al tamaño original especificado del parámetro y no se devuelven errores de truncamiento.

Los parámetros de salida (preparados o no) deben tener un tipo de datos especificado por el usuario. Si especifica un tipo de datos de longitud variable, también debe especificar el tamaño máximo".

Además, "Si la propiedad CommandType está establecida en TableDirect,Prepare no hace nada. Si CommandType está establecido en StoredProcedure, la llamada aPrepare debería tener éxito..."

En general, esto se usa para asegurarse de que el usuario final no esté usando una técnica de inyección de SQL para agregar o eliminar información que no desea de la base de datos.

Lo investigué y revisé este artículo http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Su problema es que necesita definir sus parámetros antes de ejecutar .Prepare() y luego establecer sus parámetros después de ejecutar .Prepare(). Ahora mismo estás haciendo las dos cosas antes. Intentaría algo como esto (Tenga en cuenta que no lo probé, por lo que mi sintaxis podría estar un poco mal).

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

                }
            }
    }
}