Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Avantages et inconvénients de l'utilisation de SqlCommand Prepare en C# ?

À partir de la documentation MSDN :

"Avant d'appeler Prepare, spécifiez le type de données de chaque paramètre dans l'instruction à préparer. Pour chaque paramètre qui a un type de données de longueur variable, vous devez définir la propriété Size sur la taille maximale nécessaire. Prepare renvoie une erreur si ces conditions ne sont pas remplies.

Si vous appelez une méthode Execute après avoir appelé Prepare, toute valeur de paramètre supérieure à la valeur spécifiée par la propriété Size est automatiquement tronquée à la taille d'origine spécifiée du paramètre et aucune erreur de troncation n'est renvoyée.

Les paramètres de sortie (préparés ou non) doivent avoir un type de données spécifié par l'utilisateur. Si vous spécifiez un type de données de longueur variable, vous devez également spécifier la Taille maximale."

De plus, "Si la propriété CommandType est définie sur TableDirect,Prepare ne fait rien. Si CommandTypeest défini sur StoredProcedure, l'appel àPrepare devrait réussir, ..."

Ceci est généralement utilisé pour s'assurer que l'utilisateur final n'utilise pas une technique d'injection SQL pour ajouter ou supprimer des informations que vous ne voulez pas non plus de la base de données.

Je l'ai examiné et j'ai consulté cet article http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Votre problème est que vous devez définir vos paramètres avant d'exécuter .Prepare(), puis définir vos paramètres après avoir exécuté .Prepare(). En ce moment, vous faisiez les deux auparavant. J'essaierais quelque chose comme ça (Notez que je ne l'ai pas testé, donc ma syntaxe pourrait être un peu erronée).

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

                }
            }
    }
}