プロが教えるわが家の防犯対策術!

C#でDataTable型のNUMBER型列にNULL or 0より大きい値を代入したく思っています。
とりあえずはできたのですが、いかんせんスマートではないため、綺麗にしたいのですが、どうにもうまくいきません。
ご教授頂けないでしょうか。

<とりあえず動いていた処理サンプル>
decimal a = 0;
if(条件) { a = 10; }
if(a == 0){
table[列名] = DBNull.Value;
}
else{
table[列名] = a;
}

※テーブルは作成済

上記を1行処理などスマートにできないものかと考えていますが、いくつか試したもののうまくいかず...
やってみたのは下記になります。

<条件代入>
decimal a = 0;
if(条件) { a = 10; }
table[列名] = a == 0 ? DBNull.Value : a;

これは代入2つの型合わずでエラー。

<DataColumn使用>
DataColumn dc = table.Columns[列名];
dc = DBNull.Value;
if(条件) {dc = 10;}
table[列名] = dc;

これはdcにDBNull.Value代入でエラーとなります。

案として出しているものは、どっちがいい、などのこだわりはないです。
キャストやDataColumn 型の使い方を変えれば動くのかもしれませんが、方法が分かりません。
申し訳ありませんが、ご教授お願い致します。

質問者からの補足コメント

  • すみません。
    タイトルにDataColumn と書いていますが、条件代入で通せるなら、何がなんでもDataColumn を、というわけではありません。

      補足日時:2018/03/15 10:20

A 回答 (2件)

とりあえずボックス化で型を合わせれば3項演算子は動くとは思います。


table[列名] = a == 0 ? DBNull.Value : (object)a;
(tableという変数がDataTableではなくDataRowだった場合)

案を見る限り、DataTable,DataColumn,DataRowがどういったものかわかっていなさそうなので、
その3つがどういったものかを理解したほうが良いかと思われます。
(1行で書く構文よりよっぽど重要)
    • good
    • 0
この回答へのお礼

助かりました

ご回答ありがとうございました。

tableはDataRowでした。
説明不足ですみません。

object型へのキャストで動くことは、私も実際にやってみて確認が取れました。
(デバッグが通った程度の確認なので、SQLにINSERTをして別途確認します)

DataTable etcは仰る通り勉強不足です。
単純にDataTableはDataRowの集合体。
DataRowはDataColumnの集合体。
という感じに考えています。
そのため、
DataRow[列名]は「DataColumn = DataRow[列名]」と一緒。
DataRow[列名] = DBNull.Value が可なのに、DataColumn = DBNull.Valueはなぜできん!
みたいな気持ちでした。
もっと深いところまで見て、DataTable関連については勉強します。

お礼日時:2018/03/15 16:26

https://msdn.microsoft.com/ja-jp/library/bb35303 …

これ使って、
変数名はそのままで書くと、

decimal? a;

// どっかでaの値が決まる
a = b == 0 ? null : b;

table.SetField("列名", a);
じゃダメ?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

途中参加のプロジェクトでして、他ソースを見た感じでDataRowはDBNull.Valueくらいしかブランクは入れられないものと思ってしまっていました。
null許容のデータセットメソッドがあったのですね。
助かります。
先の回答内容とプロジェクトのコーディングルールなどを吟味して、対応していこうと思います。
SetFieldメソッドは画期的でしたので、ベストアンサーとさせて頂きます。

お礼日時:2018/03/16 06:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!