2016-08-09 4 views
0

Ich brauche Hilfe, ich habe ein Problem beim Einfügen einer Anweisung in SQL. Ich rufe eine SQL-Anweisung von meinem ASP.NET-Programm, einige Variablen enthalten Anführungszeichen, also wenn die Einfügung ausgelöst wird, habe ich eine Ausnahme wie:Wie fügt man eine Anweisung in SQL mit einer Variablen ein, die Zitate aus einer in C# abgefeuerten Prozedur enthält?

Ausnahmedetails: System.Data.SqlClient.SqlException: Falsche Syntax in der Nähe von 'xxxxx' . Nicht geschlossenes Anführungszeichen nach der Zeichenfolge ''.

ich den Inhalt meiner Variable

nicht wollen, geändert ...

Jede Idee, wie sich dies umgehen?

Der C# Teil:

 SqlCommand cmdInsertAssessment = new SqlCommand("xxxxxxx", sqlCnx); 

     cmdInsertAssessment.CommandType = CommandType.StoredProcedure; 
     cmdInsertAssessment.Parameters.AddWithValue("@templateID", templateID); 
     cmdInsertAssessment.Parameters.AddWithValue("@companyID", companyID); 
     cmdInsertAssessment.Parameters.AddWithValue("@userID",userID); 
     cmdInsertAssessment.Parameters.AddWithValue("@opn",opn); 
     cmdInsertAssessment.Parameters.AddWithValue("@mn",Mm); 
     cmdInsertAssessment.Parameters.AddWithValue("@max",max); 
     cmdInsertAssessment.Parameters.AddWithValue("@remarque",remarque); 
     cmdInsertAssessment.Parameters.AddWithValue("@templateTheme",templateTheme); 
     cmdInsertAssessment.Parameters.AddWithValue("@name", sName); 
     cmdInsertAssessment.Parameters.AddWithValue("@finished", iFinished); 
     cmdInsertAssessment.Parameters.AddWithValue("@datenow", dtNow); 
     try 
     { 
      cmdInsertAssessment.ExecuteNonQuery(); 
     } 
     catch (Exception e) 
     { 

     } 

SQL Teil:

CREATE PROCEDURE ["xxxxxxx"] @templateID int, 
@companyID int, 
@userID int, 
@opn nvarchar(255), 
@mn nvarchar(255), 
@max int, 
@remarque nvarchar(255), 
@templateTheme nvarchar(255), 
@name nvarchar(255), 
@finished int, 
@datenow datetime 

AS 
BEGIN 
DECLARE 
@points AS FLOAT 
SET @points=0 

IF(@mn='M') 
    BEGIN 
     IF(@opn='O') 
     BEGIN 
      SET @points=10 
     END 
     IF(@opn='P') 
     BEGIN 
      SET @points=2 
     END 
    END 

IF(@mn!='M') 
    BEGIN 
     IF(@opn='O') 
     BEGIN 
      SET @points=2 
     END 
     if(@opn='P') 
     BEGIN 
      SET @points=1 
     END 
    END 
IF(@remarque=NULL) 
    BEGIN 
     SET @remarque='nothing' 
    END 

MERGE INTO [dbo].[Assessment] as target 
USING (SELECT   @templateID,@companyID,@userID,@opn,@points,@max,@remarque,@templateTheme,@datenow,@name,@finished) 
As source (_templateID,_companyID,_userID,_opn,_points,_max,_remarque,_templateTheme,_datenow,_name,_finished) 
ON target.TemplateID=source._templateID 
AND target.TemplateTheme=source._templateTheme 
AND target.NameAssessment=source._name 
WHEN MATCHED THEN 
UPDATE SET Points = source._points, Remarque = source._remarque, FillDate= source._datenow, Finished = source._finished, OPN = source._opn 
WHEN NOT MATCHED THEN 
INSERT (TemplateID, CompanyID, UserID, OPN, Points, Max, Remarque, TemplateTheme, FillDate, NameAssessment,Finished) 
VALUES (source._templateID,source._companyID,source._userID,source._opn,source._points,source._max,source._remarque,source._templateTheme,source._datenow,source._name,source._finished); 


END 




GO 

Thanks :)

+6

Parameter verwenden, nicht verketten. Vorsicht vor SQL Injection. Überprüfen Sie MSDN Beispiel: https://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.110).aspx –

+0

Müssen in einer Prozedur aufgerufen werden, weil ich die Werte vor der Einfügung, wie a Trigger –

+1

Sie haben gerade Sql Injektion emuliert – Serg

Antwort

-1

Da Sie sagten, Sie gespeicherte Prozeduren

using (SqlConnection cnn = new SqlConnection(/*Connection String*/)) 
{ 
    using (SqlCommand cmd = new SqlCommand("MyStoredProcedure", cnn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@param1", "Value 1"); 
     cmd.Parameters.AddWithValue("@param2", "xxxxxx"); 

     cnn.Open(); 
    } 
} 
+0

thx! aber das ist genau was ich tue, aber wenn ein Wert eines Parameters hat Anführungszeichen habe ich eine Ausnahme (Werte sind variabel) –

+0

Sie müssen den Code Ihrer gespeicherten Prozeduren und die C# in Ihrer Frage –

+0

@RonaldinhoLearnCoding bearbeitet werden!:) –

0

Die Dinge verwenden wollte von dem Anfang! Ihre Prozedur berechnet basierend auf den von Ihnen bereitgestellten Parametern (@mn, @opn) eine Anzahl von Punkten und fügt dann die Tabelle Assessment ein oder aktualisiert sie. Das erste, was zu sagen ist, dass dies not a job for Merge ist. Merge soll an zwei Tischen arbeiten, und für eine Reihe und einen Tisch benutzt man einen Vorschlaghammer, um eine Nuss zu knacken. Sie sollten wirklich verwenden

IF EXISTS(SELECT ID FROM ASSESSMENT WHERE...) 

dann schreiben Sie einen klassischen Einsatz und ein klassisches Update. Ihr Verfahren wird einfacher zu verstehen, zu warten und wahrscheinlich schneller ausgeführt.

Wenn Sie noch lesen, werde ich weitermachen. Die Berechnung von Punkten, Geschäftslogik, die nichts aus der DB nutzt, wird im C# viel glücklicher sein. Wo immer Sie es verwenden, können Sie ternäre Operatoren verwenden, um diese Entweder-Oder-Auswahl zu verkürzen. Der folgende Code ersetzt 20 Zeilen in Ihrer Prozedur.

var points = (mn == 'm')?(opn == 'O'?10:2):(opn == 'O'?2:1); 

Die Zuordnung beginnend IF (@remarque = null) kann mit einem Null-Koaleszenz-Operator ISNULL() in SQL durchgeführt werden, ?? in C#.

Und wenn Sie noch immer lesen, greifen Sie nach QueryFirst. Sie erhalten eine v.clean Trennung zwischen SQL und C# und alle Ihre Parameter werden für Sie erstellt.

+0

thx iu = habe etwas anderes benutzt, aber ich behalte deinen Rat in meinen Gedanken –

Verwandte Themen