none
MSOLEDBSQLを用いたDBアクセスについて RRS feed

  • 質問

  • お世話になります。

    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:36

回答

  • 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!)

    2018年11月19日 11:15

すべての返信

  • 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!)

    2018年11月19日 11:15
  • Precisionプロパティ(最大桁数)とScaleプロパティ(小数点桁数)を明示的に設定することで無事動作するようになりました。

    ありがとうございました。

    2018年11月20日 5:35