怠日記

酒と趣味と仕事の記録

「パラメータ ?_1 にはデフォルト値はありません。」のエラー対策

ADO.NET で Access のデータを更新したとき、「パラメータ ?_1 にはデフォルト値はありません。」のエラーが起きた。

原因はパラメータ値にnullを設定していたから。

値を Null にするときは、DBNull.Valueか空文字を設定しなければならない。

var sql =
    " update EMPLOYEE " +
    "    set PHONENO = ?" +
    "  where EMPNO = ?";

using (var cmd = conn.CreateCommand())
{
    cmd.Transaction = tran;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sql;

    // ★パラメーターに null を設定するとSQL実行時にエラーになる
    cmd.Parameters.Add("PHONENO", OleDbType.VarChar).Value = null;

    cmd.Parameters.Add("EMPNO", OleDbType.VarChar).Value = txtEmpNo.Text;

    // SQL実行
    cmd.ExecuteNonQuery();
}

nullではなくDBNull.Valueとすればエラーは起きなくなる。

cmd.Parameters.Add("PHONENO", OleDbType.VarChar).Value = DBNull.Value;

空文字(string.Empty)でもいい。

cmd.Parameters.Add("PHONENO", OleDbType.VarChar).Value = string.Empty;

Microsoft Docs のDBNullクラスの説明に、nullと混同しないようにと説明あり。

null : オブジェクトへの参照がないことを意味する。

DBNull : 初期化されていないバリアントまたは存在しないデータベース列を表す。