gpt4 book ai didi

asp.net - 过程或函数 'xyz' 指定了太多参数

转载 作者:行者123 更新时间:2023-12-02 14:41:08 25 4
gpt4 key购买 nike

我知道此类问题在 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,因为原始版本似乎已关闭)。我应用了他们建议的将参数添加到 trace 函数的方法。我发现在我的存储过程中,有一些来自选择过程的“查找”值不在更新过程中。我尝试更新的表只有测试人员的 ID,但用户也希望看到他们的姓名,因此它引用该表,但在 FormView 中,这些字段在编辑模式下是只读的,因此他们可以不要试图改变它。所有其他参数都对齐...只有那些查找值关闭。

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

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

<小时/>

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

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

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>的目的是什么部分甚至是,因为它似乎没有遵循其中的任何内容......

关于asp.net - 过程或函数 'xyz' 指定了太多参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14712451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com