sql >> Database >  >> RDS >> Sqlserver

Voor- en nadelen van het gebruik van SqlCommand Prepare in C#?

Uit de MSDN-documentatie:

"Voordat u Prepare aanroept, specificeert u het gegevenstype van elke parameter in de instructie die moet worden voorbereid. Voor elke parameter die een gegevenstype met variabele lengte heeft, moet u de eigenschap Grootte instellen op de maximale benodigde grootte. Prepare retourneert een fout als niet aan deze voorwaarden wordt voldaan.

Als u een Execute-methode aanroept nadat u Prepare heeft aangeroepen, wordt elke parameterwaarde die groter is dan de waarde die is opgegeven door de eigenschap Size, automatisch afgekapt tot de oorspronkelijke opgegeven grootte van de parameter en worden er geen afkapfouten geretourneerd.

Uitvoerparameters (al dan niet voorbereid) moeten een door de gebruiker gespecificeerd gegevenstype hebben. Als u een gegevenstype met variabele lengte opgeeft, moet u ook de maximale Grootte opgeven."

Verder:"Als de eigenschap CommandType is ingesteld op TableDirect, doet Prepare niets. Als CommandType is ingesteld op StoredProcedure, zou de aanroep van Prepare moeten slagen, ..."

Dit wordt in het algemeen gebruikt om ervoor te zorgen dat de eindgebruiker geen SQL-injectietechniek gebruikt om informatie toe te voegen of te verwijderen die u niet wilt, uit de database.

Ik heb er naar gekeken en bekijk dit artikel http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Uw probleem is dat u uw parameters moet definiëren voordat u .Prepare() uitvoert en vervolgens uw parameters instelt nadat u .Prepare() uitvoert. Op dit moment doe je beide eerder. Ik zou zoiets proberen (let op:ik heb het niet getest, dus mijn syntaxis kan een beetje afwijkend zijn).

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. Bereken percentiel in MySQL op basis van totalen

  2. PostgreSQL-fout bij het maken van een extensie

  3. Plan Explorer 3.0 Webinar – Voorbeelden en vragen en antwoorden

  4. Hoe grote tabelgegevens in SQL verwijderen zonder logboek?