无法从网格更新表(过程或函数 spExcelGridTestUpdateTable 指定了太多参数)

Posted

技术标签:

【中文标题】无法从网格更新表(过程或函数 spExcelGridTestUpdateTable 指定了太多参数)【英文标题】:Unable to update table from grid (Procedure or function spExcelGridTestUpdateTable has too many arguments specified) 【发布时间】:2013-10-03 20:24:55 【问题描述】:

在“保存”命令中,我正在尝试更新类似 Excel 的网格上已编辑的多个行,其列如下所示:

<Columns>
<telerik:GridNumericColumn DataField="CarID" DataType="System.Int32" HeaderText="ID" 
    SortExpression="CarID" UniqueName="CarID" AutoPostBackOnFilter="true" CurrentFilterFunction="EqualTo" HeaderStyle-Width="100" ItemStyle-Width="100" FilterControlWidth="60" ReadOnly="false"/> 
<telerik:GridBoundColumn DataField="CarMake" DataType="System.String" HeaderText="Car Make" 
    SortExpression="CarMake" UniqueName="CarMake" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderStyle-Width="120" ItemStyle-Width="120" FilterControlWidth="80" /> 
<telerik:GridBoundColumn DataField="CarModel" DataType="System.String" HeaderText="Car Model" 
    SortExpression="CarModel" UniqueName="CarModel" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderStyle-Width="120" ItemStyle-Width="120" FilterControlWidth="80" /> 
<telerik:GridBoundColumn DataField="CarTrim" DataType="System.String" HeaderText="Car Trim" 
    SortExpression="CarTrim" UniqueName="CarTrim" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderStyle-Width="200" ItemStyle-Width="200" FilterControlWidth="160"/> 
<telerik:GridNumericColumn DataField="CarYear" DataType="System.Int32" HeaderText="Car Year" 
    SortExpression="CarYear" UniqueName="CarYear" AutoPostBackOnFilter="true" CurrentFilterFunction="EqualTo" HeaderStyle-Width="100" ItemStyle-Width="100" FilterControlWidth="60" />

这是我的“保存”命令:

Case "Save" 
For Each editedItem As GridEditableItem In RadGridViewExcelGridTest.EditItems 
    Dim newValues As Hashtable = New Hashtable 
    'The GridTableView will fill the values from all editable columns in the hash 
    e.Item.OwnerTableView.ExtractValuesFromItem(newValues, editedItem) 
    SqlDataSourceExcelGridTest.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure 
    SqlDataSourceExcelGridTest.UpdateCommand = "spExcelGridTestUpdateTable" 
    SqlDataSourceExcelGridTest.UpdateParameters.Add(New Parameter("CarID", DbType.Int32)) 
    SqlDataSourceExcelGridTest.UpdateParameters.Add(New Parameter("CarMake", DbType.String)) 
    SqlDataSourceExcelGridTest.UpdateParameters.Add(New Parameter("CarModel", DbType.String)) 
    SqlDataSourceExcelGridTest.UpdateParameters.Add(New Parameter("CarTrim", DbType.String)) 
    SqlDataSourceExcelGridTest.UpdateParameters.Add(New Parameter("CarYear", DbType.Int32)) 
    SqlDataSourceExcelGridTest.Update() 
    editedItem.Edit = False 
Next

我的存储过程是这样的:

ALTER PROCEDURE [dbo].[spExcelGridTestUpdateTable] 
-- Add the parameters for the stored procedure here 
@CarID int, 
@CarMake varchar(100), 
@CarModel varchar(100), 
@CarTrim varchar (100), 
@CarYear int 

AS 
BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    UPDATE [dbo].[TestTable_Cars]
        SET CarMake=@CarMake, CarModel=@CarModel, CarTrim=@CarTrim, CarYear=@CarYear 
        WHERE CarID=@CarID 
END

我得到的错误是过程或函数 spExcelGridTestUpdateTable 指定了太多参数。大多数收到此错误的人似乎只是在涉及其中一个参数名称时有错字,但我已经检查过,一切似乎都排成一行。如果我从 SQLServer 执行 SP 并提供参数(或传递 NULL 参数),SP 运行良好。

【问题讨论】:

您可以尝试从网格 Add(New Parameter("CarID", DbType.String) 更改参数的数据类型。它是 Sql Server DB 吗? @briskovich - 将数据类型更改为字符串似乎没有任何效果。是的,就是Sql Server db。 【参考方案1】:

尝试添加

SqlDataSourceExcelGridTest.UpdateParameters.Clear()

之前

SqlDataSourceExcelGridTest.UpdateParameters.Add(New Parameter("CarID", DbType.Int32)) 

【讨论】:

添加该行可防止错误,因此感谢您!但是表格没有更新。我已经在循环内部、外部尝试了 Rebind() 语句,并被注释掉了——都产生了相同的结果。有什么想法吗? 当您在 SSMS 中使用与从网格传递的完全相同的参数运行它时 - 是否会发生更新?您可以使用 SQL Profiler 以准确的参数捕获对 SP 的准确调用 我刚刚注意到,您正在添加参数,但没有为它们分配任何值。例如。当您执行.Add(New Parameter("CarID", DbType.Int32)) 时,您从哪里获得实际的 CarID 以传递它? 当我运行跟踪时,我发现我得到了 100 条这条命令(数据库中有 100 条记录): exec spExcelGridTestUpdateTable @CarID=NULL,@CarMake=NULL,@CarModel=NULL,@ CarTrim=NULL,@CarYear=NULL 因此,我没有用一个更改(测试用例)更新一行,而是将 100 行设置为 NULL。但是,没有记录最终为 NULL。此外,我的 SP 不会更新 CarID - 但正在执行的命令似乎无论如何都试图这样做。为了测试,我将所有列设置为允许 NULL。但结果是一样的。我现在更加困惑了。 正如我所提到的 - 您没有为参数分配任何值 - 因此正在传递 NULL。

以上是关于无法从网格更新表(过程或函数 spExcelGridTestUpdateTable 指定了太多参数)的主要内容,如果未能解决你的问题,请参考以下文章

phpmyadmin:从多个表创建的视图现在 id 字段不是唯一的,无法编辑,更新删除

sql 从函数或存储过程返回表

无法使用镜头 kudu sink 连接器将数据从 kafka 主题插入或更新到 kudu 表

通过侦听器从网格面板更新组件

存储过程中从一个表到另一个表的 Netezza 更新错误

多个存储过程调用或遍历数组?