2012-04-20 1 views
7

Ich habe ein FormView, wo ich Daten aus einer Tabelle (MS Access) ziehen und dann (plus weitere Daten) in eine andere Tabelle einfügen. Ich habe Probleme mit den Daten. Die erste Tabelle hat zwei Datumsfelder: date_submitted und date_updated. In einigen Datensätzen ist date_updated leer. Dies führt dazu, dass ich einen Datenkonfliktfehler erhalte, wenn ich versuche, in die zweite Tabelle einzufügen.Nullwerte in Datumsfelder einfügen?

Es könnte sein, weil ich das date_updated Feld von der ersten Tabelle in ein HiddenField auf dem FormView binding. Es dauert dann den Wert aus dem Hidden und versucht, es in die zweite Tabelle einzufügen:

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

Es funktioniert, wenn es dort ein Wert ist, aber anscheinend kann man nicht nichts in ein Datum/Zeit-Feld in Access einfügen . Ich nehme an, ich könnte eine zweite Insert-Anweisung machen, die nicht in date_updated einfügen (zu verwenden, wenn es keinen Wert in date_updated gibt), aber ist das der einzige Weg, es zu tun? Scheint so, als sollte es einen einfacheren/weniger redundanten Weg geben.

EDIT:

Okay. Also habe ich versucht, SqlDateTime.Null, Nothing und DBNull.Value einzufügen. SqlDateTime.Null führt dazu, dass der Wert 1/1/1900 in die Datenbank eingefügt wird. "Nichts" bewirkt, dass 1/1/2001 eingefügt wird. Und wenn ich versuche, DBNull.Value zu verwenden, sagt es mir, dass es nicht in eine Zeichenkette umgewandelt werden kann, also habe ich vielleicht etwas ganz dort nicht richtig gemacht. Auf jeden Fall, ich hatte gehofft, dass, wenn es nichts zu legen, dass das Feld in Access würde leer bleiben, aber es scheint, dass es mit etwas ...

EDIT zu füllen hat:

I hat DBNull.Value funktioniert, und es fügt einen vollständig leeren Wert ein. Also das ist mein letzter Arbeitscode:

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 

Danke allen!

+3

Ich verstehe nicht, warum es ein downvote auf diese Frage war. Ich habe es umgekehrt, aber ich bin immer noch verwirrt. – Fionnuala

+0

Ich stimme zu, das ist eine interessante Frage. Diese Datumsfelder beißen mich immer. – Steve

+0

Können Sie ein Codebeispiel hinzufügen, das zeigt, wie Sie die Daten einfügen? – phoog

Antwort

3

Sara, hast du versucht, das Datum/die Uhrzeit vor dem Update zu übertragen? Der Dateninkompatibilitätsfehler stammt wahrscheinlich von der Tatsache, dass die , die Sie versuchen, in die Datenbank einzufügen, nicht mit dem Spaltentyp übereinstimmt.

Versuchen Sie, durch Ihren Code zu gehen und zu sehen, was der Typ dieses Wertes ist. Wenn Sie feststellen, dass es sich um eine Zeichenkette handelt (wie es scheint, da sie von einem Feld in einem Formular kommt), müssen Sie zuerst prüfen, ob dieses Feld die leere Zeichenkette ist (VBNullString). Wenn dies der Fall ist, möchten Sie den Wert, den Sie in die Datenbank einfügen, in DBNull ändern, den Sie in VB.Net unter DBNull.Value erhalten können.

Wir können Ihren Code nicht sehen, so dass wir nicht genau wissen, wie Sie den Wert in die Datenbank zu erhalten, aber es wäre nur etwas so aussehen

If theDateValueBeingInserted is Nothing Then 
    theDateValueBeingInserted = DBNull.Value 
EndIf 

Beachten Sie, dass der obige Test funktioniert, wenn der Wert, den Sie von HiddenField erhalten, eine Zeichenkette ist, von der ich glaube, dass sie der documentation entspricht. Das ist wahrscheinlich der Punkt, von dem all diese Probleme kommen.Sie Ihre Zeit/Datum-Werte in eine Zeichenfolge implizit konvertieren (was einfach ist), aber sie implizit Umwandlung ist wieder nicht so einfach, vor allem, wenn der Anfangswert ein DBNull


war beiseite

ich denke, was Marshall versucht, das Äquivalent des obigen Codes vorzuschlagen, sondern in einer Verknüpfung Ausdruck des ‚ternäre Operator‘ genannt, die in VB.Net wie folgt aussieht:

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

I wou obwohl ldn't es empfehlen, da es um neue Programmierer verwirrend ist, und die Syntax geändert im Jahr 2008 von IFF(condition ? trueResult : falseResult)

2

Ihr Code

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

hat ein paar Probleme:

  1. Wenn Sie erklären myDateRequestUpdated um DateTime zu sein, können Sie keinen DbNull.Value darin setzen.
  2. Ich bin nicht sicher, dass Sie die () für DBNull.Value müssen: es ist eine Eigenschaft ist, kein Verfahren
  3. VB nicht weiß (ich sicher zu sagen, nicht genug VB wissen), dass : Betreiber

Was Sie wahrscheinlich wollen, ist ein Nullable(Of DateTime), um einen DateTime-Wert zu speichern, der auch fehlen kann.

Dann so etwas wie diese, um den Wert zu speichern:

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

Wenn hfDateRequestUpdated.Value leer ist, dann Nothing als Ergebnis verwenden; Andernfalls kann der Wert als Datum analysiert werden (was fehlschlagen kann, wenn es kein gültiges Datum ist!).

+0

Sie hat diesen Code nur ausprobiert, weil sie versuchte, den Anweisungen in der vorherigen Antwort zu folgen, die in C# geschrieben wurde. Ich glaube nicht, dass sie in ihrem ursprünglichen Code etwas Ähnliches hatte. In jedem Fall ist Ihre Korrektur zu diesem bearbeiteten Code gesund. – Alain

1

Versuchen Sie folgendes:

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