HOW TO: IN 句の値の一覧で SqlParameter を使用するための実装 ヘルパ クラス

文書翻訳 文書翻訳
文書番号: 555167 - 対象製品
著者?William Ryan MVP
すべて展開する | すべて折りたたむ

現象

複数の IN ステートメント に一覧を使用する SQL ステートメントまたはプロシージャに区切り記号で区切られる値を渡そうとして、このシングルとして一覧に渡します。 SqlParameter.

原因

これは原因で機能が実際発生します。?ADO.NET それがパラメータは、まず使用するのが有益行って一度、挿入された値をエスケープする一度、 1 リテラルとして渡す。 したがって SomeValue @設定する、画面使用し、そして*[TableName から、][ColumnName]IN @ SomeValue一致しない場合、1,2,3,4,5=、 正確単位の値と1,2,3,4,5代わりに一致のみします。 これがプロシージャである場合、そうだ。
<コード>
CREATE PROCEDURE up_ProcedureHelper
???? または トークン AS VARCHAR(50)@、すべての長さが必要です。
A
*[TableName から、]選択します。
(トークン@)[FieldName] IN 場所。
</CODE>
このコードには、失敗します。
<コード>
C の文字列です。=ConfigurationSettings.AppSettings("ConnectString"))
Using(SqlConnection cn = new SqlConnection(cs)){)
????? SqlCommand cmd;=新しい SqlCommand(up_ProcedureHelper ConnectionName)
????? cmd.CommandType;= CommandType.StoredProcedure
????? cmd.Parameters.Add("@token","1,2,3,4,5);
????? cn.Open ()と Connection.Open //In 現実と ExecuteReader が Try/Catch/Finally に入れられる必要があります。
????? dr;=cmd.ExecuteReader(CommandBehavior.CloseConnection)????
????? //Fails ; ColumnName が整数フィールドで、そして「1,2,3,4,5」を保有しないので、 Debug.Assert(dr.HasRows「我我必要いる行のにする」)

}。</CODE>

解決方法

新しい方法論を可能にするために、プロシージャを変更します。
? 一時、 Sql サーバー 2000 の一時的なテーブル ユーザー機能を使って、テーブルを作成するのがこの問題が解決するのが簡単な方法です。 指定された区切り記号で区切られる渡した変数を通じて解析するために、単純なループを使用します。 ループの各パスで、一時的なテーブルに各変数を挿入します。 類似句の値と一致するよう、サブクエリを最後に使用します。
<コード>
CREATE PROCEDURE up_ProcedureHelper
???? または トークン AS VARCHAR(50)@、すべての長さが必要です。
A
Temp AS VARCHAR(50)@宣言します。
CREATE TABLE #ホルダ(TokenValues VARCHAR(50)))
>0LEN(@tokens)が、
??? 開始します。
?????? IF CHARINDEX(',',@tokens)= 0
????????? 開始します。
???????????? SET @ TEMP=@トークン??
???????????? =" SET @トークン
???????????? INSERT INTO #holder(TokenValues)VALUES(@Temp)
????????? 最後
?????? ほかだ。
????????? 開始します。
???????????? SET @ Temp=左(CHARINDEX(',',@tokens)-1@トークン)?????
???????????? INSERT INTO #holder(TokenValues)VALUES(@Temp)
???????????? SET @トークン= RIGHT(LEN(@tokens)-LEN(@Temp)-1)@トークン)
?????? 最後
??? 最後
*[TableName から、]選択します。
(SELECT TokenValues FROM #holderに)[FieldName]場所か。
</CODE>
?
したがって、パラメータ「1,2,3,4,5」を前提とすることようそれぞれに 5 行と値で#holder名前の Temp テーブルがあります。 作成された接続が実際である限り、このテーブルが存在します。 閉じると、テーブルが自動的に削除されます。 通常の状況で閉じるのにと注意するのが絶対に強制的です。 connections. a ここで任意の可能性をとりそしてそうな使用が接続閉じられることを考えたいです。?finally強力: / <プロシージャと呼び出しに妨害する>?.Close() そこからメソッド。 C#を使用している場合、組み合わせられると、ステートメント使用すると、ブロックがラップできます。?finally それを確認し、そしてブロックする、?SqlConnection強力 / <ある>?closed 。?disposed (同じ原則が接続の他のすべての種類に適用される)の。
<コード>
C の文字列です。=ConfigurationSettings.AppSettings("ConnectString"))
Using(SqlConnection cn = new SqlConnection(cs)){)
????? SqlCommand cmd;=新しい SqlCommand(up_ProcedureHelper ConnectionName)
????? cmd.CommandType;= CommandType.StoredProcedure
????? cmd.Parameters.Add("@token","1,2,3,4,5");
????? cn.Open ()と Connection.Open //In 現実と ExecuteReader が Try/Catch/Finally に入れられる必要があります。
????? dr;=cmd.ExecuteReader(CommandBehavior.CloseConnection)????
????? Debug.Assert(dr.HasRows, "We should have Rows but Don't")とアサーションが成功する //Now と X 行を 5 持っています。
}
</CODE>

詳細

Calling?parameterized は、 SQL Server でプロシージャを格納しました。
適切なディスカッション Dynamic Sql?そして、いつ適切なソリューションです。
ほうで、の適切なディスカッション Parameterize ?クエリ
動的な SQL ステートメントをプログラムで変換する方法 Parameterized?クエリ

プロパティ

文書番号: 555167 - 最終更新日: 2004年7月24日 - リビジョン: 1.0
この資料は以下の製品について記述したものです。
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
キーワード:?
kbpubtypecca kbpubmvp kbhowto KB555167 KbMtja kbmt
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。もし誤訳を発見された場合には、この KB 下部よりフィードバックをお寄せください。
英語版 KB:555167
コミュニティで作成された技術情報の免責事項
マイクロソフトコーポレーション、その子会社、関連会社(以下「マイクロソフト」といいます)、およびそれらのサプライヤは、ここで提供されている情報および関連グラフィックスの適切性、信頼性、または正確性を表明するものではありません。これらの情報およびその関連グラフィックスは、何等保証もない現状有姿のままで提供されるものです。マイクロソフトおよびそれらのサプライヤは、この情報および関連グラフィックスに関して、商品性、特定目的に対する適合性、職人的努力、権原および非侵害の黙示的なすべての保証および条件も含めて、一切保証をするものではありません。お客様は、マイクロソフトおよびそれらのサプライヤが、損害の可能性について勧告されている場合であっても、契約、不法行為、過失、無過失責任に基づくかどうかにかかわらず、ここで提供される情報または関連グラフィックスの使用もしくは使用できないことに起因または関連するデータの消失、利益の損失などの損害が原因で生じた直接損害、間接損害、懲罰的損害、偶発的損害、特別損害、派生的損害、その他いかなる損害についても一切責任を負わないことに明確に同意します。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com