tec*_*tle 5 asp.net formview stored-procedures
我知道这类问题在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>
Run Code Online (Sandbox Code Playgroud)
当我尝试更新记录时,我收到一条错误,指出我的查询中有太多参数.我已经三次检查我的代码中的参数与我的存储过程中的参数完全匹配(名称,编号,甚至顺序).
在试图找到答案时,我发现这篇文章引用了这个网站(不得不去archive.org,因为原版似乎已经关闭).我将他们建议用于添加参数的内容应用于trace函数.我发现在我的存储过程中,select流程中有一些"查找"值不在更新过程中.我正在尝试更新的表只有测试者的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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是用于更新的存储过程:
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
Run Code Online (Sandbox Code Playgroud)
结束了我自己的想法.这与Visual Studio基于存储过程的模式为我创建模板的事实有关.自动生成模板时,该<EditItemTemplate>部分中的每个文本框都会生成如下:
<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Bind("TestID") %>'/>
Run Code Online (Sandbox Code Playgroud)
事实证明,这是Bind引起这种情况的声明.VS自动为使用填充的任何字段创建参数Bind.尽管我被引导相信该<UpdateParameters>部分应该已经覆盖了这一部分,但实际上却是另一种方式.我能够通过将这些字段上的代码更改Bind为Eval:来阻止这些少数只读字段传回其参数:
<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Eval("TestID") %>'/>
Run Code Online (Sandbox Code Playgroud)
现在工作得很好.
附录:
发现这也导致了另一个方向的同样问题.如果您标记了一个您不想编辑的字段,Eval但它需要包含在更新中(例如行ID),则它将无法工作,这次参数太少.我现在想知道该<UpdateParameters>部分的目的是什么,因为它似乎没有任何内容......
| 归档时间: |
|
| 查看次数: |
9241 次 |
| 最近记录: |