Sub ButtonInsertL_Click(sender As Object, e As EventArgs) Handles ButtonInsertL.Click
Try
Dim con As OleDbConnection = New OleDbConnection("Data Source='C:\Users\USER\documents\visual studio 2013\Projects\GISProject\GISProject\Database.accdb';Integrated Security=True;Connect Timeout=30;User Instance=True")
Dim cmd As OleDbCommand = New OleDbCommand("Insert Into location (locN, type, name, address, City, X, y, streetID) Values (" & Integer.Parse(TextBoxlocN.Text) &
", '" & TextBoxtype.Text & "', '" & TextBoxname.Text & "','" & TextBoxaddress.Text &
"', '" & TextBoxCity.Text & "', " & Integer.Parse(TextBoxX.Text) & ", " & Integer.Parse(TextBoxy.Text) &
", '" & TextBoxstreetID.Text & "')", con)
con.Open()
cmd.ExecuteNonQuery()
con.Close()
Catch ex As SqlException
' Console.WriteLine("peran ar")
End Try
End Sub
答案 0 :(得分:0)
字段" name"可能会引起一个问题,因为它被混淆为OLEDb的保留字。您可以将其包装在[]中以覆盖它或重命名数据库中的字段。
您没有收到任何错误,因为您在try ... catch块中隐藏了异常。您应该至少记录或显示ex.message,以便您可以看到您收到的异常。
另外,如果你对这一切都不熟悉的话。花点时间学习使用参数化语句。它不仅是一种更安全的向数据库发送命令的方式,它还可以减少很多问题,因为它知道何时将值包装在#s或#39;
编辑:
Dim cmd As OleDbCommand = New OleDbCommand("Insert Into location (locN, type, name, address, City, X, y, streetID) Values (" & Integer.Parse(TextBoxlocN.Text) &
", '" & TextBoxtype.Text & "', '" & TextBoxname.Text & "','" & TextBoxaddress.Text &
"', '" & TextBoxCity.Text & "', " & Integer.Parse(TextBoxX.Text) & ", " & Integer.Parse(TextBoxy.Text) &
", '" & TextBoxstreetID.Text & "')", con)
看起来这样更好,更安全
Dim cmd As OleDbCommand = New OleDbCommand("Insert Into location (locN, type, name, address, City, X, y, streetID) Values (@loc, @type, @name, @addr, @city, @x, @y, @streetID)
现在,在执行此操作之前,您需要定义每个参数所代表的内容。要执行此操作,请使用参数集合为其添加值:
cmd.Parameters.AddWithValue("@loc", Integer.Parse(TextBoxlocN.Text))
cmd.Parameters.AddWithValue("@Type", TextBoxtype.Text)
cmd.Parameters.AddWithValue("@name", TextBoxname.Text)
cmd.Parameters.AddWithValue("@addr", TextBoxAddress.Text)
cmd.Parameters.AddWithValue("@city", TextBoxCity.Text)
cmd.Parameters.AddWithValue("@x", Integer.Parse(TextBoxX.Text))
cmd.Parameters.AddWithValue("@y", Integer.Parse(TextBoxy.Text))
cmd.Parameters.AddWithValue("@StreetID", TextBoxstreetID.Text)
现在您已经定义了每个参数,您可以打开连接并执行语句。
请记住,对于OLEDB,您实际上没有命名参数这样的东西。它们基本上只是占位符,因此您必须按照它们在语句中出现的顺序添加参数。
答案 1 :(得分:0)
无论何时编写命令对象的查询,都应该没有字符串连接(并且应该易于阅读 - 请参阅我的demo),应该使用参数。如果您无法控制字段名称,请将每个字段名称括在括号中,例如[姓名]例如。最后在catch中使用Exception,使用OleDb时肯定不会出现SqlException。从概念上讲,除了包装字段名称the following demo之外,我还谈到了我所说的概念。您的代码不需要那么精细,而是没有字符串连接和参数的核心概念。请注意如何使用xml literals来保持查询易于阅读。