加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 过程或函数’xyz’指定了太多参数

发布时间:2020-12-16 07:12:19 所属栏目:asp.Net 来源:网络整理
导读:我知道这类问题在SO上至少被问了十几次,但我已经完成了我在这里找到的所有先前的问题和答案,而且我找不到任何适用的问题.我在我的页面上使用了几个FormView对象,现在想要添加选项来编辑其中一个. FormView由链接到存储过程的SqlDataSource填充,因此我创建了
我知道这类问题在SO上至少被问了十几次,但我已经完成了我在这里找到的所有先前的问题和答案,而且我找不到任何适用的问题.我在我的页面上使用了几个FormView对象,现在想要添加选项来编辑其中一个. FormView由链接到存储过程的SqlDataSource填充,因此我创建了一个存储过程来更新记录并将其添加到SqlDataSource,现在看起来像这样:

<asp:SqlDataSource ID="TestSqlDataSource" runat="server" 
                   SelectCommandType="StoredProcedure" 
                   ConnectionString="<%$ConnectionStrings:development %>" 
                   SelectCommand="usp_GetNewTestDetails" 
                   UpdateCommand="usp_UpdateTest" 
                   UpdateCommandType="StoredProcedure" 
                   onupdating="TestSqlDataSource_Updating">
    <SelectParameters>
        <asp:SessionParameter SessionField="TestID" Name="TestID"/>
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="testId" Type="Int32"/>
        <asp:Parameter Name="testerLicense" Type="Int32" />
        <asp:Parameter Name="premiSEOwner" Type="String" />
        <asp:Parameter Name="premiseAddress" Type="String" />
        <asp:Parameter Name="premiseCity" Type="String" />
        <asp:Parameter Name="premiseState" Type="String" />
        <asp:Parameter Name="premiseZip" Type="String" />
        <asp:Parameter Name="protectionType" Type="String" />
        <asp:Parameter Name="testType" Type="String" />
        <asp:Parameter Name="repairs" Type="String" />
        <asp:Parameter Name="notes" Type="String" />
        <asp:Parameter Name="testDate" Type="DateTime" />
        <asp:Parameter Name="employerName" Type="String" />
        <asp:Parameter Name="employerAddress" Type="String" />
        <asp:Parameter Name="phoneNumber" Type="String" />
        <asp:Parameter Name="emailAddress" Type="String" />
        <asp:Parameter Name="dataEntryName" Type="String" />
        <asp:Parameter Name="dataEntryPhone" Type="String" />
        <asp:Parameter Name="signature" Type="String" />
        <asp:Parameter Name="entryDate" Type="DateTime" />
    </UpdateParameters>
</asp:SqlDataSource>

当我尝试更新记录时,我收到一条错误,指出我的查询中有太多参数.我已经三次检查我的代码中的参数与我的存储过程中的参数完全匹配(名称,编号,甚至顺序).

在试图找到答案时,我遇到this post,其中引用了this site(必须转到archive.org,因为原始版本似乎已关闭).我将他们建议用于添加参数的内容应用于跟踪功能.我发现在我的存储过程中,select流程中有一些“查找”值不在更新过程中.我正在尝试更新的表只有测试者的ID,但是用户也希望看到他们的名字,所以它引用了该表,但在FormView中这些字段在编辑模式下是只读的,所以他们可以试图改变它.所有其他参数排队……只有那些查找值关闭.

我认为通过包含要传递的特定参数列表,它只会使用这些参数,但这似乎是不正确的.现在我很难过,因为我已经指定了参数,而且我无法看到任何地方被select存储过程中的那些覆盖.我在哪里告诉它不要使用这些只读值?

我不想将它们从原始存储过程中删除,因为用户将需要它们.到目前为止,我提出的一个解决方法是将它们添加到存储过程中,然后永远不要使用它们.虽然我相当肯定这会起作用,但它只是掩盖问题而不是修复它.

编辑:每个请求的附加代码

这是将参数输出到跟踪函数的方法:

protected void TestSqlDataSource_Updating(object sender,SqlDataSourceCommandEventArgs e)
{
    for (int i = 0; i < e.Command.Parameters.Count; i++)
    {
        Trace.Write(e.Command.Parameters[i].ParameterName);
        if (e.Command.Parameters[i].Value != null)
        {
            Trace.Write(e.Command.Parameters[i].Value.ToString());
        }
    }
}

这是用于更新的存储过程:

ALTER PROCEDURE [dbo].[usp_UpdateTest]
    @testId INT,@testerLicense INT,@premiSEOwner VARCHAR(50),@premiseAddress VARCHAR(150),@premiseCity VARCHAR(50),@premiseState VARCHAR(2),@premiseZip VARCHAR(10),@protectionType VARCHAR(11),@testType VARCHAR(2),@repairs VARCHAR(200),@notes VARCHAR(300),@testDate DATETIME,@employerName VARCHAR(50),@employerAddress VARCHAR(150),@phoneNumber VARCHAR(25),@emailAddress VARCHAR(60),@dataEntryName VARCHAR(50),@dataEntryPhone VARCHAR(25),@signature VARCHAR(50),@entryDate DATETIME
AS 
    BEGIN
        SET NOCOUNT ON;

        UPDATE  dbo.Tests
        SET     TesterLicense = @testerLicense,PremiSEOwner = @premiSEOwner,PremiseAddress = @premiseAddress,PremiseCity = @premiseCity,PremiseState = @premiseState,PremiseZip = @premiseZip,ProtectionType = @protectionType,TestType = @testType,Repairs = @repairs,Notes = @notes,TestDate = @testDate,EmployerName = @employerName,EmployerAddress = @employerAddress,PhoneNumber = @phoneNumber,EmailAddress = @emailAddress,DataEntryName = @dataEntryName,DataEntryPhone = @dataEntryPhone,Signature = @signature,EntryDate = @entryDate 
        WHERE TestID = @testId
    END

解决方法

结束了我自己的想法.这与Visual Studio基于存储过程的模式为我创建模板的事实有关.自动生成模板时,< EditItemTemplate>中的每个文本框都会生成.部分生成如下:

<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Bind("TestID") %>'/>

事实证明,导致这种情况的是Bind声明. VS会自动为使用Bind填充的任何字段创建参数.虽然我被引导相信< UpdateParameters>部分应该已经覆盖了这个,实际上是另一种方式.通过将这些字段上的代码从Bind更改为Eval,我能够阻止这些少数只读字段传回其参数:

<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Eval("TestID") %>'/>

现在工作得很好.

附录:

发现这也导致了另一个方向的同样问题.如果您标记的字段不需要编辑为Eval但是它需要包含在更新中(例如行ID),则它将无法工作,这次参数太少.我现在想知道< UpdateParameters>的目的是什么?部分甚至是,因为它似乎没有跟随任何东西……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读