2012-04-20 17 views
7

Mam FormView, gdzie pobierają dane z jednej tabeli (MS Access), a następnie wstawić (plus więcej danych) do innej tabeli. Mam problemy z datami.Wstawianie pustych wartości do pól daty?

Pierwsza tabela ma dwa pola daty: date_submitted i date_updated. W niektórych rejestrach date_updated jest puste. Powoduje to, że podczas próby wstawienia do drugiej tabeli wystąpił błąd niedopasowania danych.

Może to wynikać z faktu, że odszukuję pola date_updated z pierwszej tabeli na pole HiddenField w FormView. Następnie przyjmuje wartość od HiddenField i próbuje włożyć ją do drugiej tabeli:

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

To działa, gdy istnieje jakaś wartość, ale widocznie nie można wkładać nic do pola daty/czasu w programie Access . Przypuszczam, że mógłbym wykonać drugą instrukcję wstawiania, która nie wstawi się do date_updated (do użycia, gdy nie ma wartości w date_updated), ale czy to jedyny sposób, aby to zrobić? Wydaje się, że powinien istnieć łatwiejszy/mniej zbędny sposób.

EDIT:

Ok. Więc próbowałem wstawiania SqlDateTime.Null, Nic i DBNull.Value. SqlDateTime.Null powoduje wstawienie wartości 1/1/1900 do bazy danych. "Nic" powoduje, że wstawia się 1/1/2001. I jeśli spróbuję użyć DBNull.Value, mówi mi, że nie można go przekonwertować na ciąg znaków, więc może nie zrobiłem czegoś całkiem odpowiedniego. W każdym razie, mam nadzieję, że jeśli nie było nic do wstawienia że pole w programie Access pozostanie puste, ale wydaje się, że musi wypełnić go z czymś ...

EDIT:

I ma wartość DBNull.Value do pracy i wstawia całkowicie pustą wartość. Oto mój ostatni działający kod:

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 

Dziękuję wszystkim!

+3

ja nie rozumiem, dlaczego nie było downvote na to pytanie. Odwróciłem to, ale nadal jestem zakłopotany. – Fionnuala

+0

Zgadzam się, to interesujące pytanie. Te pola daty zawsze mnie kąsają. – Steve

+0

Czy możesz dodać przykład kodu pokazujący sposób wstawiania danych? – phoog

Odpowiedz

3

Sara, czy próbowałeś rzucić datę/czas przed aktualizacją? Błąd niedopasowania danych wynika prawdopodobnie z faktu, że próbka wstawienia do bazy danych nie jest zgodna z typem kolumny.

Spróbuj przejść przez kod i zobaczyć, jaki jest typ tej wartości. Jeśli okaże się, że jest to ciąg znaków (który wydaje się być, ponieważ pochodzi z pola formularza), najpierw trzeba sprawdzić, czy to pole jest pustym ciągiem znaków (VBNullString). Jeśli tak, będziesz chciał zmienić wartość wstawianą do bazy danych na DBNull, którą możesz uzyskać w VB.Net przy użyciu DBNull.Value.

Nie możemy zobaczyć kod, więc nie wiemy dokładnie, jak uzyskać wartość w bazie danych, ale to wyglądać mniej więcej tak

If theDateValueBeingInserted is Nothing Then 
    theDateValueBeingInserted = DBNull.Value 
EndIf 

Należy pamiętać, że powyższe badanie tylko działa, jeśli wartość uzyskana z HiddenField jest łańcuchem, który moim zdaniem jest zgodny z documentation. Prawdopodobnie stąd pochodzą wszystkie te kłopoty.Jesteś niejawnie konwertowania datę/czas, aby wartości ciąg (co jest łatwe), ale niejawnie przekonwertować je z powrotem nie jest tak łatwe, zwłaszcza jeśli wartość początkowa była DBNull


bok

myślę co Marshall próbował sugerować było równoznaczne z powyższym kodzie, ale w wyrażeniu skrótów zwanej "trójskładnikowych operatora, który wygląda jak ten w Vb.NET:

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

I wou ldn't polecam go jednak, ponieważ jest to mylące dla nowych programistów i składnia zmieniło się w 2008 roku z IFF(condition ? trueResult : falseResult)

2

Twój kod

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

ma kilka problemów:

  1. Kiedy deklarujesz myDateRequestUpdated na DateTime, nie można umieścić w nim wartości DbNull.Value.
  2. Nie jestem pewien, potrzebne są () dla DbNull.Value: jest to nieruchomość, a nie metoda (nie wiem wystarczająco dużo VB powiedzieć na pewno)
  3. VB nie wie, że : operator

To, czego prawdopodobnie potrzebujesz, to Nullable(Of DateTime) do przechowywania wartości DateTime, której również nie można ominąć.

Następnie użyj czegoś takiego, aby zapisać wartość:

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

Jeśli hfDateRequestUpdated.Value jest pusty, a następnie użyć Nothing jako rezultat; spakuj wartość jako datę (która może się nie powieść, jeśli nie jest to poprawna data!).

+0

Próbowała tego kodu tylko dlatego, że próbowała postępować zgodnie z instrukcjami zawartymi w poprzedniej odpowiedzi, która została napisana w języku C#. Nie sądzę, żeby miała coś podobnego w swoim oryginalnym kodzie. W każdym razie Twoja poprawka do tego edytowanego kodu jest dźwiękowa. – Alain

1

Spróbuj tego:

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 
Powiązane problemy