sql >> Databáze >  >> RDS >> Sqlserver

Výhody a nevýhody používání SqlCommand Prepare v C#?

Z dokumentace MSDN:

"Než zavoláte Prepare, specifikujte datový typ každého parametru v příkazu, který se má připravit. Pro každý parametr, který má datový typ proměnné délky, musíte nastavit Sizeproperty na maximální potřebnou velikost. Prepare vrátí chybu, pokud tyto podmínky nejsou splněny.

Pokud po volání metody Prepare zavoláte metodu Execute, jakákoli hodnota parametru, která je větší než hodnota určená vlastností Size, se automaticky zkrátí na původní zadanou velikost parametru a nebudou vráceny žádné chyby zkrácení.

Výstupní parametry (ať už připravené nebo ne) musí mít uživatelsky specifikovaný datový typ. Pokud zadáte typ dat proměnné délky, musíte také zadat maximální velikost."

Dále:"Pokud je vlastnost CommandType nastavena na TableDirect, Prepare nedělá nic. Pokud je CommandType nastaven na StoredProcedure, volání funkce Prepare by mělo být úspěšné, ..."

To se obecně používá k zajištění toho, že koncový uživatel nepoužívá techniku ​​SQL Injection k přidávání nebo odstraňování informací, které z databáze také nechcete.

Podíval jsem se na to a podívejte se na tento článek http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Váš problém je, že musíte definovat parametry před spuštěním .Prepare() a poté nastavit parametry po spuštění .Prepare(). Právě teď děláte obojí předtím. Zkusil bych něco takového (Poznámka:Netestoval jsem to, takže moje syntaxe může být trochu mimo).

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. Jak mám předat název tabulky do uloženého procesu?

  2. Chybí rozšíření mysqli, nefunguje phpmyadmin

  3. Výpočet kumulativního součtu v PostgreSQL

  4. Jak upgradovat MariaDB 5.5 na MariaDB 10.1 na systémech CentOS/RHEL 7 a Debian