如何从数据表 vb.net 向 sql server 数据库插入值

Posted

技术标签:

【中文标题】如何从数据表 vb.net 向 sql server 数据库插入值【英文标题】:How to Insert value to sql server database from data table vb.net 【发布时间】:2019-04-15 07:48:45 【问题描述】:

我正在制作一个包含两个数据库的应用程序,并希望将我的第二个数据库表插入第一个数据库表中的值,它们具有相同的列但位于不同的数据库中。所以我制作了一个数据表来从第一个数据库表中填充我的数据并尝试将其插入到我的第二个数据库中

所以我制作了一个数据表来填充我的第一个数据库表中的数据,并尝试使用数据表中的数据将其插入到我的第二个数据库中,但总是错误导致字符串值

    Dim ds As DataSet = New DataSetMasBrgSpring
    Dim dt As DataTable
    dt = ds.Tables("DataTable1")
    If DataGridView1.Rows.Count > 0 Then
        dt.Rows.Clear()
        For i = 0 To DataGridView1.Rows.Count - 1
            dt.Rows.Add(DataGridView1.Rows(i).Cells(0).Value, etc..            

        Dim sql1 As String
        Dim dataAdapter As New Data.SqlClient.SqlDataAdapter
        Dim command As New Data.SqlClient.SqlCommand
        command = "insert into MasbrgSpring (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"
        command.Parameters.Add("@kodec", SqlDbType.VarChar)
        etc...

        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            command.Parameters(0).Value = DataGridView1.Rows(i).Cells(0).Value
            command.Parameters(1).Value = DataGridView1.Rows(i).Cells(1).Value
        etc...

            str.Open()
            COMMANDSQL(sql1)
            str.Close()

        Next
    End If
End Sub

这是子命令sql:

    Public Sub COMMANDSQL(ByVal S As String)
    sqlcom = New SqlCommand(S, str)
    sqlcom.CommandType = CommandType.Text
    sqlcom.ExecuteNonQuery()
End Sub

这是我得到的错误:

value of type string cannot be converted to 'system.data.sqlclient.sqlcommand'

【问题讨论】:

你能分享你得到的确切错误信息吗? 错误信息:字符串类型的值无法转换为'system.data.sqlclient.sqlcommand' 请显示COMMANDSQL方法的代码。看来您根本不需要表、适配器和数据集,只需要 SqlCommand 【参考方案1】:

你的代码有很多问题。当然,触发编译错误的直接原因是您使用 command 而不是 command.CommandText 将查询分配给命令,但还有其他的。

    If DataGridView1.Rows.Count > 0 Then
        Dim command As New Data.SqlClient.SqlCommand
        command.Text = "insert into MasbrgSpring 
                (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) 
                 VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"
        command.Parameters.Add("@kodec", SqlDbType.VarChar)
        .... add all the other parameters ....

        ' Don't forget to set the connection to the command
        command.Connection = str
        str.Open()

        ' Now loop over the rows and for each one execute the insert command
        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            command.Parameters(0).Value = DataGridView1.Rows(i).Cells(0).Value
            command.Parameters(1).Value = DataGridView1.Rows(i).Cells(1).Value
            .....    
            command.ExecuteNonQuery()
        Next
        str.Close()
    End If
End Sub

这里我删除了所有关于 SqlDataAdapter、DataTable 和 DataSet 的东西。直接执行 SqlCommand 时根本不需要它们。 最后,在循环中准备的 SqlCommand 是要执行的,如果您在该 SQLCOMMAND 方法中创建一个新的 SqlCommand,那么您需要为它提供与循环中使用的命令相同的信息。

所以也不需要 SQLCOMMAND 方法,但您可以直接在准备好的 SqlCommand 上调用 ExecuteNonQuery。

最后的建议。拥有一个全局 SqlConnection 对象是一种非常糟糕的编程实践。它将资源锁定在客户端和服务器上,如果由于任何原因出现异常,连接保持打开状态,当您在其他数据代码块中遇到问题时,副作用不会立即明显。 ADO.NET 的Connection Pooling 功能比您尝试重新创建的保持全局连接对象的功能先进得多。而是在 Sql 命令周围使用Using statement

Using sqlCon = New SqlConnection(......)
    If DataGridView1.Rows.Count > 0 Then
        Dim command As New Data.SqlClient.SqlCommand
        command.Connection = sqlCon
           ..... the previous code....
    End If
End Using

using 语句将帮助您关闭和释放连接,而连接池消除了使用相同连接字符串重新连接到同一数据库所需的开销。

【讨论】:

那么如何解决这个问题?我只是想了解如何将数据从第一个数据库发送到其他数据库你能告诉我链接吗? 您的数据位于该网格 (DataGridView1) 中,对吗?我展示的代码是从该网格中提取数据并将其发送到您使用连接字符串打开的数据库所需的代码。 谢谢你的建议,现在我的申请工作对我有很大帮助【参考方案2】:

大概就是这一行:

command = "insert into MasbrgSpring (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"

我想你的意思是:

command.CommandText = "insert into MasbrgSpring (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"

【讨论】:

我收到此错误消息 ExecuteNonQuery: CommandText 属性尚未初始化

以上是关于如何从数据表 vb.net 向 sql server 数据库插入值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 VB.NET 的视图中获取 SQL 查询

从 VB.NET 向 MySQL 传递和接收输出参数

如何将图像从一个图片框传输到另一个图片框? VB.NET 和 SQL

使用 VB.NET 表单从 SQL Server 到 Excel 的日期数据检索

在 vb.net 中,如何从数据表中获取列名

如何从 Access 数据库 VB.net 中检索特定数据?