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!
コメントを投稿