我使用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()
答案 0 :(得分:2)
我遇到了同样的问题。这是一段时间以前,我忘记了确切的细节,但问题是Pervasive.SQL使用&amp; H0(即零)表示缺少日期,但&amp; H0对ODBC中的日期字段无效。 / p>
我的解决方案是将字段转换为SQL中的字符串,因此在QueryString中使用它:CONVERT(datefield,SQL_CHAR)
然后我编写了以下函数将其转换回日期(&amp; 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
答案 1 :(得分:1)
您可以使用nullable日期时间 - 如果值无效,则将其设置为null
(Nothing
),否则设置为日期。
MyDate as Nullable(Of DateTime)
答案 2 :(得分:1)
@SSS让我觉得这可以在查询中完成,虽然它有点长篇大论:
SELECT CASE CONVERT([updated date], SQL_CHAR)
WHEN '0000-00-00' THEN NULL
ELSE [updated date] END
AS [updated date] FROM fingerscans
虽然我希望解决方案不依赖于我每次阅读数据库时都要记得这样做!
答案 3 :(得分:0)
间接地,如果将其导入文本字段而不是日期,则在稍后的步骤中,您可以根据需要识别和修改文本值。