Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Plusy i minusy używania SqlCommand Prepare w C#?

Z dokumentacji MSDN:

„Zanim wywołasz Przygotuj, określ typ danych każdego parametru w instrukcji, która ma być przygotowana. Dla każdego parametru, który ma typ danych o zmiennej długości, musisz ustawić właściwość Rozmiar na maksymalny wymagany rozmiar. Przygotowanie zwraca błąd, jeśli drugie pozycje nie są spełnione.

Jeśli wywołasz metodę Execute po wywołaniu Prepare, każda wartość parametru, która jest większa niż wartość określona we właściwości Size, jest automatycznie obcinana do pierwotnie określonego rozmiaru parametru i nie są zwracane żadne błędy obcinania.

Parametry wyjściowe (niezależnie od tego, czy zostały przygotowane, czy nie) muszą mieć typ danych określony przez użytkownika. Jeśli określisz typ zmiennej lengthdata, musisz również określićmaksymalny rozmiar."

Ponadto „Jeśli właściwość CommandType jest ustawiona na TableDirect, Prepare nic nie robi. Jeśli CommandType jest ustawione na StoredProcedure, wywołanie Prepare powinno się udać, ...”

Zasadniczo służy to upewnieniu się, że użytkownik końcowy nie używa techniki wstrzykiwania SQL do dodawania lub usuwania z bazy danych informacji, których nie chcesz.

Zajrzałem do tego i przeczytałem ten artykuł http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Twój problem polega na tym, że musisz zdefiniować parametry przed uruchomieniem .Prepare(), a następnie ustawić parametry po uruchomieniu .Prepare(). W tej chwili robisz oba wcześniej. Spróbowałbym czegoś takiego (uwaga:nie testowałem tego, więc moja składnia może być nieco niewłaściwa).

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. Przedstawiamy nową funkcję — raport dotyczący wzrostu bazy danych Spotlight Cloud

  2. SQL Server:Awaria łącza komunikacyjnego Wymagany SSL (nie udało się odebrać pakietu)

  3. Indeksy wielokrotne a indeksy wielokolumnowe

  4. Jak pisać znaki UTF-8 za pomocą wstawiania zbiorczego w programie SQL Server?

  5. Kiedy należy używać średników w SQL Server?