这是我的代码我试图通过VB表格更新表格,我不知道它有什么问题请帮帮我。
这是表格:
Dim con As New OleDbConnection("provider=microsoft.ace.oledb.12.0; data source = |datadirectory|\Studen.accdb;")
con.Open()
Dim sql As String = "Update tend set StudentName='" & TextBox9.Text & "', LessonDate='" & TextBox13.Text & "', LessonTime=" & TextBox10.Text & ", Payment=" & TextBox11.Text & ", Note='" & TextBox12.Text & "' where ID=" & TextBox8.Text
Dim cmd As New OleDbCommand(sql, con)
cmd.ExecuteNonQuery()
con.Close()
答案 0 :(得分:0)
第一个问题是名为NOTE的字段。这是MS-Access中的保留关键字,如果要使用它,则需要用方括号封装单词
Dim sql As String = "Update tend set StudentName=...., [Note]=..."
但这不是唯一的问题。更大的一个是用于构建sql命令的字符串连接。这种方法导致可能的sql注入和属性引用用于准备语句的值的问题。需要检查字符串以复制单引号,小数需要以适当的小数点传递,日期需要封装在#符号中等等.... 更好的方法是使用参数化查询
Dim sql As String = "Update tend set StudentName=?, LessonDate=?, LessonTime=?, " & _
"Payment=?, [Note]=? where ID=?"
Using con = New OleDbConnection(...........)
Using cmd = New OleDbCommand(sql, con)
con.Open()
cmd.Parameters.AddWithValue("@p1", TextBox9.Text)
cmd.Parameters.AddWithValue("@p2", Convert.ToDate(TextBox13.Text))
cmd.Parameters.AddWithValue("@p3", Convert.ToInt32(TextBox10.Text))
cmd.Parameters.AddWithValue("@p4", Convert.ToDecimal(TextBox11.Text))
cmd.Parameters.AddWithValue("@p5", TextBox12.Text)
cmd.Parameters.AddWithValue("@p6", Convert.ToInt32(TextBox8.Text))
cmd.ExecuteNonQuery()
End Using
End Using
在参数化查询中,如上所述,您将占位符(?)放在查询文本中,并使用命令的Parameters集合提供值。通过这种方式,正确引用每个值的工作将传递给框架和数据库引擎。他们比你和我更了解如何正确引用参数。
注意 AddWithValue 方法如何推断出正确的数据类型,以用于查看传递的值的数据类型的参数。如果 LessonDate 字段是 DateTime 类型的字段,则需要将文本框文本(字符串)转换为日期。如果您在尝试转换之前未进行检查,则可能会导致异常。 (这里我假设你有一些确保有效输入的东西)。相同的推理应该应用于其他非文本字段。 (ID,课程时间,付款)