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

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

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

Re[14]: SQL文にNULLが入らない。


(過去ログ 45 を表示中)

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

■23863 / inTopicNo.1)  SQL文にNULLが入らない。
  
□投稿者/ ぽっち (32回)-(2008/08/22(Fri) 17:14:55)

分類:[ASP.NET (C#)] 

こんにちは。お世話になっております。
先ほどもご質問させて頂いてたのですが・・・

現在、
開発環境:WindowsXP
使用言語:ASP.NET、C#
でデータベース(SQL-SERVER)を使ったシステムを作っております。


先ほどは、Rowsが書き忘れたことによるミスで無事ビルドは成功したのですが、
肝心のSQL文が通ってくれてなくて困っております。
どうもこの下のようなfor文でDataTable型の中身がNULLだったら「NULL」を入れるとしている処理を上手く通らずいるようで
デバックしてもひとつもif文の中に入ってくれなかったので・・・。


【ソース】
//取得したデータの中身チェック(なければ、Nullを代入)
for(int i=1;i<=7;i++)
{
if (dt.Rows[0][i] == null)←
 {
dt.Rows[0][i] = null;←
}
}

query.AppendFormat("INSERT INTO {0} ", T.ListDetailTable);
query.Append("(No, Vno, INo, CD, SCD, ");
query.Append("TCD, PCD, LISTCD, FrindCD) ");
query.AppendFormat("VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8})",
QUERYVARIABLE_NO,
vDetail.Vno + 1,
vDetail.INo,
dt.Rows[0][1],
dt.Rows[0][2],
dt.Rows[0][3],
dt.Rows[0][4],
dt.Rows[0][5],
dt.Rows[0][6]);

return query.ToString();


結果的にreturnで返されるSQL文が、

【返されるSQL文】
INSERT INTO ListDetailTable (No, Vno, INo, CD, SCD, TCD, PCD, LISTCD, FrindCD) VALUES (@Num, 2, 1, 0001, 04, , , 001, )

になってしまい、空白の部分に「NULL」が入ってない状態で返して、エラーが起こってしまいます。


【理想的なSQL文】
INSERT INTO ListDetailTable (No, Vno, INo, CD, SCD, TCD, PCD, LISTCD, FrindCD) VALUES (@Num, 2, 1, 0001, 04, NULL, NULL, 001, NULL)

なのですが、どうやって「NULL」を入れれば良いのでしょうか・・・?
いろいろToStringやEqualsでのif文判断もしたのですが、上手くいかずに困っております。


度重ねで誠に申し訳ないのですが、誰かご教授お願い致します。
引用返信 編集キー/
■23865 / inTopicNo.2)  Re[1]: SQL文にNULLが入らない。
□投稿者/ ロック (65回)-(2008/08/22(Fri) 17:21:46)
ifの中に入れば良いんですか?
>if (dt.Rows[0][i] == null)←
の部分を「System.DBNull.Value」で比較しても駄目ですか?
引用返信 編集キー/
■23866 / inTopicNo.3)  Re[2]: SQL文にNULLが入らない。
□投稿者/ ぽっち (33回)-(2008/08/22(Fri) 17:35:13)
No23865 (ロック さん) に返信
> ifの中に入れば良いんですか?
> >if (dt.Rows[0][i] == null)←
> の部分を「System.DBNull.Value」で比較しても駄目ですか?

回答有難うございます。

それはつまり、

for (int i = 1; i < 7; i++)
{
if (dt.Rows[0][i] == System.DBNull.Value)
{
dt.Rows[0][i] = NULL;
}
}

という事でしょうか・・・?
引用返信 編集キー/
■23868 / inTopicNo.4)  Re[3]: SQL文にNULLが入らない。
□投稿者/ ぽっち (34回)-(2008/08/22(Fri) 17:36:16)
No23866 (ぽっち さん) に返信
> ■No23865 (ロック さん) に返信
>>ifの中に入れば良いんですか?
>>>if (dt.Rows[0][i] == null)←
>>の部分を「System.DBNull.Value」で比較しても駄目ですか?
>
> 回答有難うございます。
>
> それはつまり、
>
> for (int i = 1; i < 7; i++)
> {
> if (dt.Rows[0][i] == System.DBNull.Value)
> {
> dt.Rows[0][i] = System.DBNull.Value;
> }
> }
>
> という事でしょうか・・・?
引用返信 編集キー/
■23869 / inTopicNo.5)  Re[4]: SQL文にNULLが入らない。
□投稿者/ ぽっち (35回)-(2008/08/22(Fri) 17:39:26)
>>■No23865 (ロック さん) に返信
> >>ifの中に入れば良いんですか?
> >>>if (dt.Rows[0][i] == null)←
> >>の部分を「System.DBNull.Value」で比較しても駄目ですか?
>>
>>回答有難うございます。
>>
>>それはつまり、
>>
>> for (int i = 1; i < 7; i++)
>> {
>> if (dt.Rows[0][i] == System.DBNull.Value)
>> {
>> dt.Rows[0][i] = System.DBNull.Value;
>> }
>> }
>>
>>という事でしょうか・・・?

上記のように記述してみましたが、結果はダメでした・・・。
引用返信 編集キー/
■23870 / inTopicNo.6)  Re[5]: SQL文にNULLが入らない。
□投稿者/ オガシン (53回)-(2008/08/22(Fri) 17:42:45)
答えが明確に言えなくて申し訳ないところですが、
ステップ実行していって、「dt.Rows[0][i]」がNullになるときに
「dt.Rows[0][i] 」の型をみたらわかるのでは?

なんとかNullとかになってたらそのタイプのNullと比較してあげたらいいかなー
なんて思いました。

参考になれば。
引用返信 編集キー/
■23871 / inTopicNo.7)  Re[2]: SQL文にNULLが入らない。
□投稿者/ ぽっち (36回)-(2008/08/22(Fri) 17:43:50)
2008/08/22(Fri) 17:47:05 編集(投稿者)
2008/08/22(Fri) 17:45:03 編集(投稿者)

No23865 (ロック さん) に返信
> ifの中に入れば良いんですか?
> >if (dt.Rows[0][i] == null)←
> の部分を「System.DBNull.Value」で比較しても駄目ですか?

教えて頂いた「System.DBNull.Value」でif文の中には入るようになりましたが、
「NULL」という文字を空の項目の部分に入れてくれないので、現状困ってます・・・。

"NULL"なんでしょうか・・・?

因みにそれでは上手く出来なかったので・・・。後、dt.Rows[0][i].To Stringもやってみたのですが、それもダメでした。
因みに空になってほしい場所のデータ型はVarchar型になります。


No23870 (オガシン さん) に返信
> 答えが明確に言えなくて申し訳ないところですが、
> ステップ実行していって、「dt.Rows[0][i]」がNullになるときに
> 「dt.Rows[0][i] 」の型をみたらわかるのでは?
>
> なんとかNullとかになってたらそのタイプのNullと比較してあげたらいいかなー
> なんて思いました。
>
> 参考になれば。

アドバイス有難うございます。
型・・・NULLにならなくてはならない場所がVarcharっていうのは判っているのですが・・・
なかなかそこからどうしたら、「NULL」と文字が入ってくれるのか分からないので悪戦苦闘しております。

引用返信 編集キー/
■23873 / inTopicNo.8)  Re[6]: SQL文にNULLが入らない。
□投稿者/ ロック (66回)-(2008/08/22(Fri) 18:13:46)
何がやりたいのか、なんとなく分かってきましたが
対象のデータがnullだったら、挿入先にもnullを入れたいのでNULLという文字を
パラメータに入れたいという事ですか
単純に
>dt.Rows[0][i] = null;を
dt.Rows[0][i] = "NULL";
で、目的の結果になるような気がしますが、データタイプがStringに
なっていないと文字列で"NULL"が入らないので、それはそれで問題になるかと
#dt.Rows[0][i]のデータタイプが数値とかなら別の変数に入れてなどの対応が必要になる

>"NULL"なんでしょうか・・・?
プログラム上とデータベース上のnullとでは、また違ってくるので
深い話になります(汗
なので、自分にはうまく説明できないです。
機会があれば「nullとは?」でグーグルなどで検索してみると色々勉強になるかも

引用返信 編集キー/
■23874 / inTopicNo.9)  Re[7]: SQL文にNULLが入らない。
□投稿者/ ネタ好き未記入 (50回)-(2008/08/22(Fri) 18:34:40)
サンプルのDataTableの列、DataColumnのAllowDBNullはTrueになっていますか?
それも一応確かめた方がいいかと思います。
引用返信 編集キー/
■23875 / inTopicNo.10)  Re[8]: SQL文にNULLが入らない。
□投稿者/ ロック (67回)-(2008/08/22(Fri) 18:43:06)
読み間違えてました orz
>"NULL"なんでしょうか・・・?
NULLって何なの? って意味で読んでしまいました・・・

なので、
>"NULL"なんでしょうか・・・?
はい、そうです。 になります。

#今日はもう帰ろう・・・そうしよう
引用返信 編集キー/
■23876 / inTopicNo.11)  Re[9]: SQL文にNULLが入らない。
□投稿者/ オガシン (54回)-(2008/08/22(Fri) 20:04:01)
提示されているソースを見ると、
>dt.Rows[0][i] = NULL;
これだとdt.Rows[0][i]が参照している場所をNULLにしろ!(若干語弊があるかもですが)
になっていると思います。

なので
>dt.Rows[0][i] = NULL;
のあとに
dt.Rows[0][i].ToStringするとNoRefarenceException(スペル曖昧)あたりが
スローされているのではないでしょうか。

#ちなみにSystem.DBNull.ValueはSystem.DBNullのオブジェクトを返すプロパティでした。
#System.DBNullクラスはシングルトンになっているようですね。(MSDNより)
引用返信 編集キー/
■23928 / inTopicNo.12)  Re[10]: SQL文にNULLが入らない。
□投稿者/ ぽっち (37回)-(2008/08/25(Mon) 11:35:48)
No23875 (ロック さん) に返信
No23876 (オガシン さん) に返信
> 提示されているソースを見ると、
> >dt.Rows[0][i] = NULL;
> これだとdt.Rows[0][i]が参照している場所をNULLにしろ!(若干語弊があるかもですが)
> になっていると思います。
>
> なので
> >dt.Rows[0][i] = NULL;
> のあとに
> dt.Rows[0][i].ToStringするとNoRefarenceException(スペル曖昧)あたりが
> スローされているのではないでしょうか。
>
> #ちなみにSystem.DBNull.ValueはSystem.DBNullのオブジェクトを返すプロパティでした。
> #System.DBNullクラスはシングルトンになっているようですね。(MSDNより)

コメント返しが遅れまして申し訳ございません。
未だにこの問題が解決されずに困っております。

> >dt.Rows[0][i] = NULL;
> のあとに
> dt.Rows[0][i].ToStringするとNoRefarenceException(スペル曖昧)あたりが
> スローされているのではないでしょうか。

オガシン さんの仰っている意味が判り兼ねるのですが・・・。
つまりdt.Rows[0][i] = NULL;で命令した後にString変換という事でしょうか・・・?
もしそうならば、それは試しましたが、「メソッドグループからObjectに変換出来ない」と怒られてしまいます。


for (int i = 1; i < 7; i++)
{
if (dt.Rows[0][i] == System.DBNull.Value)//←ここでNULLがどうか中身を見ている。
{
dt.Rows[0][i] = System.DBNull.Value;
}
}

することによりNULL判断は出来ていました。そしてif文の中に入るのですが、NULLを文字として入れてくれないので・・・
.ToStringを「dt.Rows[0][i]」の後に入れてみると、「メソッドグループからObjectに変換出来ない」と怒られてしまいますので
途方に暮れております・・・。




引用返信 編集キー/
■23929 / inTopicNo.13)  Re[11]: SQL文にNULLが入らない。
□投稿者/ みきぬ (45回)-(2008/08/25(Mon) 11:56:29)
2008/08/25(Mon) 12:05:56 編集(投稿者)
2008/08/25(Mon) 11:58:48 編集(投稿者)

# DataAdapterを使ったほうがいいと思いますが

元のソースの処理では dt.Rows[0][i] の中身が null の場合、
パラメータが展開された結果は空っぽになってしまいますね。
dt.Rows[0][i] の中身に "NULL" という文字列を与えることができればいけますが、
該当の Column の型が String でないとだめですね。

dt.Rows[0][i] が DBNull かどうかによって、クエリを組み立て方を変えるように
プログラムを書き直すといいんじゃないでしょうか。
DBNullだったら "Null" を、そうじゃなかったら "{0}" を連結させるみたいな。


あ、もし 1 という数値じゃなくて "0001" という文字を INSERT したいのであれば、
展開した結果が '0001' となるように、パラメータの部分を '{3}' のように囲ってあげないといけないんじゃないかな。
引用返信 編集キー/
■23930 / inTopicNo.14)  Re[11]: SQL文にNULLが入らない。
□投稿者/ オガシン (55回)-(2008/08/25(Mon) 11:56:54)
>>メソッドグループからObjectに変換出来ない
このメッセージをだしている場所、例外の型はなんですか?

for (int i = 1; i < 7; i++)
{
    if (dt.Rows[0][i] == System.DBNull.Value)//←ここでNULLがどうか中身を見ている。
    {
        dt.Rows[0][i] = System.DBNull.Value;//※1
    }
}

※1ここでしたい処理はなんですか?
dt.Rows[0][i]がDBNullなら、dt.Rows[0][i]に(DBに解釈される)Nullをセットしたい。でしょうか?
NullだったらNullを入れるってなると、別にNullなんだからそのままでいいんじゃないの?
って思いましたが。

引用返信 編集キー/
■23931 / inTopicNo.15)  Re[12]: SQL文にNULLが入らない。
□投稿者/ やじゅ (571回)-(2008/08/25(Mon) 12:37:19)
やじゅ さんの Web サイト
ようは、INSERT句の値にDBNullだったら文字列のNULLをセットしたいってことですよね。

VBerなのでC#の記述が間違ってるかも知れませんが、考え方はわかると思います。

query.AppendFormat("VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8})",
QUERYVARIABLE_NO,
vDetail.Vno + 1,
vDetail.INo,
dt.Rows[0][1],
dt.Rows[0][2],
dt.Rows[0][3] == System.DBNull.Value ? "Null" : dt.Rows[0][3],
dt.Rows[0][4],
dt.Rows[0][5],
dt.Rows[0][6]);

引用返信 編集キー/
■23944 / inTopicNo.16)  Re[12]: SQL文にNULLが入らない。
□投稿者/ ぽっち (38回)-(2008/08/25(Mon) 13:48:18)
No23929 (みきぬ さん) に返信
> 2008/08/25(Mon) 12:05:56 編集(投稿者)
> 2008/08/25(Mon) 11:58:48 編集(投稿者)
>
> # DataAdapterを使ったほうがいいと思いますが

調べてきましたが、SQLを直書きですよね???これは。
SQLはSQLでデータを引っ張る用のcsがあるのですが・・・。
その部分を呼び出しとか出来ますか調べてみます。


> 元のソースの処理では dt.Rows[0][i] の中身が null の場合、
> パラメータが展開された結果は空っぽになってしまいますね。
> dt.Rows[0][i] の中身に "NULL" という文字列を与えることができればいけますが、
> 該当の Column の型が String でないとだめですね。

確かに受け取ったデータが空(NULL)の場合、今は「""」となってしまっています。


> dt.Rows[0][i] が DBNull かどうかによって、クエリを組み立て方を変えるように
> プログラムを書き直すといいんじゃないでしょうか。
> DBNullだったら "Null" を、そうじゃなかったら "{0}" を連結させるみたいな。
>
>
> あ、もし 1 という数値じゃなくて "0001" という文字を INSERT したいのであれば、
> 展開した結果が '0001' となるように、パラメータの部分を '{3}' のように囲ってあげないといけないんじゃないかな。


助言助かります。
いろいろやってみようと思います。
引用返信 編集キー/
■23945 / inTopicNo.17)  Re[12]: SQL文にNULLが入らない。
□投稿者/ ぽっち (39回)-(2008/08/25(Mon) 13:50:40)
No23930 (オガシン さん) に返信
> >>メソッドグループからObjectに変換出来ない
> このメッセージをだしている場所、例外の型はなんですか?
>
> for (int i = 1; i < 7; i++)
> {
> if (dt.Rows[0][i] == System.DBNull.Value)//←ここでNULLがどうか中身を見ている。
> {
> dt.Rows[0][i] = System.DBNull.Value;//※1
> }
> }
>
> ※1ここでしたい処理はなんですか?
> dt.Rows[0][i]がDBNullなら、dt.Rows[0][i]に(DBに解釈される)Nullをセットしたい。でしょうか?
> NullだったらNullを入れるってなると、別にNullなんだからそのままでいいんじゃないの?
> って思いましたが。

その通りです!!dt.Rows[0][i]で一個一個のデータ項目の中身を見て、中身が空っぽ("")だったら「NULL」をセットしたいのです。
今のままですと「""」となっているだけで「NULL」とは入らずに、そのままSQL文で吐き出された際に、一番はじめに書いたようになって
しまうのです。

つまり「NULL」という文字が入らずに「,,」で区切ってるだけになってしまい、SQL文が通らないのです。
引用返信 編集キー/
■23946 / inTopicNo.18)  Re[13]: SQL文にNULLが入らない。
□投稿者/ ぽっち (40回)-(2008/08/25(Mon) 13:51:46)
No23931 (やじゅ さん) に返信
> ようは、INSERT句の値にDBNullだったら文字列のNULLをセットしたいってことですよね。

その通りです。助言有難うございます。またVBでもソース判るので助かります!!
やっぱりif文ですよね。なかなかそこからNULLが入らないので・・・。
参考にします。
引用返信 編集キー/
■23948 / inTopicNo.19)  Re[13]: SQL文にNULLが入らない。
□投稿者/ ぽっち (41回)-(2008/08/25(Mon) 14:00:44)
ロック さん
オガシン さん
ネタ好き未記入 さん
みきぬ さん
やじゅ さん


皆様の助言とお力のお陰で、先ほど解決致しました!!

for (int i = 1; i < 7; i++)
{
if (dt.Rows[0][i] == System.DBNull.Value)
{
dt.Rows[0][i] = "NULL";
}
}

上記ソースで、無事「NULL」を入れることが出来ました。
こんな単純だったなんて・・・(string)convertutilityとかいろいろがんばってたのが悲しかったり・・・。
でも勉強になりました!!

皆さんのお陰です。ありがとうございました。
解決済み
引用返信 編集キー/
■23982 / inTopicNo.20)  Re[14]: SQL文にNULLが入らない。
 
□投稿者/ やじゅ (575回)-(2008/08/26(Tue) 06:52:20)
やじゅ さんの Web サイト
No23948 (ぽっち さん) に返信
> for (int i = 1; i < 7; i++)
> if (dt.Rows[0][i] == System.DBNull.Value)
> dt.Rows[0][i] = "NULL";
>

これは、たまたまデータタイプが全てString型なので問題ないのでしょうが
データタイプに数値型があった場合は例外エラーとなります。
INSERT句にセットする段階で個々に変換(変換用関数を作成するなどして)
するのがいいと思います。


これについては、既に■No23873にて、ロックさんが下記のように書かれていました。
>dt.Rows[0][i] = "NULL";
>で、目的の結果になるような気がしますが、データタイプがStringに
>なっていないと文字列で"NULL"が入らないので、それはそれで問題になるかと
>#dt.Rows[0][i]のデータタイプが数値とかなら別の変数に入れてなどの対応が必要になる
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -