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

@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 回答
1

您可以使用可为的DateTime - 如果该值无效,则将其设置为null( Nothing),否则设置为日期。

MyDate as Nullable(Of DateTime)
于 2011-05-20T15:57:28.423 回答
0

间接地,如果您将其导入文本字段而不是日期,则在稍后的步骤中,您可以根据需要识别和修改文本值。

于 2011-05-20T16:31:11.017 回答