Articles
DBNull値をデータベースに挿入する
On 2月 9, 2021 by admin非常にうまく機能するコードがあります。より少ないコード行でそれをより良く書く方法についてのあなたの意見のいくつかが必要です。三項演算子を使用したいのですが、動作させることができなかったため、代わりにif else
を実行しました。
基本的に、価格を挿入します。データベース。価格列はNULL可能小数です。私のC#コードでも、「NULL可能小数でもあります。
if (items.Price == null) { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", DBNull.Value), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } else { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", items.Price), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } return i;
これは、else
ブロック?
コメント
- 生活を楽にしてORMを使用してみませんか? " ADO.Netコードを手動で記述している場合は、雇用主またはクライアントから盗んでいます。"
- @BCdotWEB数人のコーダーがその投稿にコメントしたので、人々がそのアドバイスに従った場合、私たちは'これらの美しいORMはすべてそこにありません。時には、古い職人的な方法で学ぶことが最善の方法です。私たちは困難について学び、解決する必要のある問題を発見します。
回答
必要なのは、 ?:
(三項演算子)を使用することだけです。 ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
または、拡張機能を作成することもできます:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
代わりに使用してください:
new SqlParameter("@Price", items.PriceOrDefault())
Price
はdecimal?
であるため、HasValue
プロパティの使用を検討し、値を交換することができます:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
これはnullチェックよりも見栄えが良いと思います。
コメント
- 申し訳ありません。 、しかし、私は下に波線がありました。 s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm
object
。例を編集しました。SqlParameter
はとにかくそれを期待しています。 - それはうまくいきます。ありがとう。これを拡張メソッドにラップします。ありがとうございます
- ヘルパーメソッドを使用する場合は、'より一般的な
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
を使用します。
回答
これを記述する最も簡潔で宣言的な方法は、C#の??
演算子。行は次のようになります。
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
ここでの式は、左オペランドのnull以外の値を返します(items.Price
)、または代わりにオペランドを右に返します。
推測していなかった場合は、??
演算子基本的には、operl != null ? operl : operr
の構文糖衣です。
コメント
- いいですね、私も実際にこれを知っていますしかし、' null可能でこのように機能するとは思いませんでした:-]
- null合体を使用するのが間違いなく最もクリーンなオプションです。
回答
これは個人的な好みによるものですが、もしあなたがそうするなら、 xtensionメソッドルート t3chb0tによって提案された。将来のNullable
使用する可能性のあるタイプで、さまざまなフィールドに対して非常によく似た外観の関数がたくさんあるわけではありません。次のようなもの:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
許可:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
など
コメント
- うわー、私は'がを使用するというアイデアを思いついたことがないと思いますnullable
?
onT
+struct
😉
回答
System.Dataを確認しましたか.SqlTypes 名前空間-特に SqlDecimal ?
他のいくつかの回答に基づいて、および??
演算子は次のとおりです:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
コメントを残す