C#、.NET、SQL Server で `DBNull` 値を扱うためのベストプラクティス
C#、.NET、SQL Server での DBNull 値の扱い方
ここでは、C#、.NET、SQL Server で DBNull
値を扱うためのベストプラクティスについて説明します。
DBNull.Value プロパティを使う
DBNull
値を扱う最も一般的な方法は、DBNull.Value
プロパティを使うことです。DBNull.Value
は、Object
型の特殊な値で、データベースに値が存在しないことを表します。
// データベースから値を取得
object value = reader["columnName"];
// DBNull かどうかをチェック
if (value == DBNull.Value)
{
// 値が存在しない場合の処理
}
else
{
// 値が存在する場合の処理
}
IsDBNull メソッドを使う
IsDBNull
メソッドは、オブジェクトが DBNull
値かどうかを判断するために使用できます。
// データベースから値を取得
object value = reader["columnName"];
// DBNull かどうかをチェック
if (DBNull.IsDBNull(value))
{
// 値が存在しない場合の処理
}
else
{
// 値が存在する場合の処理
}
ヌル許容型を使う
C# 8.0 以降では、ヌル許容型を使用して DBNull
値をより安全に処理することができます。ヌル許容型は、値が null または DBNull
である可能性を明示的に表す型です。
// ヌル許容型で変数を宣言
string? name = reader["columnName"] as string;
// 値が存在するかどうかをチェック
if (name is not null)
{
// 値が存在する場合の処理
}
else
{
// 値が存在しない場合の処理
}
データベーススキーマで NULL を許可する
データベーススキーマで列を NULL
許容として定義することで、DBNull
値の発生を減らすことができます。
CREATE TABLE MyTable (
Name VARCHAR(50) NULL,
Age INT NULL
);
デフォルト値を設定する
CREATE TABLE MyTable (
Name VARCHAR(50) DEFAULT 'John Doe',
Age INT DEFAULT 18
);
using System;
using System.Data.SqlClient;
namespace DbNullSample
{
class Program
{
static void Main(string[] args)
{
// データベース接続文字列
string connectionString = "Data Source=localhost;Initial Catalog=Test;Integrated Security=True";
// SqlConnection オブジェクトを作成
using (SqlConnection connection = new SqlConnection(connectionString))
{
// SqlCommand オブジェクトを作成
using (SqlCommand command = new SqlCommand("SELECT Name, Age FROM MyTable", connection))
{
// SqlConnection を開く
connection.Open();
// SqlDataReader オブジェクトを作成
using (SqlDataReader reader = command.ExecuteReader())
{
// データを読み込む
while (reader.Read())
{
// Name 列の値を取得
string name = reader["Name"] as string;
// Age 列の値を取得
int? age = reader["Age"] as int?;
// 値が存在するかどうかをチェック
if (name is not null)
{
Console.WriteLine("Name: {0}", name);
}
else
{
Console.WriteLine("Name: NULL");
}
if (age is not null)
{
Console.WriteLine("Age: {0}", age);
}
else
{
Console.WriteLine("Age: NULL");
}
Console.WriteLine();
}
}
}
}
}
}
}
このコードは、MyTable
テーブルから Name
列と Age
列の値を読み込み、DBNull
値かどうかをチェックして出力します。
実行結果
Name: John Doe
Age: 30
Name: Jane Doe
Age: NULL
DBNull
値の処理を簡略化するために、拡張メソッドを作成することができます。
public static bool IsNull(this object value)
{
return value == DBNull.Value;
}
この拡張メソッドを使うことで、以下のようにコードを簡潔に記述することができます。
// データベースから値を取得
object value = reader["columnName"];
// 値が存在するかどうかをチェック
if (value.IsNull())
{
// 値が存在しない場合の処理
}
else
{
// 値が存在する場合の処理
}
テンプレートリテラルを使う
C# 6.0 以降では、テンプレートリテラルを使用して、DBNull
値をより分かりやすく処理することができます。
string name = reader["Name"] as string;
string message = $"Name: {(name is null ? "NULL" : name)}";
Console.WriteLine(message);
LINQ を使う
LINQ を使用して、DBNull
値を処理することもできます。
var results = from row in reader.AsEnumerable()
where row["Name"] != DBNull.Value
select new
{
Name = row["Name"] as string,
Age = row["Age"] as int?
};
foreach (var result in results)
{
Console.WriteLine("Name: {0}", result.Name);
Console.WriteLine("Age: {0}", result.Age);
}
c# .net sql-server