如何从数据表vb.net向SQL Server数据库插入值

时间:2019-04-15 07:48:46

标签: sql-server vb.net sql-server-2012

我要创建一个具有两个数据库的应用程序,并且要插入我的第二个数据库表,其值与第一个数据库表中的值相同,但它们具有相同的列,但位于不同的数据库上。因此,我制作了一个数据表以填充第一个数据库表中的数据,并尝试将其插入第二个数据库中

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

    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'

2 个答案:

答案 0 :(得分:1)

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

    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方法,但是您可以直接在准备好的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语句将帮助您关闭和释放连接,而连接池则消除了使用相同的连接字符串重新连接到同一数据库所需的开销。

答案 1 :(得分:0)

可能是这一行:

Parcelable

我想你是说:

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