トップ回答者
MSOLEDBSQLを用いたDBアクセスについて

質問
-
お世話になります。
VB.NET2.0+SQLServer2014にてwebアプリケーションの開発を行っております。
DB接続文字列に使用しているproviderをSQLOLEDBからMSOLEDBSQLに変更を行った際に、
以下のWhere句を使用した箇所でDB接続を行うとエラーが発生してしまい、修正方法をご教授頂きたく投稿させていただきました。
【テーブル:WKT_HOGE】
列名:DATA_NOW
データ型:datetime2(7)
【接続文字列(マスクしています)】
<add name="ConnectionString" connectionString="Provider=MSOLEDBSQL;Data Source=192.168.10.100;Persist Security Info=True;Initial Catalog=hoge-db;User ID=sa;Password=Password" providerName="System.Data.OleDb"/>
【該当箇所例】
cmd.CommandText = "SELECT * WKT_HOGE WHERE DATA_NOW <= ?;"
cmd.Parameters.Clear()
cmd.Parameters.Add("", OleDbType.DBTimeStamp, 1).Value = System.DateTime.now
cmd.ExecuteNonQuery()
【エラー内容】
指定された時間値の小数部分が、対応する SQL Server パラメーターまたは列の小数点以下桁数を超えています。このエラーを解決するには、DBPARAMBINDINFO の bScale または列の小数点以下桁数を増やしてください。
※System.DateTime.nowをFormat(System.DateTime.Now, "yyyy-MM-dd hh:mm:ss.fffffff")としても同様なエラーが発生するので、修正方法がますますわからなくなってしまった次第です。
もしも初歩的なご質問でしたら大変恐縮です。
どうぞよろしくお願い致します。
- 編集済み 徳井さゆき 2018年11月19日 9:42
回答
-
datetime2(7)は桁数が大きいのでOleDbParameterのPrecisionプロパティ(最大桁数)とScaleプロパティ(小数点桁数)を調整してみるとか
Module Module1 Sub Main() Dim connectionString As String = "Provider = MSOLEDBSQL;Server=(local);Database=Test;Integrated Security=SSPI;" Using con As New System.Data.OleDb.OleDbConnection(connectionString) con.Open() Dim cmd = con.CreateCommand() cmd.CommandText = "SELECT * FROM WKT_HOGE WHERE DATA_NOW <= ?;" cmd.Parameters.Clear() Dim para As OleDb.OleDbParameter = cmd.Parameters.Add("", System.Data.OleDb.OleDbType.DBTimeStamp, 1) para.Precision = 27 para.Scale = 7 para.Value = System.DateTime.Now Dim reader = cmd.ExecuteReader() Do While (reader.Read()) For i As Integer = 0 To reader.FieldCount - 1 Dim obj As Object obj = reader(i) If (obj Is Nothing) Then obj = "" End If If (TypeOf obj Is DateTime) Then Dim dt As DateTime dt = CDate(obj) Console.Write(dt.ToString("yyyy/MM/dd HH:mm:ss.fffffff") + vbTab) Else Console.Write(obj.ToString() + vbTab) End If Next Console.WriteLine() Loop End Using End Sub End Module
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
すべての返信
-
datetime2(7)は桁数が大きいのでOleDbParameterのPrecisionプロパティ(最大桁数)とScaleプロパティ(小数点桁数)を調整してみるとか
Module Module1 Sub Main() Dim connectionString As String = "Provider = MSOLEDBSQL;Server=(local);Database=Test;Integrated Security=SSPI;" Using con As New System.Data.OleDb.OleDbConnection(connectionString) con.Open() Dim cmd = con.CreateCommand() cmd.CommandText = "SELECT * FROM WKT_HOGE WHERE DATA_NOW <= ?;" cmd.Parameters.Clear() Dim para As OleDb.OleDbParameter = cmd.Parameters.Add("", System.Data.OleDb.OleDbType.DBTimeStamp, 1) para.Precision = 27 para.Scale = 7 para.Value = System.DateTime.Now Dim reader = cmd.ExecuteReader() Do While (reader.Read()) For i As Integer = 0 To reader.FieldCount - 1 Dim obj As Object obj = reader(i) If (obj Is Nothing) Then obj = "" End If If (TypeOf obj Is DateTime) Then Dim dt As DateTime dt = CDate(obj) Console.Write(dt.ToString("yyyy/MM/dd HH:mm:ss.fffffff") + vbTab) Else Console.Write(obj.ToString() + vbTab) End If Next Console.WriteLine() Loop End Using End Sub End Module
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)