8

1 つまたは複数の文の長い文字列を含むフィールドをデータベースに保存して編集しています。テキストボックスに一重引用符を入力して保存しようとすると、 「'l' 付近の構文が正しくありません。文字列 '' の後に引用符が閉じられていません。」のような例外がスローされます。 それを避けるためのアイデアはありますか?

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

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

6 に答える 6

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();
        }
    }
}
于 2009-07-14T12:40:28.467 に答える
8

SQL フィールドに一重引用符を含めたい場合は、一重引用符を使用してエスケープします

'''Test''' = 'Text'

これは SQL Server 用です。

于 2009-07-14T11:12:46.893 に答える
3

フィールドの編集を行うストアド プロシージャを記述し、SQL パラメータを使用して値を保存します。引用符は関係ありません。ストアド プロシージャが必要ない場合は、少なくともパラメーター マーカーを使用して SQL テキストを作成し、それで SQL パラメーターを使用します。

于 2009-07-14T11:12:26.973 に答える
2

使用しているデータベースまたはアプリケーション言語をリストしていないため、具体的な回答を提供することは困難です。

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 インジェクション攻撃に対して非常に簡単です。ストアド プロシージャまたはパラメーター リストを使用してデータベースを呼び出すことをお勧めします。

于 2009-07-14T12:18:29.663 に答える
1

MSSQL では、引用符を 2 倍にすることができます。

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''
于 2009-07-14T11:13:44.990 に答える