【问题标题】:Problem in populating gridview from stored procedure从存储过程填充gridview的问题
【发布时间】:2011-07-19 02:21:26
【问题描述】:

我有一个 Gridview,我从一个接受 3 个参数的存储过程中填充它。第一个参数从表单变量 Request.Form["uid"] 中获取其值,第二个和第三个参数从 DropDownLists SelectedValue 属性中获取其值。如果从 DropDownLists 中未选择任何内容,则第二个和第三个参数应接受 NULL。我还将参数的 ConvertEmptyStringToNull 属性设置为 true。 Gridview 仍未填充。但是当我手动传递参数并从 SQL Server Management Studio 以及 Visual Studio 的测试查询窗口执行存储过程时,它工作正常。

Gridview 的我的 SQLDataSource 如下所示:

<asp:SqlDataSource ID="SqlGVDownloadHistory" CancelSelectOnNullParameter="false" runat="server" ConnectionString="<%$ ConnectionStrings:xxx %>"
            SelectCommand="spDHR" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:FormParameter FormField="uid" Name="UIDUser" Type="String" />
                <asp:ControlParameter ControlID="ddlSelectDocument" Name="FileName"
                    PropertyName="SelectedValue" Type="String" ConvertEmptyStringToNull="true" />
                <asp:ControlParameter ControlID="ddlSelectCCO" Name="UIDSelect" PropertyName="SelectedValue"
                    Type="String" ConvertEmptyStringToNull="true" />
            </SelectParameters>
        </asp:SqlDataSource>

请帮忙!!

【问题讨论】:

  • 感谢 Naveen 的这个提示。我是这个论坛的新手,所以不知道这一点。
  • 是这样想的。您对答案非常敏感
  • 你可以为你的gridview显示你的标记吗?您是否已确认您将 gridview 的数据源绑定到您创建的数据源?您能否至少显示存储过程的参数名称?

标签: c# asp.net


【解决方案1】:

试试这个。

<asp:SqlDataSource ID="SqlGVDownloadHistory" runat="server" 
            ConnectionString="<%$ ConnectionStrings:xxx %>" 
            SelectCommand="spDHR"
            SelectCommandType="StoredProcedure" 
            OnSelecting="SqlGVDownloadHistory_Selecting">
    <SelectParameters>
        <asp:FormParameter FormField="uid" Name="UIDUser" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

关于背后的代码

protected void SqlGVDownloadHistory_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    SqlGVDownloadHistory.SelectParameters.Remove("FileName");
    SqlGVDownloadHistory.SelectParameters.Remove("UIDSelect");
    if (ddlSelectDocument.SelectedIndex > 0)
    {
        SqlGVDownloadHistory.SelectParameters.Add("FileName", ddlSelectDocument.SelectedValue);
    }
    if (ddlSelectCCO.SelectedIndex > 0)
    {
        SqlGVDownloadHistory.SelectParameters.Add("UIDSelect", ddlSelectCCO.SelectedValue);
    }
}

这个想法是在数据检索操作发生之前设置参数。

根据MSDN documentation on COntrolParameters,我没有看到asp:DropDownList Selectedvalue 被设置为ControlValuePropertyAttribute

【讨论】:

  • 我试过了,但它不起作用。我已在数据库中将 FileName 和 UIDSelect 参数的默认值设置为 NULL。当我为 Gridview 配置 SQLDataSource 时,我可以选择 DropDownList 作为从何处获取参数值的控件。
  • 是的,我认为 msdn 错过了这一点。但问题是你真的没有办法根据选定的索引设置参数,除非你以编程方式设置它。
  • 但它仍然无法正常工作。我使用手表调试参数。所有值都显示为 NULL,并且没有返回任何行。
  • 执行您的代码会出现错误“过程指定了太多参数”。这是因为参数被多次添加。
  • 更新了代码。如果您在存储过程中分配了 null 应该没问题。我已经很长时间没有使用 SqlDataSource 了。如果问题仍然存在,请回复
【解决方案2】:

尝试将存储过程中的两个输入参数的默认值设置为 null。

【讨论】:

  • 我已经这样做了。之后,如果我使用代码隐藏(使用数据集和 SqlDataAdapter)填充 Gridview,它工作正常。但在这种情况下,我将不得不手动处理 PageIndexChanged 和其他事件。这就是我想使用图形界面的原因。
  • 在 gridview 中处理多个页面所需的代码行数最少,如果您需要在 gridview 上添加数字标签,我可以向您展示一个示例
  • 那将非常有帮助。我尝试了网上的一个例子,但它导致回发后数据源为空的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2010-12-28
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多