2012-08-06 191 views
1

我創建了一個實習項目的期刊程序,並使用MS-Access數據庫。我在編程VB.net。現在,我試圖讓他們可以「更新」他們的期刊,這意味着他們點擊他們的日曆日期,並且如果他們在那個日期有日期,他們會將它們帶到該日記中。如果他們有那個日期,那麼它會顯示該日期的標題和日記文本條目。我希望這樣做的目的是當他們點擊更新按鈕時,他們對日誌所做的任何更改(編輯文本框字段)也會在數據庫中更改。以下是我迄今爲止如何更新MS Access數據庫(vb.net)

Private Sub COE_JournalBtn_Click(sender As System.Object, e As System.EventArgs) Handles COE_JournalBtn.Click 

    If DateTimePicker1.Value <> Nothing Then 

     If TitleTxt.Text <> "" Then 

      If JournalTextRtxt.Text <> "" Then 

       myConnection.Open() 

       Dim DatePicked As String = DateTimePicker1.Value 
       Dim cmd As OleDbCommand 
       Dim str As String 

       Try 

        MyJournalTitle = TitleTxt.Text 
        MyJournalText = JournalTextRtxt.Text 

        str = "UPDATE Journals SET JournalTitle='" & MyJournalTitle & "', JournalText='" & MyJournalText & "' WHERE JournalDate=" & DatePicked 

        cmd = New OleDbCommand(str, myConnection) 

        cmd.ExecuteNonQuery() 

        myConnection.Close() 

       Catch ex As Exception 

        MessageBox.Show("There was an error processing your request. Please try again." & vbCrLf & vbCrLf & _ 
            "Original Error:" & vbCrLf & vbCrLf & ex.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 

        myConnection.Close() 

       End Try 

       myConnection.Close() 

      End If 

     End If 

    End If 

End Sub 

現在本身我更新的字符串是

"UPDATE Journals SET JournalTitle='" & MyJournalTitle & "', JournalText='" & MyJournalText & "' WHERE JournalDate=" & DatePicked 

現在,發生了什麼,絕對沒有。沒有錯誤框出現。沒有消息框出現。該程序不凍結。數據庫保持不變。我究竟做錯了什麼?我的代碼中是否有錯誤或缺失?請幫助我,因爲我真的想知道這一點,我一直在尋找一個解決方案在VB.net無法找到一個適用於我,因爲我正在使用MS-Access和NOT SQL。

由於提前, 理查德Paulicelli

回答

3

任何問題,你可能有一個問題,您UPDATE聲明的這一部分:

"' WHERE JournalDate=" & DatePicked 

如果期刊領域,JournalDate,是日期/時間數據類型,環繞日期字符串值與訪問日期分隔符(#)。

"' WHERE JournalDate=#" & DatePicked & "#" 

您還可以將日期字符串轉換爲YYYY-MM-DD格式,以避免誤解基於本地文本的日期。

我同意使用參數查詢的建議。我只是想幫助你理解爲什麼最初的嘗試可能失敗。

+0

非常感謝你,那是我的問題所在,那是日期。我想這就是問題所在,當我放置一個斷點並分析了所有我注意到的散列標記的代碼和值時,我甚至都沒有想到將它們放在update語句中。無論如何,非常感謝你的幫助。 順便說一句,日期格式實際上是mm-dd-yyyy。此外,這只是一個內部項目,而不是公開發布。但是謝謝你的提示以備將來參考。 – 2012-08-06 18:19:50

4

使用參數化查詢,以避免SQL注入攻擊和報價問題

str = "Journals SET JournalTitle=?, JournalText=? WHERE JournalDate=?" 
cmd = New OleDbCommand(str, myConnection) 
cmd.Parameters.AddWithValue("@jounalTitle", MyJournalTitle) 
cmd.Parameters.AddWithValue("@journalText", MyJournalText) 
cmd.Parameters.AddWithValue("@journalDate", DatePicked) 
cmd.ExecuteNonQuery() 

使用參數將釋放你的代碼是繼續引用,揭露你的代碼的輸入錯誤的可能性很高。而你沒有與Sql Injection

+1

不幸的是我嘗試過,但是它出現了一個很長的錯誤,但是失敗了。我只是用Hansup的方法來快速修復,但我會研究參數化查詢以備將來使用。感謝您的幫助和輸入 – 2012-08-06 18:22:32

+0

@RichardPaulicelli我想這不適合你,因爲你已經將DatePicked聲明爲一個字符串。如果將它作爲日期保留,參數將起作用,並且您將避免各種語言環境問題。 – Fionnuala 2012-08-07 11:05:01