C#
Convert.ToString(DBNull.Value)の挙動
出典: SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム — ハマりポイント:5イディオム共通で踏むやつ / Convert.ToString(DBNull.Value)の挙動
//罠:DBNullが空文字に化ける
string bikou = Convert.ToString(row["bikou"]);
// row["bikou"] がDBNullの場合、bikouは""(空文字)になる
//「未入力」と「空文字」を区別したい画面で表示が崩れる
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「ハマりポイント:5イディオム共通で踏むやつ / Convert.ToString(DBNull.Value)の挙動」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
10 件DataRow row = dt.Rows[0]; object val = row["bikou"]; //この時点で値はobject型 string bikou = val is DBNull未収録
イディオム1: is DBNullで直接比較する基本形
#12f251f72d35
//整数列を扱う場合 int? amount = row["amount"] is DBNull ? (int?)null : Convert.ToInt32(row["amount"]);未収録
イディオム1: is DBNullで直接比較する基本形
#0dee0b27ad7e
//文字列列のnull安全取得 string bikou = Convert.IsDBNull(row["bikou"])? null : row["bikou"].ToString(); //あるいは??と組み合わせて空文字フォールバック未収録
イディオム2: Convert.IsDBNull + ??演算子のシンプルパターン
#769f7a7bda55
//罠:Convert.ToInt32(DBNull.Value)は0を返す int amount = Convert.ToInt32(row["amount"]); // row["amount"] がDBNullだとamount = 0になる //「金額0円」と「未入力」を区別したい業務系では事故の元未収録
イディオム2: Convert.IsDBNull + ??演算子のシンプルパターン
#f6d9581c23a1
using (var conn = new SqlConnection(connStr)) using (var cmd = new SqlCommand("SELECT id, name, amount FROM customers", conn)) { conn.Open();未収録
イディオム3: DataReader.IsDBNull(i)で読み取り時に分岐
#5206497a1ab8
//拡張メソッド化すると行が圧縮できる public static class SqlReaderExtensions { public static T? GetNullable<T>(this SqlDataReader reader, int ordinal)未収録
イディオム3: DataReader.IsDBNull(i)で読み取り時に分岐
#13fb96000b24
