【问题标题】:Changed stored procedure not recognized in ASP.NET - SQLDataSource在 ASP.NET 中无法识别更改的存储过程 - SQLDataSource
【发布时间】:2011-10-06 13:14:25
【问题描述】:

我正在使用 ASP.NET 和 StoredProcedure。我更改了存储过程,所以现在它返回 10 个字段而不是 9 个。我在 asp.net 中添加了相应的文本框,它获得了第 10 个字段。

<asp:TextBox ID="ID" runat="server" Text='<%# Eval("ID") %>' Width="80px" ReadOnly="true"></asp:TextBox>

但它失败了,说

DataBinding:“System.Data.DataRowView”不包含属性 名称为“ID”。

我在 SQL Management Studio 中运行存储过程,它确实没有返回新修改的字段。我停止并启动 SQL 引擎,现在它确实吐出了新值,但在我的 ASP.net 应用程序中,它仍然无法识别新值。解决此问题的最佳方法是什么?我以前也遇到过。

添加调用SP的代码:

SqlConnection aConn = new 
SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString);
SqlCommand aCommand = new SqlCommand("GetCustomer", aConn);
aCommand.CommandType = CommandType.StoredProcedure;
aCommand.Parameters.Add("@ID", SqlDbType.Int).Value = aID;
SqlDataAdapter adapter = new SqlDataAdapter(aCommand);
DataSet aCustomerDS = new DataSet();
adapter.Fill(aCustomerDS);

我的存储过程是(这里没有什么奇怪的):

CREATE PROCEDURE [dbo].[GetCustomer]
    @ID int
AS
BEGIN
    SET NOCOUNT ON;

IF @ID = 0
BEGIN    
SELECT  ID,
    [this field] as thisfield,
       [that field] as thatfield,
       [new field] as newfield
FROM MyDB.dbo.customers
ORDER BY ID DESC
END
ELSE
BEGIN
SELECT  ID,
    [this field] as thisfield,
       [that field] as thatfield,
       [new field] as newfield
FROM MyDB.dbo.Customers
WHERE ID = @ID
ORDER BY ID DESC
END
END

FormView用于绑定数据到sdsCustomer

<asp:FormView ID="fvCustomer" runat="server" AllowPaging="True" DataSourceID="sdsCustomer"
            DataKeyNames="ID" OnPreRender="OnfvCustomer_PreRender">

【问题讨论】:

  • 你能发布存储过程(至少选择部分)和数据源定义吗?
  • 很好的补充,但仅仅 conn 是不够的。需要用于返回数据的 SQL 以及您可能绑定到 aCustomerDS 的表单数据源。
  • 用 SP 更新,但没有什么奇怪的。
  • 仍然看不到您绑定到控件的数据源定义。
  • 添加了那部分(到最后)。第一段代码就在这个表单视图中。

标签: asp.net debugging stored-procedures sqldatasource


【解决方案1】:

您需要更新数据源本身以反映结果。

【讨论】:

  • 数据源是在 C# 代码中动态生成的。当我运行应用程序 + 调用存储过程并且参数数量没有改变时,它总是更新,只在 SP 内部。
  • 你的意思是 AutoGenerateColumns 开启了?
【解决方案2】:

解决此问题的最佳方法是什么?

您的存储过程的来源是什么样的?

在运行查询的行上设置断点。检查返回的结果并确保您的 ID 列确实存在。

或者,启动 SQL Profiler 并确保:

  1. 当使用应用程序使用的相同参数值调用过程时,ID 列会出现在结果集中,
  2. 您的 proc 只返回一个结果集。
  3. 确保您已包含该行

    设置不计数;

在您的程序中。

如果过程无意中返回了多个结果集(如果您遗漏了 set nocount 语句,就会发生这种情况),您的数据源可能不包含您所期望的。

【讨论】:

  • 我在那里但是你知道数据在DataSet中的存储位置吗,找不到。
【解决方案3】:

我的回答:很复杂。

FormView1 绑定到两个存储过程:1) 使用 SQLDataSource 2) 动态使用 SQLDataSource

如果我要更改动态创建的字段,ASP 会给我一个错误,即 formview 无法识别新字段。为了摆脱这个错误,我修改了原来绑定到 formview 的 SQLDataSource 并添加了该字段,这样就摆脱了错误。所以基本上这是微软的错误。它着眼于不同的存储过程,并且我正在使用不同的存储过程填充 formview,如果两个存储过程中的字段不匹配,我会收到一个非常误导性的错误,因为 ID 确实在存储过程中,但不在一个这与表单视图相关联。下面是bug的示意图。

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多