无法从网格更新表(过程或函数 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 字段不是唯一的,无法编辑,更新删除