2012-08-06 151 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