2012-04-20 148 views
7

我有一個FormView,我從一個表(MS Access)中提取數據,然後將它(加上更多的數據)插入到另一個表中。我遇到了約會的問題。將空值插入日期字段?

第一個表格有兩個日期字段:date_submitteddate_updated。在某些記錄中,date_updated爲空。這會導致我在嘗試插入第二個表時遇到數據不匹配錯誤。

這可能是因爲我將第一個表中的date_updated字段數據綁定到FormView上的HiddenField中。然後,從HiddenField取值,並試圖將其插入到第二個表:

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

它的工作原理時,有一個價值存在,但顯然你不能沒有插入日期/時間域訪問。我想我可以做第二個插入語句,不插入date_updated(在date_updated中沒有值時使用),但這是唯一的方法嗎?似乎應該有一個更容易/更少冗餘的方式。

編輯

好。所以我試過插入SqlDateTime.Null,Nothing和DBNull.Value。 SqlDateTime.Null導致將值1/1/1900插入到數據庫中。 「Nothing」導致它插入1/1/2001。如果我嘗試使用DBNull.Value,它告訴我它不能被轉換爲字符串,所以也許我沒有在那裏做一些事情。無論如何,我希望,如果有什麼可插入Access中的字段將保持空白,但它似乎有東西來填補它...

編輯

我得到DBNull.Value工作,並且它插入一個完全空白的值。所以這是我的最終工作代碼:

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 

謝謝大家!

+3

我不明白爲什麼有在這個問題上downvote。我扭轉了它,但我仍然感到困惑。 – Fionnuala 2012-04-20 07:55:00

+0

我同意,這是一個有趣的問題。這些日期字段總是咬我。 – Steve 2012-04-20 08:13:46

+0

你可以添加一個代碼示例顯示你如何插入數據? – phoog 2012-04-20 15:45:25

回答

3

薩拉,你有沒有嘗試在你更新之前投射日期/時間?數據不匹配錯誤可能來自您試圖插入數據庫的hfDateRequestUpdated.Value與列類型不匹配。

嘗試單步執行代碼並查看該值的類型。如果您發現它是一個字符串(它似乎可能是,因爲它來自表單上的一個字段),那麼您首先需要檢查該字段是否爲空字符串(VBNullString)。如果是這樣,您將需要將您要插入數據庫的值更改爲DBNull,您可以使用DBNull.Value在VB.Net中獲取該值。

我們不能看到你的代碼,所以我們不知道你究竟是如何得到的值到數據庫中,但它會是這個樣子

If theDateValueBeingInserted is Nothing Then 
    theDateValueBeingInserted = DBNull.Value 
EndIf 

記住上面的測試只如果你從HiddenField得到的值是一個字符串,我相信它是根據documentation。這可能是你遇到的所有這些麻煩都來自哪裏。你含蓄地轉換您的日期/時間值的字符串(很簡單),但含蓄地將它們背也不是那麼容易的,特別是如果初始值是一個DBNull


一邊

我想馬歇爾試圖建議是上面的代碼相當,但在被稱爲「三元運算符」快捷方式表達,它看起來像這樣在VB.Net:

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

我WOU ldn't推薦它,雖然,因爲它是混亂的新的程序員,語法從IFF(condition ? trueResult : falseResult)

2

您的代碼

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

在2008年改變有幾個問題:

  1. 當你聲明myDateRequestUpdatedDateTime,則不能在其中放置DbNull.Value。
  2. 我不知道你需要的()爲DbNull.Value:這是一個屬性,而不是方法(我不知道夠不夠VB肯定地說)
  3. VB不知道:操作

你可能想要的是一個Nullable(Of DateTime)來存儲一個DateTime值也可以丟失。

然後使用這樣的存儲值:

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

如果hfDateRequestUpdated.Value是空的,然後使用Nothing的結果;否則將該值解析爲日期(如果它不是有效日期,可能會失敗!)。

+0

她只是首先嚐試了該代碼,因爲她試圖按照之前用C#編寫的答案中的指示。我不認爲她在原始代碼中有任何與之相近的東西。無論如何,您對該編輯代碼的更正是正確的。 – Alain 2012-05-03 15:33:17

1

試試這個:

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