Estoy recibiendo esta excepción de los siguientes VB.NET código sólo para algunos meses:

System.InvalidCastException: Conversion from type 'DBNull' to type 'Date' is not valid.

Sucede en la línea de:

If CDate(dRow("CompleteDate")).ToString("d") = arrWeekYear(i, 1).ToString("d") Then

Si lo entiendo correctamente, entonces el problema es que estoy tratando de comparar algunos valores NULL para CompleteDate a un valor no NULO.

¿Cómo puedo solucionar este problema? Para algunas fechas, este código funciona perfectamente. Sin embargo, para algunos de los más recientes registros, no. Pero soy capaz de conseguir la salida de la T-SQL de la consulta con el mismo rango de fecha y no hay errores; se ejecuta rápidamente también. Y me examinó este de consultas T-SQL para ambos «Date_Completed» y «Review_Date» valores NULOS, pero de cualquier manera, «CompleteDate» fue siempre = valor NO Nulo. Así que no entiendo lo que está ocurriendo.

Aquí está mi VB.NET consulta:

            commandstring = "SELECT Batch_Records.Part_Number, Batch_Records.Lot_Number, Batch_Records.Date_Received, " & _
                "IsNull([Date_Completed], [Review_Date]) AS [CompleteDate], Batch_Records.Error, " & _
                "Batch_Records.[Group], Batch_Records.MFG, Batch_Records.MFG2, Batch_Records.QC, Batch_Records.QC2, " & _
                "QC_CODES.CODE_DESC, DATEADD(DD, 1 - DATEPART(DW, Batch_Records.Date_Received), Batch_Records.Date_Received) AS SundayDate " & _
                "FROM EXCEL.Batch_Records LEFT JOIN EXCEL.QC_CODES ON Batch_Records.Part_Number = QC_CODES.CODE_ID " & _
                "WHERE (Batch_Records.[Group]" & TheGroup & " AND Batch_Records.Date_Received > '" & FirstWeek & "' AND Batch_Records.Date_Received < dateadd(Day, 1, '" & LastWeek & "'))" & _
                   "ORDER BY Batch_Records.Date_Received"

Cuando puedo añadir esta línea sobre el error causantes de la línea de arriba, mi informe el tiempo de espera para estos meses. Entonces, ¿qué hacer?

If Not dRow("CompleteDate") Is System.DBNull.Value Then
  • NOOOO!! No utilizar la concatenación de cadenas para sustituir valores en sus consultas! no lo hagas!
  • Tiene razón, con este código puede ser fácilmente sql inyectado !!!
  • En su consulta, es EXCEL el esquema, o unirse en contra de una hoja de excel de alguna manera? O estamos tratando con SQL?
  • ¿Cuál es el tipo de datos de la CompleteDate columna?
  • +1 a David para explicar ¿por qué es tan malo!!!
InformationsquelleAutor user371819 | 2011-07-14

2 Comentarios

  1. 5

    comprobar el valor null con dRow.IsNull(«CompleteDate») antes de pedir el valor.

    O si este se ‘supone’ imposible, cambiar tu consulta no regresar nunca filas donde puede ser null.

    • Creo que el OP es el uso de un objeto DataRow, por lo que la función correcta es IsNull. Si se trataba de un DataReader, estás en lo correcto sería IsDBNull.
    • Usted se haga mi culpa 🙁
    • Gracias Joel, pero esto no funciona. IsNull no es un reconocido VB.NET la función. Y traté de IsDBNull, pero esto provocó un error de compilación causa que no es la forma correcta de tipo de datos. Sólo mi manera de ver las puedo usar IsDBNull es hacer por separado «Si» declaración como he explicado anteriormente. Pero de que se agote el tiempo de espera en mí. Otras sugerencias?
    • ¿qué es el drow? Un DataRow? Este es el método que yo estaba hablando: msdn.microsoft.com/en-us/library/3fwatee0.aspx
    • sí, es un DataRow
    • Así que si usted sigue este enlace, verás que en realidad es un método, pero usted está llamando a lo malo. Trate de Console.WriteLine(drow.IsNull("FirstName"))
    • Gracias chicos, he añadido esto ahora, pero todavía es tiempo de espera. Y he aumentado el conjunto de datos de tiempo de espera a 12000, pero aún es tiempo de espera. Déjame saber si tienes otras ideas. (Yo también traté de seleccionar sólo la parte superior de 1000 filas y, a continuación, se termina). Hay definitivamente algunas NULL fecha de los valores en este rango de fecha, aunque, basado en mis resultados de la consulta SQL

  2. 0

    Yo uso un sub (diferente para cada tipo de datos) para obtener los datos de un Datareader, mediante el uso del índice en lugar del nombre, sin embargo:

    #If Access Then
    <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    Friend Function GetDbStringValue(ByVal Dr As OleDbDataReader, ByVal nr As Integer) As String
    #Else
    <Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
    Friend Function GetDbStringValue(ByVal Dr As MySqlDataReader, ByVal nr As Integer) As String
    #End If
        If IsDBNull(Dr.Item(nr)) Then
            Return ""
        Else
            Return Dr.GetString(nr).TrimEnd
        End If
    End Function

Dejar respuesta

Please enter your comment!
Please enter your name here