我要创建一个具有两个数据库的应用程序,并且要插入我的第二个数据库表,其值与第一个数据库表中的值相同,但它们具有相同的列,但位于不同的数据库上。因此,我制作了一个数据表以填充第一个数据库表中的数据,并尝试将其插入第二个数据库中
所以我制作了一个数据表来填充我的第一个数据库表中的数据,并尝试使用该数据表中的数据将其插入我的第二个数据库中,但始终会导致字符串值错误
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'
答案 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)"