C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 値を Null にすることはできません。というエラーについて


(過去ログ 15 を表示中)

[トピック内 20 記事 (1 - 20 表示)]  << 0 >>

■5052 / inTopicNo.1)  値を Null にすることはできません。というエラーについて
  
□投稿者/ tnkver2 (9回)-(2007/07/03(Tue) 15:12:54)

分類:[C# (Windows)] 

2007/07/03(Tue) 16:14:25 編集(投稿者)

いつもここの掲示板にはお世話になっています。

本題なのですが、TextBox1とTextBox2に日付を入力、その範囲にあるデーターをSQLで呼び、ListBoxに表示させています。
ここまではいいのですが、次にリストボックスで複数選択されたアイテムをDataGridに表示させたいのですが、「値をNullにすることはできません。」とエラーが出てしまいます。

下記のようにコーティングしているのですが、どこか間違っている場所などがあったらお教え願えないでしょうか?

private void botton1_Click(object sender, System.EventArgs e)
{
try
{
if(DateTime.Parse(textBox1.Text) > DateTime.Parse(textBox2.Text))
{
MessageBox.Show("日付を正しく入力してください。");
return;
}
else
{
OleDbDataAdapter oleda;
DataSet dataSet11 = new DataSet("SHOP");
dataSet11.Tables.Add("SHOP");
oleda = new OleDbDataAdapter("SELECT DISTINCT SHOPNAME FROM SHOP WHERE TO_CHAR(SALEDATE,'yyyy/mm/dd') BETWEEN '" + textBox1.Text + "' AND '" + textBox2.Text + "'",olecon);
oleda.Fill(dataSet11.Tables["SHOP"]);

if (dataSet11.Tables["SHOP"].Rows.Count == 0)
{
MessageBox.Show("店舗が見つかりませんでした。");
return;
}
listbox.DataSource = dataSet11.Tables["SHOP"];
listbox.DisplayMember = "SHOPNAME";
listbox.ValueMember = "SHOPNAME";
}
}
catch
{
MessageBox.Show("日付を正しく入力してください");
}
}

private void botton2_Click(object sender, System.EventArgs e)
{
int i;
int c;
string str = null;
c = listbox.Items.Count;

for (i = 0; i < c; i++)
{
if (listbox.GetSelected(i) == true)
{
System.Data.DataRowView drv = this.listbox.Items[i] as System.Data.DataRowView;
str = str + ", '" + drv[0].ToString() + "'";
}

str = str.Substring(2);

OleDbDataAdapter oleda;
DataSet dataSet11= new DataSet("SHOP");
oleda = new OleDbDataAdapter("SELECT DISTINCT SHOPNAME FROM SHOP WHEWE SHOPNAME = IN('" + str + "') AND TO_CHAR(SALEDATE,'yyyy/mm/dd') BETWEEN '" + textBox1.Text + "' AND '" + textBox2.Text + "'",olecon);
oleda.Fill(dataSet11.Tables["SHOP"]);←ここで上記のエラーがでます。
dataGrid1.DataSource = dataSet11.Tables["SHOP"];
引用返信 編集キー/
■5055 / inTopicNo.2)  Re[1]: 値を Null にすることはできません。というエラーについて
□投稿者/ mあ (14回)-(2007/07/03(Tue) 15:55:32)
No5052 (tnkver2 さん) に返信
> oleda = new OleDbDataAdapter("SELECT DISTINCT SHOPNAME FROM SHOP WHERE TO_CHAR
> oleda = new OleDbDataAdapter("SELECT DISTINCT SHOPNAME FROM SHOP WHEWE SHOPNAME = IN
この2つのSQL文何か変ですよ。

CSE等のツール上で実行してみてGoodなら、ソースに落とし込むなり埋め込むように
した方が間違いないかと思います。

引用返信 編集キー/
■5057 / inTopicNo.3)  Re[2]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (10回)-(2007/07/03(Tue) 16:05:15)
> CSE等のツール上で実行してみてGoodなら、ソースに落とし込むなり埋め込むように
> した方が間違いないかと思います。


一応、上記のSQLは実行してちゃんと動きます。

ソースに落とし込む・埋め込むとはどういう意味でしょう?
引用返信 編集キー/
■5058 / inTopicNo.4)  Re[3]: 値を Null にすることはできません。というエラーについて
□投稿者/ じゃかるた (32回)-(2007/07/03(Tue) 16:10:58)
>上記のSQLは実行してちゃんと動きます。

SQL'AND'の両端にスペースがないのが気になりますが...
引用返信 編集キー/
■5059 / inTopicNo.5)  Re[4]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (11回)-(2007/07/03(Tue) 16:13:27)
No5058 (じゃかるた さん) に返信
> >上記のSQLは実行してちゃんと動きます。
>
> SQL'AND'の両端にスペースがないのが気になりますが...

Σ

すいません、SQLのところは必要最低限なところだけを手で打ったため、しょぼいミスをしてしました・・・・。

実際には両端にスペースがあいてます。
引用返信 編集キー/
■5060 / inTopicNo.6)  Re[3]: 値を Null にすることはできません。というエラーについて
□投稿者/ ぽぴ王子 (231回)-(2007/07/03(Tue) 16:17:58)
ぽぴ王子 さんの Web サイト
No5057 (tnkver2 さん) に返信

> 一応、上記のSQLは実行してちゃんと動きます。

どの時点での SQL が「ちゃんと動く」のかが問題かと思います。

> oleda = new OleDbDataAdapter("SELECT DISTINCT SHOPNAME (以下略)

の SQL を、str や textBox1.Text textBox2.Text を含めた状態(つまりエ
ラーが出ている行の時点での oleda.SelectCommand.CommandText の
値)を使って動くかどうか確認すべきです。

というか、その前に

> string str = null;

ここで null を入れてるからじゃネーノ?とか思ったり思わなかったり。

> ソースに落とし込む・埋め込むとはどういう意味でしょう?

SQL をコードに入れるという意味だと思います。
引用返信 編集キー/
■5061 / inTopicNo.7)  Re[5]: 値を Null にすることはできません。というエラーについて
□投稿者/ じゃかるた (33回)-(2007/07/03(Tue) 16:25:02)
> すいません、SQLのところは必要最低限なところだけを手で打ったため、しょぼいミスをしてしました・・・・。

SHOPNAME = IN('" + str + "')

これもミス?
引用返信 編集キー/
■5062 / inTopicNo.8)  Re[6]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (12回)-(2007/07/03(Tue) 16:37:30)
No5061 (じゃかるた さん) に返信
>>すいません、SQLのところは必要最低限なところだけを手で打ったため、しょぼいミスをしてしました・・・・。
>
> SHOPNAME = IN('" + str + "')
>
> これもミス?


うぅ、それもMISSです。

SHOPNAME IN('" + str + "')

もっと確認してから送信すればよかった・・・
引用返信 編集キー/
■5063 / inTopicNo.9)  Re[3]: 値を Null にすることはできません。というエラーについて
□投稿者/ Mr.T (67回)-(2007/07/03(Tue) 16:38:55)
Mr.Tです、こんにちは。

>> string str = null;
>ここで null を入れてるからじゃネーノ?とか思ったり思わなかったり。

ぽぴ王子さんの指摘にあるように、str=nullがそのまま使われているから
じゃないかなと。

>for (i = 0; i < c; i++)
>{
>if (listbox.GetSelected(i) == true)
>{
>System.Data.DataRowView drv = this.listbox.Items[i] as System.Data.DataRowView;
>str = str + ", '" + drv[0].ToString() + "'";
>}

で、「まったく選択されていなかった場合のSQLが正しいのか」を確認しては
どうでしょうか。

#ところで、これ}が一つ足らないような...
引用返信 編集キー/
■5064 / inTopicNo.10)  Re[4]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (13回)-(2007/07/03(Tue) 16:45:32)
まったく選択されていない場合には

str = str.Substring(2);

のところでエラーが出ました。(オブジェクト参照がオブジェクト インスタンスに設定されていません。


null以外には何を入れたらいいでしょうか?
引用返信 編集キー/
■5066 / inTopicNo.11)  Re[5]: 値を Null にすることはできません。というエラーについて
□投稿者/ ぽぴ王子 (232回)-(2007/07/03(Tue) 17:00:21)
ぽぴ王子 さんの Web サイト
No5064 (tnkver2 さん) に返信

> のところでエラーが出ました。

これは null に対して Substring() を実行しようとしたからですね。

> null以外には何を入れたらいいでしょうか?

一般的には "" (空文字列)じゃないでしょうか。
連結することが前提の文字列の初期化に null は使わないかと。

また、連結するのであれば String ではなく StringBuilder クラスを使った方がいいで
す。
あるいはカンマで連結するとしたら

List<string> lst = new List<string>();
for (i = 0; i < c; i++)
{
  if (listbox.GetSelected(i) == true)
  {
    System.Data.DataRowView drv = this.listbox.Items[i] as System.Data.DataRowView;
    lst.Add("'" + drv[0].ToString() + "'");
  }
}
str = string.Join(", ", lst.ToArray());

とか、こんな感じで(C# 2.0使用・なおかつ環境がないので未検証)。
# listbox.Items に DataRowView そのものを入れておく必要性は疑問ですけど

引用返信 編集キー/
■5068 / inTopicNo.12)  Re[6]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (14回)-(2007/07/03(Tue) 17:14:39)
No5066 (ぽぴ王子 さん) に返信
> ■No5064 (tnkver2 さん) に返信
>
>>のところでエラーが出ました。
>
> これは null に対して Substring() を実行しようとしたからですね。
>
>>null以外には何を入れたらいいでしょうか?
>
> 一般的には "" (空文字列)じゃないでしょうか。
> 連結することが前提の文字列の初期化に null は使わないかと。
>
> また、連結するのであれば String ではなく StringBuilder クラスを使った方がいいで
> す。
> あるいはカンマで連結するとしたら
>
> List<string> lst = new List<string>();
> for (i = 0; i < c; i++)
> {
> if (listbox.GetSelected(i) == true)
> {
> System.Data.DataRowView drv = this.listbox.Items[i] as System.Data.DataRowView;
> lst.Add("'" + drv[0].ToString() + "'");
> }
> }
> str = string.Join(", ", lst.ToArray());
>
> とか、こんな感じで(C# 2.0使用・なおかつ環境がないので未検証)。
> # listbox.Items に DataRowView そのものを入れておく必要性は疑問ですけど


空文字を入れても結果は一緒でした。

StringBuilderというのは、使ったこと無いので今から調べるつもりです。
引用返信 編集キー/
■5069 / inTopicNo.13)  Re[6]: 値を Null にすることはできません。というエラーについて
□投稿者/ じゃかるた (34回)-(2007/07/03(Tue) 17:18:53)
2007/07/03(Tue) 17:19:46 編集(投稿者)

>oleda.Fill(dataSet11.Tables["SHOP"]);←ここで上記のエラーがでます
oleda.Fill(dataSet11,"SHOP");
こうかな...
間はカンマですよ
引用返信 編集キー/
■5072 / inTopicNo.14)  Re[7]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (15回)-(2007/07/03(Tue) 17:38:08)
No5069 (じゃかるた さん) に返信
> 2007/07/03(Tue) 17:19:46 編集(投稿者)
>
> >oleda.Fill(dataSet11.Tables["SHOP"]);←ここで上記のエラーがでます
> oleda.Fill(dataSet11,"SHOP");
> こうかな...
> 間はカンマですよ

おぉ、値をnullに〜というエラーはでなくなりました。

しかし、今度は

'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。

というエラーが、同じ場所で起こりました。これはSQLを間違っているってことですよね・・・・

選択されたIN('" + str + "')の中身を見てみたら、str = "'店名, '店名'"
のような形で入っていました。

取得の方法が悪いのでしょうか・・・?
引用返信 編集キー/
■5074 / inTopicNo.15)  Re[7]: 値を Null にすることはできません。というエラーについて
□投稿者/ じゃかるた (35回)-(2007/07/03(Tue) 17:45:32)
>str = "'店名, '店名'"
記載ミス?^^;
str = "'店名', '店名'"



引用返信 編集キー/
■5075 / inTopicNo.16)  Re[8]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (16回)-(2007/07/03(Tue) 17:50:10)
No5074 (じゃかるた さん) に返信
> >str = "'店名, '店名'"
> 記載ミス?^^;
> str = "'店名', '店名'"
>
>
>
str = "'店名1', '店名2'"

ですね。何度記載ミスすれば気が済むんだ自分・・・・orz
引用返信 編集キー/
■5076 / inTopicNo.17)  Re[9]: 値を Null にすることはできません。というエラーについて
□投稿者/ じゃかるた (36回)-(2007/07/03(Tue) 17:56:54)
No5075 (tnkver2 さん) に返信

>選択されたIN('" + str + "')の中身を見てみたら、str = "'店名, '店名'"
これだとIN(''店名1', '店名2'')になりますが?
IN(" + str + ")でいいのでは?
はずしてたらすいません。

引用返信 編集キー/
■5077 / inTopicNo.18)  Re[10]: 値を Null にすることはできません。というエラーについて
□投稿者/ ぽぴ王子 (233回)-(2007/07/03(Tue) 18:04:39)
ぽぴ王子 さんの Web サイト
No5075 (tnkver2 さん) に返信

> ですね。何度記載ミスすれば気が済むんだ自分・・・・orz

なんとなく気づいていたけど黙っていた俺ガイル。
業務上公開できないデータもあるかもしれないけど、大丈夫な
データだったらコピペしようぜ!とか言ってみる。

記載ミスをチェックするのもデバッグの一環ですよ。
引用返信 編集キー/
■5078 / inTopicNo.19)  Re[10]: 値を Null にすることはできません。というエラーについて
□投稿者/ tnkver2 (17回)-(2007/07/03(Tue) 18:10:24)
No5076 (じゃかるた さん) に返信
> ■No5075 (tnkver2 さん) に返信
>
> >選択されたIN('" + str + "')の中身を見てみたら、str = "'店名, '店名'"
> これだとIN(''店名1', '店名2'')になりますが?
> IN(" + str + ")でいいのでは?
> はずしてたらすいません。
>

おお!無事に動きました!すっごい初歩的なミスを犯していたんですね・・・・orz

No5077 (ぽぴ王子 さん) に返信

全くもって、そのとおりです。もっと確認してから送信するように以後気をつけます。




みなさんありがとうございました!これで今日は帰れます!(ぇ




解決済み
引用返信 編集キー/
■5079 / inTopicNo.20)  Re[11]: 値を Null にすることはできません。というエラーについて
 
□投稿者/ ぽぴ王子 (234回)-(2007/07/03(Tue) 18:22:03)
ぽぴ王子 さんの Web サイト
No5078 (tnkver2 さん) に返信

せっかくなので、まとめてみる。

> oleda = new OleDbDataAdapter("SELECT DISTINCT SHOPNAME (以下略)

の時点で、OleDataAdapter に与えている SQL がヘンテコなものになっていたために、次
の行でエラーが発生していた。

最初にチェックすべきだった点は
エラーが発生している行にブレークポイントを設定し、その時点での
oleda.SelectCommand.CommandText
をイミディエイトウィンドウなどで確認。
その内容を直接実行してみて、SQL が正しいことを確認する。

反省点
・記載ミス大杉
・SQL チェックしてなさ杉
・ソースがおかしいのでみんなそこに目がいっちゃって一番大事なところ見落とし杉
(自分含む)

というところでしょうか。

とりあえずじゃかるたさんに乾杯。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -