Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Плюсове и минуси на използването на SqlCommand Prepare в C#?

От документацията на MSDN:

„Преди да извикате Prepare, посочете типа данни на всеки параметър в инструкцията, която трябва да се подготви. За всеки параметър, който има тип данни с променлива дължина, трябва да зададете Sizeproperty на максималния необходимия размер. Prepare връща грешка, ако тези условия не са изпълнени.

Ако извикате метод Execute след извикване на Prepare, всяка стойност на параметъра, която е по-голяма от стойността, определена от свойството Size, автоматично се съкращава до първоначалния посочен размер на параметъра и не се връщат грешки при съкращаване.

Изходните параметри (независимо дали са подготвени или не) трябва да имат зададен от потребителя тип данни. Ако посочите тип данни с променлива дължина, трябва да посочите и максималния размер."

Освен това, "Ако CommandTypeproperty е настроен на TableDirect, Prepare не прави нищо. Ако CommandType е зададен на StoredProcedure, извикването наPrepare трябва да успее, ..."

Това като цяло се използва, за да се гарантира, че крайният потребител не използва техника на SQL инжектиране за добавяне или премахване на информация, която не желаете и от базата данни.

Разгледах го и разгледах тази статия http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Вашият проблем е, че трябва да дефинирате параметрите си, преди да стартирате .Prepare() и след това да зададете параметрите си, след като стартирате .Prepare(). В момента правите и двете преди. Бих опитал нещо подобно (обърнете внимание, че не съм го тествал, така че синтаксисът ми може да е малко неправилен).

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

                }
            }
    }
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ръководство за CTE в SQL Server

  2. Как да възстановите база данни от C#

  3. Поправете „Грешка при аритметично препълване при преобразуване на int в числови тип данни“ в SQL Server

  4. Как да активирате/деактивирате достъпа до данни в SQL Server (пример за T-SQL)

  5. SQL транспониране на пълната таблица