web-dev-qa-db-ja.com

DateTime.NowをDate / Timeフィールドに挿入しようとすると、「データ型の不一致」エラーが発生します

MS-Accessデータベースのレコードに日時を書き込もうとすると、次のように簡単になります。

cmd.CommandText = "INSERT INTO [table] ([date]) VALUES (?)";
cmd.Parameters.AddWithValue("?", DateTime.Now);

「基準式のデータ型が一致しません」という例外が発生します。

誰か教えてもらえますか?ここで何が問題になっていますか?

少し実験したところ、書くとうまくいくことがわかりました

OleDbParameter parm = new OleDbParameter("?", OleDbType.Date);
parm.Value = DateTime.Now;
cmd.Parameters.Add(parm);

しかし、このようにそれを行うことは、あまりきちんとしておらず、簡単ではないようです。なぜこれが必要なのですか?シンプルなものを見落としていますか?

12
Mr Lister

基準式の不一致の問題は、AddWithValueを呼び出すときにDateTime.Now値を表すために使用されるパラメーターに割り当てられたOleDbTypeが原因です。

AddWithValueによって選択されたOleDbTypeはDBTimeStampですが、AccessはOleDbType.Dateを必要としています。

http://support.Microsoft.com/kb/320435

NETで検索すると、別の興味深いヒントが見つかりました。中心的な問題は、DateTime.Nowのミリ秒部分を処理できないOleDbParameterにあります。おそらく、OleDbTypeを強制的に日付にするミリ秒の部分は省略されています。また、日付からミリ秒を削除すると、挿入はDBTimeStampタイプでも機能することがわかりました。

cmd.Parameters.AddWithValue("?", GetDateWithoutMilliseconds(DateTime.Now));

private DateTime GetDateWithoutMilliseconds(DateTime d)
{
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
}

ああ、まあ、これをよりよく説明する誰かを待っています。

23
Steve

最も単純なステートメントは、dbエンジンにそのNow()関数を使用して現在の日付/時刻値を取得するように要求します。または、時刻に関心がない場合は、そのDate()関数を使用できます。 Date()は、実際には午前0時を時刻として提供します。

INSERT INTO [table] ([date]) VALUES (Now());

IOW、Accessデータベースに挿入するために.Netの日付/時刻値をわざわざマッサージする必要はありません。

リテラルの日付値を含むINSERTステートメントが必要な場合は、#日付区切り文字を使用してください。したがって、今日の日付を挿入するには:

INSERT INTO [table] ([date]) VALUES (#2013-04-25#);
4
HansUp