sql >> Databasteknik >  >> RDS >> Sqlserver

För- och nackdelar med att använda SqlCommand Prepare i C#?

Från MSDN-dokumentationen:

"Innan du anropar Prepare, ange datatypen för varje parameter i satsen som ska förberedas. För varje parameter som har en datatyp med variabel längd måste du ställa in Sizeproperty till den maximala storleken som behövs. Prepare returnerar ett fel om dessa villkor inte uppfylls.

Om du anropar en Execute-metod efter anropet Prepare, trunkeras alla parametervärden som är större än värdet som specificeras av Size-egenskapen automatiskt till den ursprungliga specificerade storleken på parametern, och inga trunkeringsfel returneras.

Utdataparametrar (oavsett om de är förberedda eller inte) måste ha en användarspecificerad datatyp. Om du anger en datatyp med variabel längd måste du också ange den maximala storleken."

Dessutom, "Om CommandType-egenskapen är inställd på TableDirect, gör Prepare ingenting. Om CommandType är satt till StoredProcedure, bör anropet toPrepare lyckas, ..."

Detta används i allmänhet för att säkerställa att slutanvändaren inte använder en SQL Injection-teknik för att lägga till eller ta bort information som du inte vill ha dem från databasen.

Jag tittade på det och kolla in den här artikeln http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Ditt problem är att du måste definiera dina parametrar innan du kör .Prepare() och sedan ställa in dina parametrar efter att du kört .Prepare(). Just nu gör du båda tidigare. Jag skulle prova något sånt här (Observera att jag inte testade det så min syntax kan vara lite fel).

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. SQL 'LIKE'-fråga med '%' där sökkriteriet innehåller '%'

  2. Kontrollera och optimera MySQL-databasen automatiskt med Crontab/Cron

  3. få senaste tre månaders poster från tabellen

  4. Uppdatera ett jobbsteg för ett SQL Server Agent Job (T-SQL)