- PR -

ストアドプロシージャのパラメータへ値設定

投稿者投稿内容
Anon
常連さん
会議室デビュー日: 2003/10/20
投稿数: 29
投稿日時: 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条件ができていないらしく
全件結果が返ってきます。

ストアド単体での動作は正常なのでパラメータの部分で間違っているのだと
思うのですが、問題がどこなのか分からないでいます。

なにか問題点などがわかりましたらよろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-05 22:53
引用:

Anonさんの書き込み (2004-01-05 15:41) より:

それをストアドの方で
select * from table where KN like '%'+@KN+'%'
として条件を検索しています。


 私は今のところ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)
Anon
常連さん
会議室デビュー日: 2003/10/20
投稿数: 29
投稿日時: 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の条件ができていません。
全角がだめなのでバイト数の違いなどが原因なのかもしれませんが
なにか問題点ありましたら回答よろしくお願いします。

Anon
常連さん
会議室デビュー日: 2003/10/20
投稿数: 29
投稿日時: 2004-01-06 09:37
すみません訂正です。

  ASP.NET   ストアド
あ  全件      0件    
ア  全件      0件    
ア   15件      15件    
a   4件      4件

このような感じになります。
kagura
常連さん
会議室デビュー日: 2003/03/26
投稿数: 27
投稿日時: 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からでは空の文字列がストアドの引数に渡されていると思います
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-06 12:07
 「SqlDbType.VarChar」これですね。MSDNを見ると、「非Unicode文字」となっています。Unicode文字を指定したのでNULLか何かに置き換わり、検索文字列が「%%」となって全件が対象になったのでしょう。
Anon
常連さん
会議室デビュー日: 2003/10/20
投稿数: 29
投稿日時: 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さんありがとうございました。
kagura
常連さん
会議室デビュー日: 2003/03/26
投稿数: 27
投稿日時: 2004-01-06 14:26
引用:

.Parameters.Add("@KN", SqlDbType.VarChar, 2)




一応念の為にASP.NET側のコードでサイズ指定をして置いたので、
サイズ指定は↓の様に外して貰ってもかまわないです。
.Parameters.Add("@KN", SqlDbType.VarChar)

今回の原因はストアド側の@KNのサイズが1な為に起きた問題ですから。

スキルアップ/キャリアアップ(JOB@IT)