尝试将数据插入sql数据库时遇到问题。 我希望有一个人可以帮助我。每次我点击button2时,都会出现一个MessageBox并说:
在表格中插入记录时出错...'行'不是公认的内置函数名称。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim con As New SqlConnection
Dim cmd As New SqlCommand
Using sr As New System.IO.StreamReader("C:\Users\klaasjelle\Documents\Visual Studio 2017\Projects\WindowsApp2\WindowsApp2\bin\Debug\Images.txt")
Try
con.ConnectionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\klaasjelle\Documents\visual studio 2017\Projects\WindowsApp3\WindowsApp3\Niks.mdf;Integrated Security=True"
con.Open()
cmd.Connection = con
cmd.CommandText = "INSERT INTO Data (FilePath, ImageSize, ImageSide) VALUES (ListViewItem(lines(0)), lvItem.SubItem.Add(lines(1)), lvItem.SubItem.Add(lines(2)))"
cmd.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("Error while inserting record on table..." & ex.Message, "Insert Records")
Finally
con.Close()
End Try
End Using
End Sub
End Class
正如我所说。 每次我点击Button2,都会说:
在桌面上插入记录时出错...' line'不是公认的内置函数名称。
有人可以帮助我吗
这里建议的还有属于Button1_Click
的代码 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Using sr As New System.IO.StreamReader("C:\Users\klaasjelle\Documents\Visual Studio 2017\Projects\WindowsApp2\WindowsApp2\bin\Debug\Images.txt")
While Not sr.EndOfStream
Dim lines As String() = sr.ReadLine.Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries)
Dim lvItem As New ListViewItem(lines(0))
lvItem.SubItems.Add(lines(1))
lvItem.SubItems.Add(lines(2))
ListView1.Items.Add(lvItem)
End While
End Using
ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent)
ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
End Sub
答案 0 :(得分:6)
您正在将字符串文字传递给INSERT语句。此字符串不是ListView项,而只是数据库引擎尝试解析的任何关于列表视图和行数组的任何内容的字符串。
相反,您应该使用参数化查询
cmd.CommandText = "INSERT INTO Data (FilePath, ImageSize, ImageSide)
VALUES (@path, @size, @side)"
cmd.Parameters.Add("@path", SqlDbType.NVarChar).Value = ListViewItem(lines(0))
cmd.Parameters.Add("@size", SqlDbType.NVarChar).Value = ListViewItem(lines(1))
cmd.Parameters.Add("@side", SqlDbType.NVarChar).Value = ListViewItem(lines(2))
....
我假设您的数据库字段是NVarChar类型,如果没有,则将SqlDbType枚举更改为正确的值并将输入ListViewItem解析为正确的数据类型
我限制了我对数据库问题的回答,但你的代码似乎不完整。行数组在哪里定义?你如何得到ListViewItem的引用?
关注您的修改:
变量在button1_click事件中定义,因此您无法在button2_click事件中使用它们。您需要阅读listview的内容并提取您在button1_click中添加的信息。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button1.Click
using con As New SqlConnection
using cmd As New SqlCommand
con.ConnectionString = "....."
con.Open()
cmd.Connection = con
cmd.Parameters.Add("@path", SqlDbType.NVarChar)
cmd.Parameters.Add("@size", SqlDbType.NVarChar)
cmd.Parameters.Add("@side", SqlDbType.NVarChar)
cmd.CommandText = "INSERT INTO Data (FilePath, ImageSize, ImageSide)
VALUES (@path, @size, @side)"
For Each item as ListViewItem in ListView1
Dim path = item.Text
Dim size = item.SubItems(1)
Dim side = item.SubItems(2)
' Now you have the variables to insert in the database
cmd.Parameters("@path").Value = path
cmd.Parameters("@size").Value = size
cmd.Parameters("@side").Value = side
cmd.ExecuteNonQuery()
Next
End Using
End Using
End Sub
请注意,我改变了前一个示例的逻辑。现在我在Using块中创建连接和命令。这将使我明确关闭并销毁这些命令。然后我在循环内定义循环外的参数,我只改变了值。 (一个简单的优化,没有很大的好处,除非你的列表视图中有数千个项目) 最后,我循环遍历listview中的每个项目,并从每个ListViewItem中提取要在数据库中插入的信息
答案 1 :(得分:2)
您正在尝试在SQL中执行VB代码。哪个当然行不通。在VB代码中获取值,然后将它们作为参数添加到SQL命令中。像这样:
Invalid arguments 'Candidates are:void glfwMakeContextCurrent(*)'