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);
しかし、このようにそれを行うことは、あまりきちんとしておらず、簡単ではないようです。なぜこれが必要なのですか?シンプルなものを見落としていますか?
基準式の不一致の問題は、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);
}
ああ、まあ、これをよりよく説明する誰かを待っています。
最も単純なステートメントは、dbエンジンにそのNow()
関数を使用して現在の日付/時刻値を取得するように要求します。または、時刻に関心がない場合は、そのDate()
関数を使用できます。 Date()
は、実際には午前0時を時刻として提供します。
INSERT INTO [table] ([date]) VALUES (Now());
IOW、Accessデータベースに挿入するために.Net
の日付/時刻値をわざわざマッサージする必要はありません。
リテラルの日付値を含むINSERT
ステートメントが必要な場合は、#
日付区切り文字を使用してください。したがって、今日の日付を挿入するには:
INSERT INTO [table] ([date]) VALUES (#2013-04-25#);