2009-07-14 2 views
8

Ich speichere und bearbeite ein Feld in einer Datenbank mit einer langen Folge von einem oder mehreren Sätzen. Wenn ich ein einzelnes Anführungszeichen in das Textfeld einfüge und es speichern möchte, löst es eine Ausnahme wie aus "Falsche Syntax in der Nähe von 'l'. Nicht geschlossenes Anführungszeichen nach der Zeichenfolge ''." Gibt es eine Idee, das zu vermeiden?So fügen Sie einem dynamischen SQL-Befehl Zitate hinzu?

EDIT: Die Abfrage ist:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + 
    tbQuestion.Text + "]', Answer = '[" + 
    tbAnswer.Text + "]', LastEdit = '" + 
    CurrentUser.Login + 
    "'WHERE ID = '" + CurrentQuestion.ID + "'"); 
+0

Bitte zeigen Sie die von Ihnen verwendete SQL-Anweisung an. –

+0

einfach entkommen 'mit einem anderen' wie * Hell's Angels * zu ** Hell's Angels ** – TheVillageIdiot

+0

SqlCommand com = neue SqlCommand ("UPDATE Fragen SET Question = '[" + tbQuestion.Text + "]', Answer = ' ["+ tbAntwort.Text +"] ', LastEdit =' "+ CurrentUser.Login + '' WHERE ID = '" + CurrentQuestion.ID +' '"); –

Antwort

11

Wie KM sagte, tun Sie dies nicht!

Do diese statt:

private static void UpdateQuestionByID(
    int questionID, string question, string answer, string lastEdited) 
{ 
    using (var conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     const string QUERY = 
      @"UPDATE Questions " + 
      @"SET Question = @Question, Answer = @Answer, LastEdit = @LastEdited " + 
      @"WHERE ID = @QuestionID"; 
     using (var cmd = new SqlCommand(QUERY, conn)) 
     { 
      cmd.Parameters.AddWithValue("@Question", question); 
      cmd.Parameters.AddWithValue("@Answer", answer); 
      cmd.Parameters.AddWithValue("@LastEdited", lastEdited); 
      cmd.Parameters.AddWithValue("@QuestionID", questionID); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 
+0

thx viel Mann, du hast es sogar implementiert. u rock;) –

+1

+1 zur Parametrierung – booyaa

3

eine gespeicherte produre Schreiben Sie Feld Bearbeitung zu tun und SQL-Parameter zu verwenden, um den Wert zu speichern. Zitate spielen keine Rolle. Wenn Sie nicht möchten, dass ein Stored Proc mindestens Ihren SQL-Text mit Parametermarkern erstellt, verwenden Sie dazu SQL-Parameter.

6

Wenn Sie einen Apostroph in eine SQL-Feld enthalten sein sollen, entkommen sie Apostrophe

'''Test''' = 'Text' 

mit diesem für SQL Server ist.

+3

Es wäre viel sicherer, stattdessen parametrisiertes SQL zu verwenden. – LukeH

+0

Luke: Sicher würde es, aber ich werde nicht hier sitzen und versuchen zu erraten, wie er gerade seinen SQL macht, also werde ich die einfachste Antwort geben. – TheTXI

+0

@TheTXI: Fair genug, aber wie auch immer er sein SQL macht, ist die eine Sache, die sicher ist, dass er Parameter nicht verwendet. Die Verwendung von Parametern würde dieses Problem vollständig vermeiden. – LukeH

1

In MSSQL können Sie Ihre Angebote verdoppeln:

my dodg'y test   -> 'my dodg''y test' 
my 'quoted' string  -> 'my ''quoted string''' 
'first and last quotes' -> '''first and last quotes''' 
+0

aber das Problem ist, dass ich die Eingabe vom Benutzer bekomme, so ist es nicht nett zu sagen, dass der Benutzer ein weiteres Zitat hinzufügen –

1

es schwierig ist, Ihnen eine konkrete Antwort zu geben, weil Sie die Datenbank oder Applikationssprache nicht tun Liste Sie verwenden.

Sie müssen Ihr SQL dynamisch erstellen, und das Zitat innerhalb des Stems wird als das Ende der Zeichenfolge interpretiert. Abhängig von der verwendeten Datenbank müssen Sie die einfachen Anführungszeichen innerhalb jeder Zeichenfolge, die Sie in Ihrem SQL-Befehl verwenden möchten, umgehen. Dies kann durch Drucken der Abfrage angezeigt werden, bevor Sie versuchen, sie auszuführen.

Sie die Anwendung nicht erwähnen, dass Sie die Datenbank aus anrufen, aber wenn Sie bauen Sie Sie benötigen Befehl ein FIX_QUOTES() Befehl verwenden, die Sie schreiben oder von Ihrer Sprache zur Verfügung gestellt, wenn:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + FIX_QUOTES(tbQuestion.Text) + "]', Answer = '[" + FIX_QUOTES(tbAnswer.Text) + "]', LastEdit = '" + FIX_QUOTES(CurrentUser.Login) + "'WHERE ID = '" + FIX_QUOTES(CurrentQuestion.ID) + "'"); – A 

Diese Art der dynamischen Abfrage ist sehr einfach für eine sql injection attack. Ich würde empfehlen, die Datenbank mit einer gespeicherten Prozedur oder mit einer Parameterliste aufzurufen.

0

Wie einige haben bereits gesagt, ein zusätzliches Angebot Hinzufügen wird es tun. Ich kann bestätigen, dass dies auch für Oracle der Fall ist (andere haben diese Antwort als gültig für MSSQL und SQL Server angegeben). Ich denke, dass die Verwendung von gespeicherten Prozeduren dafür zu viel ist.

+0

Wie wäre es mit einer parametrisierten Abfrage? –

+0

Ja, das kannst du tun. Die doppelte Zitatlösung muss verwendet werden, wenn Sie sql direkt und nicht über die .NET API ausführen. – awe