- PR -

SelectParameters にDBNull か ""を渡したいが・・・

1
投稿者投稿内容
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2008-01-19 02:54
お世話になっております

 VS2003にて Adapter.SelectCommand.Parameters には
 DBNullが渡せていたのですが 2005ではDBNullは渡せないのでしょうか??
 SelectParameters.Addだと パラメータの属性でしか受け付けません
 
 ちなみに String(SQL では varchar)のパラメータに""を渡してみても 
  this.SqlDataSource1.SelectParameters.Add("param_2", "");
 ストアドでは正しく動作しますが  。NET経由だと なにも抜いてきません
  this.SqlDataSource1.SelectParameters.Add("param_2", "a");
 文字列を渡せば 正しく動作します
 
 画面(in_officeCodeFilter) に何も入れなければ、全件抽出
 何か入力したら 先頭一致でデータを取得して 一覧を出したいのですが・・・・
 なぜか 2日も悩んでしまっています
 2005に変わって 手も足も出ません (涙)

ストアド
 @param_1 smallint,
 @param_2 varchar(6)

 SELECT
  officeId ,
  officeCodeFilter
 FROM office
 WHERE (officeCodeFilter IS NULL)
  OR (officeCodeFilter LIKE @param_2 + '%')
 ORDER BY officeId


<SelectParameters>
<asp:Parameter Name="param_1" />
<asp:Parameter DefaultValue="" Name="param_2" Type="String" />
</SelectParameters>

-----------------------2003のとき
[CODE]
if ((A == true))
this.Adapter.SelectCommand.Parameters[1].Value = Convert.ToInt16(in_officeId.Text.Trim());
else
this.Adapter.SelectCommand.Parameters[1].Value = System.DBNull.Value;

if ((B == null))
this.Adapter.SelectCommand.Parameters[2].Value = System.DBNull.Value;
else
this.Adapter.SelectCommand.Parameters[2].Value = in_officeCodeFilter.Text.Trim());
[/CODE}

-----------------------2005のでは?? 渡す先の属性に合わせて型変換してみましたが虚しく・・
[CODE]
if ((A == true))
this.SqlDataSource1.SelectParameters.Add("param_1",Convert.ToInt16(in_officeId.Text.Trim()));
else
this.SqlDataSource1.SelectParameters.Add("param_1",Convert.ToInt16(System.DBNull.Value));

if ((B == null))
this.SqlDataSource1.SelectParameters.Add("param_2",Convert.ToString(System.DBNull.Value));
else
this.SqlDataSource1.SelectParameters.Add("param_2",in_officeCodeFilter.Text.Trim());
[/CODE}

ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2008-01-20 01:10
VS2003でのAdapterってのは、SqlDataAdapterのことでしょうか?
だとすると、Adapter.SelectCommand.ParametersはSystem.Data.SqlClient.SqlParameterのコレクションですね。
一方、VS2005のthis.SqlDataSource1.SelectParametersはSystem.Web.UI.WebControls.Parameterのコレクションです。
名前空間からして違う。目的も使い方も異なる全く別のクラスです。

名前空間からして違い、目的も使い方も異なる点ではSqlDataAdapterとSqlDataSourceも同じです。
全然別のモノと考えた方が良さそうです。

SqlDataSource コントロールにおけるパラメータの使用

SqlDataSourceをちゃんと使ったことないのであまり詳しくはわからないですが、どーも値を直接指定するような類のものではなさそうですね。むしろ画面上のテキストボックスなどと直接結び付けてしまうようなイメージっぽい。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-01-20 13:53
引用:
this.SqlDataSource1.SelectParameters.Add("param_2",Convert.ToString(System.DBNull.Value));

これはパラメータ自体を追加するもので、パラメータの値を追加するものではありません。
これだとparam_2というパラメータを複数(aspxにも書いてあるから)渡してしまいます。

ぼのぼのさんのおっしゃるように、SqlDataSourceは画面上のコントロールの値や
QueryString等と直接結びつくイメージで使用します。

引用:
画面(in_officeCodeFilter) に何も入れなければ、全件抽出
 何か入力したら 先頭一致でデータを取得して 一覧を出したいのですが・・・・

これをしたいのであれば、
<asp:Parameter DefaultValue="" Name="param_2" Type="String" />
この部分を
<asp:ControlParameter ConvertEmptyStringToNull="false" ControlID="in_officeCodeFilter" Name="param_2" PropertyName="Text" />
こう書き換えるだけだと思います。データソースの構成ウィザードを使用しても出来ます。
C#のコーディングは不要です。
(param_1は用途不明だったので消して試しています、ストアドからも)

意味はそのまま、in_officeCodeFilterというコントロールのTextプロパティの値を
param_2というパラメータに渡す、です。
わかりにくいのはConvertEmptyStringToNullで、これがtrueだとテキストボックスが
空文字列だったときにparam_2に渡す値が勝手にnullに変わります。
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2008-01-22 12:15
べるさん、ぼのぼのさん

 日・月と寝込んでたため 返信が遅くなってしまって
 申し訳ありません

>どーも値を直接指定するような類のものではなさそうですね
  そういうことだったんですねぇ
 確かに! ウィザードを使うと、画面に紐付けの選択ができるんですねぇ

 ツールボックス上に SqlDataAdapter がなくSqlDataSource
 に変わったという事は 判断しても 考え方は同じだろうなんて
 決めつけて 使用してしまいました・・・

 ありがとうございます 感謝 m(__)m

 

 
 
1

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