2

ODBCを使用してパーベイシブPSQLデータベースからデータを読み取りますが、一部のシナリオでは、日付列に00/00/0000の日付を含めることができます。無効な日付はあまり気にしないので、クエリが失敗する代わりに、これらの表現できない日付をすべてNullまたは特定の日付に変換する方法はありますか。

編集:

以下は、私が使用しているコードとそれが失敗している場所を示しています。

Private _connODBC As OdbcConnection

Dim dt As New DataTable
_connODBC = New OdbcConnection(txtConnectionString.Text)
_connODBC.Open()

Dim dataadapter = New OdbcDataAdapter(QueryString, _connODBC)
dataadapter.Fill(dt) '<--- This line throws the unrepresentable date time error
_connODBC.Close()
4

4 に答える 4

2

私はこれとまったく同じ問題を抱えています。少し前のことで、正確な詳細を忘れてしまいましたが、問題は、Pervasive.SQLが&H0(つまりゼロ)を使用して欠落している日付を表しているのに、&H0がODBCの日付フィールドに対して無効であるということです。

私の解決策は、フィールドをSQLの文字列にキャストすることだったので、QueryStringでこれを使用します:CONVERT(datefield、SQL_CHAR)

次に、それを日付に戻すために次の関数を作成しました(&H0は新しい日付になります)。

 ''' <summary>
''' Enables a Btrieve Date column that contains 0x0 values to be accessed. Use 'SELECT CONVERT(datefield, SQL_CHAR)' to access the field, then this function to convert the result back to a date. A New Date is returned if the record has a 0x0 date
''' </summary>
''' <param name="Expression"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function SQL_CHAR2Date(ByVal Expression As String) As Date
    'check Expression is in the correct format
    Dim strMap As String = ""
    For i As Integer = 0 To Expression.Length - 1
        Select Case Expression.Substring(i, 1)
            Case "0" To "9" : strMap &= "0"
            Case "-" : strMap &= "-"
            Case Else : strMap &= Expression.Substring(i, 1)
        End Select
    Next i
    Select Case strMap
        Case "0000-00-00"
        Case Else
            Throw New ApplicationException("SQL_CHAR2Date: invalid input parameter")
    End Select

    Dim y As Integer = CInt(Expression.Substring(0, 4))
    Dim m As Integer = CInt(Expression.Substring(5, 2))
    Dim d As Integer = CInt(Expression.Substring(8, 2))

    If y = 0 And m = 0 And d = 0 Then
        Return New Date
    Else
        Return DateSerial(y, m, d)
    End If
End Function
于 2011-05-24T04:42:31.187 に答える
1

null許容のDateTimeを使用できます。値が無効な場合はnullNothing)に設定し、そうでない場合は日付に設定します。

MyDate as Nullable(Of DateTime)
于 2011-05-20T15:57:28.423 に答える
1

@SSSは、これはクエリで実行できると思いましたが、少し時間がかかります。

SELECT CASE CONVERT([updated date], SQL_CHAR) 
WHEN '0000-00-00' THEN NULL 
ELSE [updated date] END 
AS [updated date] FROM fingerscans

私は解決策を望んでいますが、データベースを読み取るたびにこれを行うことを覚えておく必要はありません!

于 2011-05-24T08:19:37.363 に答える
0

間接的に、日付ではなくテキストフィールドにインポートすると、後のステップで、テキスト値を好きなように識別して変更できます。

于 2011-05-20T16:31:11.017 に答える