如何将其保存在数据库中?

时间:2017-04-20 12:10:40

标签: .net database vb.net

尝试将数据插入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

2 个答案:

答案 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(*)'