Параметры Year, Month и Day описывают непредставляемый DateTime, как игнорировать - PullRequest
2 голосов
/ 20 мая 2011

Я использую ODBC для чтения данных из широко распространенной базы данных PSQL, и в некоторых сценариях столбец даты может содержать дату 00/00/0000. Меня действительно не волнуют недопустимые даты, поэтому есть какой-то способ, которым я могу преобразовать все эти непредставляемые даты в пустую или в какую-то определенную дату вместо того, чтобы запрос не удался.

EDIT:

Ниже показан код, который я использую, и где он терпит неудачу:

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 ]

2 голосов
/ 24 мая 2011

У меня была точно такая же проблема.Это было некоторое время назад, и я забыл точные детали, но проблема в том, что 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
1 голос
/ 24 мая 2011

@ SSS заставил меня подумать, что это можно сделать в запросе, хотя это немного затянуто:

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

Хотя мне бы хотелось, чтобы решение не зависело от того, что я должен помнить об этом всякий раз, когда я читаю базу данных!

1 голос
/ 20 мая 2011

Вы можете использовать nullable DateTime - если значение недопустимо, установите его null (Nothing), в противном случае укажите дату.

MyDate as Nullable(Of DateTime)
0 голосов
/ 20 мая 2011

Косвенно, если вы импортируете его в текстовое поле вместо даты, то на более позднем этапе вы можете идентифицировать и изменить текстовое значение по своему усмотрению.

...