2009-07-14 11 views
8

私は、1つまたは複数の文章の長い文字列を含むデータベースの一部のフィールドを保存および編集しています。テキストボックスに一重引用符を入力して保存する場合は、 のような例外がスローされます。 "lの近くに構文が正しくありません。 文字列 ''の後ろに閉じられていない引用符。 これを回避する方法はありますか?ダイナミックSQLコマンドに引用符を追加する方法は?

EDIT: クエリは次のとおりです。

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

使用しているSQL文を表示してください。 –

+0

**地獄の天使のような別のもので単にエスケープする**地獄の天使に** – TheVillageIdiot

+0

SqlCommand com =新しいSqlCommand( "UPDATE Questions SET Question = '[" + tbQuestion.Text + "]'、Answer = ["+ tbAnswer.Text +"] '、LastEdit =' "+ CurrentUser.Login +" 'WHERE ID =' "+ CurrentQuestion.ID +" '"); –

答えて

11

KMが言ったように、はこれをしないでください!

ドゥ代わりにこの:一部として

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

たくさんの男、あなたはそれを実装しました。 u rock;) –

+1

+1のパラメータ化 – booyaa

3

は、あなたのフィールド編集を行うと、値を保存するためにSQLパラメータを使用するために保存されたprodureを書きます。引用は重要ではありません。ストアドプロシージャが少なくともパラメータマーカを持つSQLテキストを構築し、そのSQLパラメータを使用する必要がない場合は、

6

あなたは、SQLフィールドに単一引用符が含まれる。これは、SQL Serverの単一引用符

'''Test''' = 'Text' 

を使用して、それをエスケープします。 MSSQLで

+3

パラメータ化されたSQLを使用するほうがはるかに安全です。 – LukeH

+0

ルーク:そうだけど、ここに座って彼が現在SQLをやっているところを推測しようとはしないので、私は最も簡単な答えを出すつもりです。 – TheTXI

+0

@TheTXI:十分に公正ですが、彼はSQLをやっていますが、確かに彼はパラメータを使用していません。パラメータを使用すると、この問題は完全に回避されます。 – LukeH

1

あなたの引用符を倍増することができます

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

しかし、問題は私がユーザーから別の見積もりを追加するように伝えるのはうれしくないので、ユーザーからの入力が得られるということです –

1

あなたが使用しているデータベースやアプリケーションの言語の一覧を表示していないので、あなたに特定の答えを与えることは困難です。

SQLを動的に構築する必要があります。スティング内の見積もりは、文字列の末尾として解釈されています。使用しているデータベースによっては、sqlコマンドで使用する各文字列内の一重引用符をエスケープする必要があります。これは、実行しようとする前に照会を印刷することで確認できます。

あなたがからデータベースを呼び出しているアプリケーションについては言及しませんが、あなたが構築するとき、あなたはあなたの言語で提供されている場合、あなたが書いたりFIX_QUOTES()コマンドを使用する必要があるコマンド:

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 

sql injection attackの場合、このタイプの動的クエリは非常に簡単です。ストアドプロシージャまたはパラメータリストを使用してデータベースを呼び出すことをお勧めします。

0

はすでにトリックを行います余分な引用符を追加する、と述べています。私はこれがOracleの場合もそうであることを確認することができます(他の人がこの回答をMSSQLとSQL Serverに有効としています)。私は、ストアドプロシージャを使用することはこれに対して過労であると思います。

+0

パラメータ化されたクエリの使用はどうですか? –

+0

はい、そうすることができます。 .NET API経由ではなく、SQLを直接実行する場合は、二重引用符を使用する必要があります。 – awe

関連する問題