2008年8月28日木曜日

.NET DbParameterでAccessの時間を含む日付型フィールドのパラメータを作成できない

Accessデータベースの日付型フィールドを、System.Data.Common.DbParameterで処理する際
DbTypeプロパティの設定に注意する必要があります。

日付型フィールドに時間を含まない場合、
DbParameterのDbTypeプロパティはDbType.Dateで問題なく動作しますが
日付型フィールドに時間を含む場合、
DbParameterのDbTypeプロパティをDbType.DateTimeにすると「OleDbException:抽出条件でデータ型が一致しません。」と例外が発生します。


DbParameterをOleDbParameterにキャストしOleDbType.Dateを指定しなければいけません。

Dim setting As ConnectionStringSettings
setting = ConfigurationManager.ConnectionStrings("MyAccessDb")

Dim factory As DbProviderFactory
factory = DbProviderFactories.GetFactory(setting.ProviderName)

Using cnn As DbConnection = factory.CreateConnection
cnn.ConnectionString = setting.ConnectionString
Using cmd As DbCommand = factory.CreateCommand
cmd.Connection = cnn
cmd.CommandText = "INSERT INTO MyTable (MyDate) Values (@MyDate)"
Dim prm As DbParameter = factory.CreateParameter
prm.ParameterName = "MyDate"
'時間を含む日付パラメータ
prm.DbType = DbType.DateTime
     If TypeOf (prm) Is OleDb.OleDbParameter AndAlso dbtype = Data.DbType.DateTime Then     
CType(prm, OleDb.OleDbParameter).OleDbType = OleDb.OleDbType.Date
End If
prm.Value = Me.DateTimePicker1.Value
cmd.Parameters.Add(prm)

cnn.Open()
Try
cmd.ExecuteNonQuery()
Finally
cnn.Close()
End Try
End Using
End Using

2 件のコメント:

匿名 さんのコメント...

Thanks for your post.

Seems it's really hard to write a real generic code that can operates all kinds of DBs.

---- Hanson.S

匿名 さんのコメント...

Thanks!