0
c = new TableCell();
decimal pembayaran = Db.SingleDecimal("Select (valuta) from ArInvoice where customerID='01');
c.Text = Cf.Num(pembayaran);
c.Attributes["style"] = "text-align: right;";
tr.Cells.Add(c);

クエリに値がある場合は機能しますが、結果がnullの場合はこのエラーが含まれます「オブジェクトはDBNullから他の型にキャストできません」

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

0

問題は、次のメソッド呼び出しにあります。

Db.SingleDecimal("Select (valuta) from ArInvoice where customerID='01');

質問でメソッド定義が提供されていないため、正確に何をするのかわかりませんが、DBNull値を別の型に変換しようとしていると推測しています。より良いヘルプのためにそのメソッドの正確な定義を示す必要がありますが、通常は次のDBNullように処理します。

var myDecimal = dr.IsDBNull(0) ? 0M : dr.GetDecimal(0); // get a decimal from the first column
于 2012-08-13T05:54:23.470 に答える
0

私はSingleDecimalメソッドを備えたツールに直接精通していないので、一般的な意味で答えます:

ADO.NET からデータを (直接的または間接的に) クエリする場合、(おそらく両方) ある種の「リーダー」API (ほとんどのIDataReader場合) を取得するか、生のobject値を取得する可能性が高くなります。

最初のケースでは、IsDBNull(列ごとに) メソッドにアクセスできる必要があります。そのメソッドを呼び出して、ヌルでやりたいことを何でもしてください。

2 番目のケースでは、 の値を確認する必要がありDBNullますif(val is DBNull

どちらの場合も、コードが次に何をするかはライブラリ次第です。どちらの場合も、 null に似た2 つのシナリオ (行がない場合と単一の値を持つ行)について考える必要があるかもしれません。

率直に言って、どちらの場合も、これを既にサポートしているライブラリ/ツールを使用する方が簡単です。たとえば、dapper の場合、これは次のようになります。

string customerId = "01";
decimal? pembayaran = Db.Query<decimal?>(
    "Select valuta from ArInvoice where customerID=@customerId",
    new { customerId }).Single();

これにより、次のことが得られます。

  • 正しいパラメータ化
  • null 処理
  • すべてのデータをクエリするための同じ API ( Query<T>)
  • Single()序数 ( 、First()ToList()など)に好きな LINQ を使用する機能

デフォルト値を使用したい場合 (decimal?セルの値が のときに空ではなく、次のnullように使用できます。

decimal pembayaran = Db.Query<decimal?>(
    "Select valuta from ArInvoice where customerID=@customerId",
    new { customerId }).Single() ?? 0M;

ここで、 はの代わりに?? 0Mゼロを取得するための null 合体操作に過ぎないことに注意してください。decimalnull

于 2012-08-13T05:57:21.927 に答える
0

私は自分の質問から答えを見つけました。sql でselect isnull((valuta),0)を使用しているため、結果が DbNull の場合は 0 に置き換えられます。

decimal pembayaran = Db.SingleDecimal("Select isnull((valuta),0) from ArInvoice where customerID='01');

ただし、結果が DbNull の場合に何らかのアクションを実行したい場合 (デフォルト値を設定するだけでなく)、Eren Ersönmez または Marc Gravell の回答を試すことができます。ハッピーコーディング:D

于 2012-08-15T07:03:14.103 に答える