- - PR -
ストアドプロシージャのパラメータへ値設定
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-01-05 15:41
いつもお世話になっています。今年も早速お世話に・・・
.Parameters.Add("@KN", SqlDbType.VarChar) .Parameters("@KN").Value = Me.txtKana.Text ↑のようにストアドにパラメータを設定し値をセットしています。 それをストアドの方で select * from table where KN like '%'+@KN+'%' として条件を検索しています。 ストアド単体を実行すると検索結果はあっているのですが、 .NETから実行した場合、半角カナの場合は検索結果は正常なのですが、 ひらがなや全角カナ、漢字などではWHERE条件ができていないらしく 全件結果が返ってきます。 ストアド単体での動作は正常なのでパラメータの部分で間違っているのだと 思うのですが、問題がどこなのか分からないでいます。 なにか問題点などがわかりましたらよろしくお願いします。 | ||||
|
投稿日時: 2004-01-05 22:53
私は今のところOracle専門で、SQL Serverのことはよくわからないのですが、これが「ストアドプロシージャ」というのは、ちょっとおかしいと思います。ストアドプロシージャなのだから、プロシージャ名が必要ではないでしょうか?プロシージャ名に対して、パラメータを引き渡すのではないでしょうか。 Oracle風ですが: CREATE OR REPLACE PROCEDURE HOGEHOGE(ARG_KN VARCHAR2) IS SRCH_STRING VARCHAR2; BEGIN SRCH_STRING = '%' || ARG_KN || '%'; EXECUTE IMEDIATE 'SELECT * FROM TABLE1 WHERE KN LIKE :SRCH' USING SRCH_STRING; END HOGEHOGE; VB.NETコード: DbCommand.CommandText = "HOGEHOGE" DbCommand.Parameters("ARG_KN", Me.txtKana.Text) | ||||
|
投稿日時: 2004-01-06 09:31
Jittaさん返答ありがとうございます。
こちらの書き込み方が略しすぎていましたのでもう少し詳しく書かせてもらいます。 ストアド側:stp_KN_Sel ALTER PROCEDURE stp_KN_Sel @KN varchar AS SET ROWCOUNT 0 SELECT * from table where KN like '%'+@KN+'%' RETURN @@ROWCOUNT ASP.NET側: .CommandText = "stp_KN_Sel" .Parameters.Add("@KN", SqlDbType.VarChar) .Parameters("@KN").Value = Me.txtKana.Text というふうになっています。 これを実行しますと ASP.NET ストアド あ 全件 0件 ア 全件 0件 ア 0件 0件 a 0件 0件 このように件数が違いwhereの条件ができていません。 全角がだめなのでバイト数の違いなどが原因なのかもしれませんが なにか問題点ありましたら回答よろしくお願いします。 | ||||
|
投稿日時: 2004-01-06 09:37
すみません訂正です。
ASP.NET ストアド あ 全件 0件 ア 全件 0件 ア 15件 15件 a 4件 4件 このような感じになります。 | ||||
|
投稿日時: 2004-01-06 11:55
ストアド引数@KNのサイズが1バイトだからだと思います。
取り敢えず -------------------- ストアド側:stp_KN_Sel ALTER PROCEDURE stp_KN_Sel @KN varchar(2) as SET ROWCOUNT 0 SELECT * from table where KN like '%'+@KN+'%' RETURN @@ROWCOUNT -------------------- ASP.NET側: .CommandText = "stp_KN_Sel" .CommandType = CommandType.StoredProcedure .Parameters.Add("@KN", SqlDbType.VarChar, 2) .Parameters("@KN").Value = Me.txtKana.Text -------------------- の様に変更してみてください また、現在の状態でASP.NETとストアドの挙動に差異があるのは 2バイト文字を1バイトサイズに丸めて文字列で送る場合の処理が異なる為と推測します。 #挙動からの推測ですがASP.NETからでは空の文字列がストアドの引数に渡されていると思います | ||||
|
投稿日時: 2004-01-06 12:07
「SqlDbType.VarChar」これですね。MSDNを見ると、「非Unicode文字」となっています。Unicode文字を指定したのでNULLか何かに置き換わり、検索文字列が「%%」となって全件が対象になったのでしょう。
| ||||
|
投稿日時: 2004-01-06 14:08
kaguraさん、Jittaさん返事ありがとうございます。
-------------------- ストアド側:stp_KN_Sel ALTER PROCEDURE stp_KN_Sel @KN varchar(2) as SET ROWCOUNT 0 SELECT * from table where KN like '%'+@KN+'%' RETURN @@ROWCOUNT -------------------- ASP.NET側: .CommandText = "stp_KN_Sel" .CommandType = CommandType.StoredProcedure .Parameters.Add("@KN", SqlDbType.VarChar, 2) .Parameters("@KN").Value = Me.txtKana.Text -------------------- kaguraさんの返答のストアドプロシージャ側のサイズ指定を試していませんでした ので試したところ成功しました。 ASP.NET側のサイズ指定は投稿する前に調べたところサイズが決まっていない場合は 指定しないでいいというのを見ていたので今回はサイズが決まっていないので 指定しないようにしていました。ストアド単体で実行するとサイズ指定はいらない ようですがASP.NETで実行した場合はサイズ指定をしていないと1バイトしかならない ようです。 Jittaさんの返答のほうですが、投稿するまえにNVarCharなどを試してはいたのですが 結果は変わりませんでしたので普段よく使っている型にしたままでした。 ASP.NET ストアド あ 全件 0件 ア 全件 0件 ア 15件 15件 ↓ ASP.NET ストアド あ 15件 15件 ア 15件 15件 ア 15件 15件 という結果に変わったのでここからはSQLServerの照合順序の指定でうまくいく? と思いますのでいまからテストしてみます。 kaguraさん、Jittaさんありがとうございました。 | ||||
|
投稿日時: 2004-01-06 14:26
一応念の為にASP.NET側のコードでサイズ指定をして置いたので、 サイズ指定は↓の様に外して貰ってもかまわないです。 .Parameters.Add("@KN", SqlDbType.VarChar) 今回の原因はストアド側の@KNのサイズが1な為に起きた問題ですから。 |