none
存储过程 RRS feed

  • 问题

  • 添加了个存储过程,绑定到Gridview,使用objectDataSource配置后,更新,删除都没有问题。但是改用sqlDataSource,用自定义Sql语句或存储过程配置后
    在点删除时出现这样的错误:为过程或函数 NewDeleteCommand 指定了过多的参数。但更新没有问题。
    ALTER PROCEDURE dbo.NewDeleteCommand
    (
    @Original_SingerID int
    )
    AS
    SET NOCOUNT OFF;
    DELETE FROM [mysinger] WHERE (([SingerID] = @Original_SingerID))
    我只有一个参数啊?
    2009年11月7日 2:17

答案

  • 你看看 sqlDataSource 控件代码中对 NewDeleteCommand 的声明,应该是指定了不止一个的参数。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 3:04
    版主
  • 也只有一个参数啊
     <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:xuepingConnectionString %>"
            DeleteCommand="NewDeleteCommand" DeleteCommandType="StoredProcedure"
            InsertCommand="NewInsertCommand" InsertCommandType="StoredProcedure"
            SelectCommand="NewSelectCommand" SelectCommandType="StoredProcedure"
            UpdateCommand="NewUpdateCommand" UpdateCommandType="StoredProcedure">
            <DeleteParameters>
                <asp:Parameter Name="Original_SingerID" Type="Int32" />
            </DeleteParameters>
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 3:26
  • gridview 没有设置主键
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 4:08
  • 你好!

    我刚才测试了下,也发现了这个有趣的问题。

    如果存储过程 NewDeleteCommand 的参数名与主键名不一致就会导致这样的问题。

    你将存储过程改为下面的方式就可以了

    ALTER PROCEDURE dbo.NewDeleteCommand (
        @SingerID INT )
    AS 
    SET NOCOUNT OFF ; 
    DELETE  FROM [mysinger]
    WHERE   ( ([SingerID] = @SingerID) ) -- SingerID 是你的主键

    知识改变命运,奋斗成就人生!
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 5:32
    版主
  • 存储过程的参数改成

    @SingerID  int


    然后SqlDataSource写
        <DeleteParameters>
          <asp:Parameter Name="SingerID" Type="Int32" Direction="Input"  />
        </DeleteParameters>

    就可以了

    和主键的字段名称保持一致
    【孟子E章】
    • 已标记为答案 pesistence 2009年11月7日 11:18
    2009年11月7日 10:08
    版主

全部回复

  • 而且数据库中执行删除可以删除指定的行,代码调用也是没有问题的,只不过是一个简单的绑定到Gridview,启用更新,删除。但是改用objectDataSource后,更新,删除都没有问题。
    2009年11月7日 2:30
  • 你看看 sqlDataSource 控件代码中对 NewDeleteCommand 的声明,应该是指定了不止一个的参数。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 3:04
    版主
  • 也只有一个参数啊
     <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:xuepingConnectionString %>"
            DeleteCommand="NewDeleteCommand" DeleteCommandType="StoredProcedure"
            InsertCommand="NewInsertCommand" InsertCommandType="StoredProcedure"
            SelectCommand="NewSelectCommand" SelectCommandType="StoredProcedure"
            UpdateCommand="NewUpdateCommand" UpdateCommandType="StoredProcedure">
            <DeleteParameters>
                <asp:Parameter Name="Original_SingerID" Type="Int32" />
            </DeleteParameters>
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 3:26
  • gridview 没有设置主键
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 4:08
  • 已经设了的,( DataKeyNames="SingerID" ),况且使用objectDataSource就能实现更改,删除
    2009年11月7日 4:22
  • 发出你的全部代码 看看
    不然只能猜测 解决不了问题
    2009年11月7日 5:14
  • 你好!

    我刚才测试了下,也发现了这个有趣的问题。

    如果存储过程 NewDeleteCommand 的参数名与主键名不一致就会导致这样的问题。

    你将存储过程改为下面的方式就可以了

    ALTER PROCEDURE dbo.NewDeleteCommand (
        @SingerID INT )
    AS 
    SET NOCOUNT OFF ; 
    DELETE  FROM [mysinger]
    WHERE   ( ([SingerID] = @SingerID) ) -- SingerID 是你的主键

    知识改变命运,奋斗成就人生!
    • 已标记为答案 pesistence 2009年11月7日 11:32
    2009年11月7日 5:32
    版主
  • 刚才试了下,指定 OldValuesParameterFormatString 属性也能解决这个问题。

    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:xuepingConnectionString %>" 
        DeleteCommand="NewDeleteCommand" DeleteCommandType="StoredProcedure" OldValuesParameterFormatString="Original_SingerID"
        InsertCommand="NewInsertCommand" InsertCommandType="StoredProcedure" 
        SelectCommand="NewSelectCommand" SelectCommandType="StoredProcedure" 
        UpdateCommand="NewUpdateCommand" UpdateCommandType="StoredProcedure">
        <DeleteParameters>
            <asp:Parameter Name="Original_SingerID" Type="Int32" />
        </DeleteParameters>
    </asp:SqlDataSource>


    知识改变命运,奋斗成就人生!
    2009年11月7日 5:52
    版主
  • 哦,谢谢了
    • 已标记为答案 pesistence 2009年11月7日 6:30
    • 取消答案标记 pesistence 2009年11月7日 7:32
    2009年11月7日 6:28
  • 调试了很久,还是发现又有问题存在:
    用了第一个方法,让存储过程 NewDeleteCommand 的参数名与主键名一致,好像也不可以删除;同样错误为过程或函数 NewDeleteCommand 指定了过多的参数
    用第二个方法,指定 OldValuesParameterFormatString 属性,可以删除,但是更新就出错;
    尝试过在NewUpdateCommand中让where的参数名与主键名一致,但更新操作也出问题啊
    2009年11月7日 7:39
  • 更改后都执行保存了
    2009年11月7日 7:40
  • 存储过程的参数改成

    @SingerID  int


    然后SqlDataSource写
        <DeleteParameters>
          <asp:Parameter Name="SingerID" Type="Int32" Direction="Input"  />
        </DeleteParameters>

    就可以了

    和主键的字段名称保持一致
    【孟子E章】
    • 已标记为答案 pesistence 2009年11月7日 11:18
    2009年11月7日 10:08
    版主