4

O'Leary という名前のように、単一のアポストロフィを受け入れることができる名前フィールドを持つ Web フォームがありますが、このレコードを SQL 2005 サーバーにプッシュしようとすると、エラーが発生します。私の質問はこれではありません。このステートメントを使用してデータベースにレコードを挿入しようとすると...

Dim acctName As String = Replace(txtName.Text, "'", "''")

O''Leary の代わりに O''Leary をデータベースに取得します。SQL は、これらの 2 つの単一アポストロフィを 1 つのアポストロフィとして扱うはずだったと思いましたか???

4

4 に答える 4

5

パラメータ化されたクエリを使用する方がよいでしょう。これらは単一引用符を自動的に処理し、SQL インジェクションからより適切に保護します。

二重の一重引用符を挿入すること (私はそう言ったでしょうか?) は、データをエスケープする方法です。うまくいくはずですが、ベストプラクティスではありません。

より完全な回答については、この記事を参照してください。

http://msdn.microsoft.com/en-us/library/ff648339.aspx

私が提案しているのは、ステップ 3 です。

編集 - 質問をよく読む必要があります

パラメーター化されたクエリまたはストアド プロシージャを既に使用しており、acctName の値をパラメーターの値に設定している場合は、引用符を自分でエスケープする必要はありません。それは自動的に処理されます。

また、Mirosoft Patterns and Practices Database ライブラリなど、いくつかのツールでも処理されます。これには、パラメーター値として使用されるステートメントとオブジェクトの配列を渡すことができるいくつかのコマンドがあり、エスケープも処理します。

いずれかの場合は、値を置き換えるコード行を完全に削除できます。

于 2011-09-19T19:49:48.967 に答える
1

あまり詳細を知らなくてもSET QUOTED_IDENTIFIER、SQL Server の設定を確認することをお勧めします。詳細については、こちらをご覧ください。これが役立つかどうか教えてください。

于 2011-09-19T19:54:07.060 に答える
1

データベースにデータを挿入する方法によって異なります。

動的 SQL を使用して SQL 文字列を自分で作成する場合は、引用符を自分で二重にする必要があります。しかし、パラメータ化されたクエリを使用している場合 (そうあるべきであり、おそらくそうであるように)、エンジンがそれを処理し、自分で引用符を二重にすると、データベースで二重引用符が取得されます。

動的 SQL から始めてパラメーター化されたクエリに切り替えた場合、変更を行った時点でこの問題が突然発生することに注意してください。

于 2011-09-19T19:54:22.427 に答える
0

実際に送信するクエリに大きく依存します。送信する''と、これが保存されます。を2倍にする必要があります'が、他の理由があります(主にセキュリティですが、もちろん構文の有効性もあります)。

クエリの送信に使用するコードを送信してください。

于 2011-09-19T19:50:51.393 に答える