如何使用Excel创build参数化查询? (VB.NET)

我试图使用参数化的查询在Excel工作表中运行更快的更新子句…但是当试图做,vb.net说:“操作必须使用可更新的查询”。

通过连续的常规查询,查询工作:

Protected Friend Sub reemplazarDato(ByVal columna As String, ByVal dato As String, ByVal con As String) Dim cmd As String = "" conexion.Open() For Each itm In arrayErrores cmd = "UPDATE [" & obtenerHojaActual(columna, con) & "$] SET [" & columna & "]='" & dato & "' WHERE [" & columna & "]='" & itm & "'" Try Dim comando As New OleDbCommand(cmd, conexion) comando.ExecuteNonQuery() comando.Dispose() Catch ex As Exception repairmanMessage("Error inesperado", ex.Message, My.Resources._error).ShowDialog() End Try Next conexion.Close() End Sub 

但是,当我尝试这种方式,查询不工作…(“操作必须使用可更新的查询”)

 Protected Friend Sub reemplazarDato(ByVal columna As String, ByVal dato As String, ByVal con As String) Dim cmd As String = "" Dim hoja As String = obtenerHojaActual(columna, con) Dim comando As New OleDbCommand comando.Connection = conexion conexion.Open() For Each itm In arrayErrores cmd = "UPDATE [" & hoja & "$] SET [@columna]=@dato WHERE [@columna]=@itm" comando.CommandText = cmd comando.Parameters.Add("@columna", OleDbType.VarChar, columna.Length).Value = columna comando.Parameters.Add("@dato", OleDbType.VarChar, dato.Length).Value = dato comando.Parameters.Add("@itm", OleDbType.VarChar, itm.ToString.Length).Value = itm Try comando.ExecuteNonQuery() comando.Parameters.Clear() Catch ex As Exception repairmanMessage("Error inesperado", ex.Message, My.Resources._error).ShowDialog() End Try Next conexion.Close() comando.Dispose() End Sub 

我怎样才能做到这一点与Excel?

这是无效的参数化列的名称 – 即columna需要像在你的第一个代码块中使用string连接设置,而不是作为参数。 另外,您不需要为每次迭代定义SQL和命令参数,只需定义一次,然后每次在循环中设置值。

 Protected Friend Sub reemplazarDato(ByVal columna As String, ByVal dato As String, ByVal con As String) Dim hoja As String = obtenerHojaActual(columna, con) Dim comando As New OleDbCommand comando.Connection = conexion comando.CommandText = "UPDATE [" & hoja & "$] SET [" & columna & "]=@dato WHERE [" & columna & "]=@itm" comando.Parameters.Add("@dato", OleDbType.VarChar, dato.Length) comando.Parameters.Add("@itm", OleDbType.VarChar, itm.ToString.Length) conexion.Open() For Each itm In arrayErrores comando.Parameters("@dato").Value = dato comando.Parameters("@itm").Value = itm Try comando.ExecuteNonQuery() Catch ex As Exception repairmanMessage("Error inesperado", ex.Message, My.Resources._error).ShowDialog() End Try Next conexion.Close() comando.Dispose() End Sub