【发布时间】:2020-02-06 15:40:46
【问题描述】:
我把这段代码变成了一个函数:
Adp.SelectCommand = New SqlCommand()
Adp.SelectCommand.Connection = oConn
Adp.SelectCommand.CommandText = sp
Adp.SelectCommand.CommandType = CommandType.StoredProcedure
SqlCommandBuilder.DeriveParameters(Adp.SelectCommand)
table = New DataTable
Dim resultado = 0
Dim inputParamList As New List(Of SqlParameter)
For Each param As SqlParameter In Adp.SelectCommand.Parameters
If param.Direction = Data.ParameterDirection.Input OrElse _
param.Direction = Data.ParameterDirection.InputOutput Then
inputParamList.Add(param)
End If
Next
For Each parame As SqlParameter In inputParamList
Dim metodo() As String
Dim paramName As String = parame.ParameterName.ToString()
Dim paramValue As Object = DBNull.Value
metodo = parame.ParameterName.ToString().Split("@")
paramValue = Parametros(metodo(1))
Adp.SelectCommand.Parameters.AddWithValue(paramName, paramValue)
Next
resultado = Adp.SelectCommand.ExecuteNonQuery()
Adp.Fill(table)
Catch ex As Exception
MessageBox.Show("Ocurrió una excepción en: " + ex.Message + "", "SystemA", _
MessageBoxButtons.OK)
Adp.Dispose()
table.Dispose()
End Try
Return table
基本上,我要做的是直接将存储过程具有的参数读取到数据库中,并根据我拥有的数量(输入)在此循环中创建它们。到目前为止一切顺利,当我必须用数据库中的行结果填充 DataTable 时,我收到消息:“该过程指定了太多参数”。但是如果我调试代码,它会正确地为我分配 sql 值和参数。如果它们是 3,则创建 3,如果是 1,则创建 1,依此类推。
【问题讨论】:
-
该错误意味着 SQL Server 上的存储过程不希望您发送给它的参数那么多。由于我们看不到您正在执行的存储过程或传递给它的参数,因此我们只能建议您仔细检查所有假设。
-
这很奇怪,因为在循环中它会生成并传递正确数量的参数(因为我从 BD 获取它们)。如果其他人发生在你身上,请告诉我你的经历。
-
metodo = parame.ParameterName.ToString().Split("@")将从参数名称中删除@。@不得从参数名称中删除。
标签: sql-server vb.net ado.net