sql >> Database teknologi >  >> RDS >> Sqlserver

Fordele og ulemper ved at bruge SqlCommand Prepare i C#?

Fra MSDN-dokumentationen:

"Før du kalder Forbered, skal du angive datatypen for hver parameter i sætningen, der skal forberedes. For hver parameter, der har en datatype med variabel længde, skal du indstille størrelsesegenskaben til den maksimale nødvendige størrelse. Forbered returnerer en fejl, hvis disse betingelser ikke er opfyldt.

Hvis du kalder en Execute-metode efter at have kaldt Prepare, afkortes enhver parameterværdi, der er større end værdien angivet af Size-egenskaben, automatisk til den oprindelige specificerede størrelse af parameteren, og der returneres ingen trunkeringsfejl.

Outputparametre (uanset om de er forberedt eller ej) skal have en brugerspecificeret datatype. Hvis du angiver en datatype med variabel længde, skal du også angive den maksimale størrelse."

Ydermere, "Hvis CommandType-egenskaben er indstillet til TableDirect, gør Prepare intet. Hvis CommandType er indstillet til StoredProcedure, skulle opkaldet toPrepare lykkes, ..."

Dette bruges generelt til at sikre, at slutbrugeren ikke bruger en SQL Injection-teknik til at tilføje eller fjerne information, som du ikke også vil have dem fra databasen.

Jeg kiggede på det og tjek denne artikel http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Dit problem er, at du skal definere dine parametre, før du kører .Prepare() og derefter indstille dine parametre, efter du har kørt .Prepare(). Lige nu gør du begge dele før. Jeg ville prøve noget som dette (Bemærk, at jeg ikke testede det, så min syntaks kan være lidt forkert).

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. Oracle SQL Developer - Sådan gendannes tabt tabel

  2. Vil du slette en enkelt post fra Entity Framework?

  3. Tilføj en databasemailkonto til en profil (T-SQL)

  4. Sådan fungerer logins på sammenkædede servere (T-SQL-eksempler)