2012-04-20 73 views
7

Tengo un FormView donde extraigo datos de una tabla (MS Access) y luego los inserto (más más datos) en otra tabla. Tengo problemas con las fechas.¿Insertar valores nulos en campos de fecha?

La primera tabla tiene dos campos de fecha: date_submitted y date_updated. En algunos registros, date_updated está en blanco. Esto hace que obtenga un error de desajuste de datos al intentar insertar en la segunda tabla.

Puede ser porque estoy vinculando el campo date_updated de la primera tabla a un campo oculto en el FormView. A continuación, toma el valor de la HiddenField y los intentos para insertarlo en la segunda tabla:

Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated") 
myDateRequestUpdated = hfDateRequestUpdated.Value 
'... It then attempts to insert myDateRequestUpdated into the database. 

Funciona cuando hay un valor allí, pero al parecer no se puede insertar nada en un campo de fecha/hora en Access . Supongo que podría hacer una segunda declaración de inserción que no se inserte en date_updated (para usar cuando no hay ningún valor en date_updated), pero ¿es esa la única manera de hacerlo? Parece que debería haber una manera más fácil/menos redundante.

EDITAR:

bien. Así que intenté insertar SqlDateTime.Null, Nothing y DBNull.Value. SqlDateTime.Null da como resultado que el valor 1/1/1900 se inserte en la base de datos. "Nada" hace que se inserte 1/1/2001. Y si trato de utilizar DBNull.Value, me dice que no se puede convertir a una cadena, así que tal vez no hice algo bastante allí. En cualquier caso, esperaba que si no había nada para insertar que el campo en el acceso permanecería en blanco, pero parece que tiene que llenarlo con algo ...

EDITAR:

I obtuvo DBNull.Value para que funcione, y sí inserta un valor completamente en blanco. Así que este es mi código de trabajo final:

Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated") 
Dim myDateRequestUpdated = Nothing 

If hfDateRequestUpdated.Value = Nothing Then 
    myDateRequestUpdated = DBNull.Value 
Else 
    myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value) 
End If 

¡Gracias a todos!

+3

No entiendo por qué había un downvote sobre esta cuestión. Lo he invertido, pero todavía estoy desconcertado. – Fionnuala

+0

Estoy de acuerdo, esta es una pregunta interesante. Estos campos de fecha siempre me muerden. – Steve

+0

¿Podría agregar un ejemplo de código que muestre cómo está insertando los datos? – phoog

Respuesta

3

Sara, ¿has probado a enviar la fecha/hora antes de actualizar? El error de discrepancia de datos probablemente proviene del hecho de que el hfDateRequestUpdated.Value que intenta insertar en la base de datos no coincide con el tipo de columna.

Intente recorrer su código y ver cuál es el tipo de ese valor. Si encuentra que se trata de una cadena (que parece que podría ser, dado que proviene de un campo de un formulario), primero deberá verificar si ese campo es la cadena vacía (VBNullString). Si es así, querrá cambiar el valor que está insertando en la base de datos al DBNull, que puede obtener en VB.Net usando DBNull.Value.

No podemos ver su código, por lo que no sabemos exactamente cómo se obtiene el valor en la base de datos, pero sería algo como esto

If theDateValueBeingInserted is Nothing Then 
    theDateValueBeingInserted = DBNull.Value 
EndIf 

Tenga en cuenta que la prueba anterior sólo funciona si el valor que obtienes de HiddenField es una cadena, que creo que corresponde al documentation. De allí es de donde provienen todos estos problemas que tienes.Usted está implícita la conversión de sus valores de fecha/hora para una cadena (que es fácil), pero implícitamente que la conversión de espalda no es tan fácil, sobre todo si el valor inicial fue un DBNull


lado

Creo que lo que Marshall estaba tratando de sugerir era el equivalente del código anterior, pero en una expresión de acceso directo llamado el 'operador ternario', que se ve así en VB.Net:

newValue = IF(oldValue is Nothing ? DBNull.Value : oldValue) 

I que está ldn't recomendaría sin embargo, ya que es confuso para los nuevos programadores, y la sintaxis cambió en 2008 de IFF(condition ? trueResult : falseResult)

2

Su código

Dim myDateRequestUpdated As DateTime 
myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value) : DBNull.Value() 

tiene un par de problemas:

  1. Cuando se declara myDateRequestUpdated para ser DateTime, no puede poner un DbNull.Value en él.
  2. no estoy seguro de lo que necesita el () para DBNull.Value: se trata de una propiedad, no es un método (no sé lo suficiente VB decir con seguridad)
  3. VB no sabe que : operador

Lo que probablemente desee es un Nullable(Of DateTime) para almacenar un valor de DateTime que también puede faltar.

A continuación, utilice algo como esto para almacenar el valor:

myDateRequestUpdated = If(String.IsNullOrWhiteSpace(hfDateRequestUpdated.Value), 
    Nothing, DateTime.Parse(hfDateRequestUpdated.Value)) 

Si hfDateRequestUpdated.Value está vacía, a continuación, utilizar Nothing como el resultado; de lo contrario, analizará el valor como fecha (¡que podría fallar si no es una fecha válida!).

+0

Ella solo probó ese código en primer lugar porque estaba tratando de seguir las instrucciones en la respuesta anterior, que fue escrita en C#. No creo que tuviera algo parecido a eso en su código original. En cualquier caso, su corrección a ese código editado es sonido. – Alain

1

Prueba esto:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Dim str As String 

    If TextBox1.Text.Length <> 0 Then 
     str = "'" & TextBox1.Text & "'" 
    Else 
     str = "NULL" 
    End If 

    sql = "insert into test(test1) values(" & str & ")" 
    dsave_sql(sql) 
End Sub 


Function save_sql(ByVal strsql As String, Optional ByVal msg As String = "Record Saved Sucessfully") As String 
    Dim sqlcon As New SqlConnection(strConn) 
    Dim comm As New SqlCommand(strsql, sqlcon) 
    Dim i As Integer 
    Try 
     sqlcon.Open() 
     i = CType(comm.ExecuteScalar(), Integer) 
     save_sql = msg 
    Catch ex As Exception 
     save_sql = ex.Message 
    End Try 
    sqlcon.Close() 
    Return i 
End Function