2011-07-01 6 views
1

DbParameterとしてクエリにDateTime値を渡す際に問題があります。 DateTime値の時間部分が削除されたようです。ここでDateTime値をパラメータとしてOleDbCommandに渡す

は、C#のサンプルコードです:

DbProviderFactory _factory = OleDbFactory.Instance; 

DbCommand cmd = _factory.CreateCommand(); 
cmd.CommandText = "INSERT INTO SomeTable (SomeDateField) VALUES (?)"; 

DbParameter p = _factory.CreateParameter(); 
p.ParameterName = ""; // Not necessary 
p.Value = DateTime.Now; // assume Time != 00:00:00 
p.DbType = DbType.Date; // DateTime and DateTime2 don't work 

cmd.Parameters.Add(p); 

私の問題は、日付パラメータは、それが時間の一部だとSomeDateFieldは、常に時間として00:00:00があるとのアクセスに到達していないようだということです。 SomeDateFieldDateTimeないDateであるために確認してください、あなたのデータ型を作る

cmd.CommandText = "INSERT INTO SomeTable (SomeDateField) VALUES (#" + aDateTimeString + "#)"; 
+0

データ型とは何ですか?データベースのテーブルの列の?また、 'DbType.DateTime'は何を意味しますか? –

+0

DbType.DateTimeとDbType.DateTime2を使用すると、コマンドを実行するときに「条件式でデータ型が一致しません」という例外が発生します。 –

+0

私はAccessをバックエンドとして使用しているので、列データ型はDateですが、.NETのDateTimeと同等です。時間部分も含めることができます。 –

答えて

0

私のような何かを行うにはしたくありません。また、あなたがDbType.Dateの代わりにOleDbType.DateTimeを使用したい場合は

p.DbType = DbType.DateTime; 
+0

別のコメントで私が言ったように、私はDateTimeとDateTime2を使用すると例外が発生します。唯一のものは、日付です。 –

0

をしようと、私はそれが動作することを確認しています。

あなたの投稿からわかるように、あなたはそのように具体的ではなく、より一般的なDbType列挙型(およびクラス)を使用しますか?

しかし、データアクセスレイヤでは、より具体的なOleDbクラスを使用する必要があります。あまり指定されていない 'DbType'クラスを使用することは無用です。なぜなら、別のデータベース型をターゲットにしている場合、各DBMSは独自の方言を使用するため、SQL構文も変更する可能性が高いからです時にはマイナーチェンジだけですが、それでも...)。

+0

さて、あまり具体的でないインターフェースが公開されているコードで作業していたので、私はそれらを使用していました。私はそれを変えることができますが、それは必要ではないはずです。私はOleDbクラスを使ってみて、それが役立つかどうかを見てみましょう。 –

0

OleDbTypeは、あなたがDBType.DateTimeを使用する場合は、「パラメータのタイプは、.NET Frameworkデータプロバイダに固有であるのDateTime enumeratonに http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbtype.aspx

を持っていません。タイプを指定するパラメータの値を変換型が指定されていない場合、ADO.NETは、ParameterオブジェクトのValueプロパティからデータプロバイダ型のパラメータを推論します。 http://msdn.microsoft.com/en-us/library/system.data.dbtype.aspx

関連する問題