【问题标题】:Gridview is not displayed when using stored procedure in SQLDatasource在 SQLDatasource 中使用存储过程时不显示 Gridview
【发布时间】:2011-10-30 03:47:10
【问题描述】:

我以前偶然发现过这个问题,我知道这是一个常见问题。一个相关问题是GridView is empty。但这并不能解决我的问题。

理想情况下,当我单击“查找”按钮时,我想要根据文本框中的值更新我的网格视图。它在我的其他页面中对我有用。但是我这里有一些问题。我没有更改任何默认参数。这是网格视图

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
    DataSourceID="SqlDataSource1" AutoGenerateColumns="False" 
    DataKeyNames="ID">
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
            ReadOnly="True" SortExpression="ID" />
        <asp:BoundField DataField="companyname" HeaderText="companyname" 
            SortExpression="companyname" />
        <asp:BoundField DataField="contactfirstname" HeaderText="contactfirstname" 
            SortExpression="firstname" />
        <asp:BoundField DataField="contactlastname" HeaderText="contactlastname" 
            SortExpression="lastname" />
        <asp:BoundField DataField="phonenumber" HeaderText="phonenumber" 
            SortExpression="phonenumber" />
        <asp:BoundField DataField="contactid" HeaderText="contactid" 
            SortExpression="contactno" />
    </Columns>
</asp:GridView>

在我的“查找”按钮单击事件中。我正在使用此代码

protected void btnFind_Click(object sender, EventArgs e)
{
    SqlDataSource1.DataBind(); /* Edit: I don't need this, I realized */
}

但它不加载任何东西。整个gridview 没有出现。如果我使用 select 语句,gridview 确实会出现结果。我已经在 gridview 中测试了我的存储过程,它按应有的方式工作。不知道这里到底是什么问题?有人遇到过吗?

如果存储过程返回 0 结果,我想我在某处读到,gridview 将不会显示。

我的 SQL 数据源

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:MyDBconn %>" 
    SelectCommand="usp_GetContactNo" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:FormParameter DefaultValue="" FormField="txtCompanyName" 
            Name="companyname" Type="String" />
        <asp:FormParameter FormField="txtFirstName" Name="firstname" Type="String" />
        <asp:FormParameter FormField="txtLastName" Name="lastname" Type="String" />
        <asp:FormParameter FormField="txtPhone" Name="phone" Type="String" />
        <asp:FormParameter FormField="txtContactID" Name="contactNo" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

StoredProcedure 如下。请注意,出于安全原因,我可能在上面更改了一些名称,但下面是原始字段。

ALTER PROCEDURE [dbo].[usp_GetContactIDs] 
    -- Add the parameters for the stored procedure here
    @companyname varchar(255) = NULL, 
    @firstname varchar(255) = NULL,
    @lastname varchar(255) = NULL,
    @phone varchar(10) = NULL,
    @contactid varchar(15) = NULL
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    Declare @sql varchar(1000);



    set @sql = 'select ID, companyname,contactfirstname,contactlastname,phonenumber, contactid from oet WHERE ID is not null'

    if(@companyname is not null)
        set @sql = @sql + ' AND companyname = '''+ @companyname + '''';

    if(@firstname is not null)
        set @sql = @sql + ' AND contactfirstname = '''+ @firstname + '''';

    if(@lastname is not null)
        set @sql = @sql + ' AND contactlastname = '''+ @lastname + '''';

    if(@phone is not null)
        set @sql = @sql + ' AND phonenumber = '''+ @phone + '''';

    if(@contactid is not null)
        set @sql = @sql + ' AND contactid = '''+ @contactid + '''';


    exec (@sql)


END

【问题讨论】:

  • 你为什么在SqlDataSource 上打电话给DataBind()?这是“查找”按钮唯一的作用吗?
  • 是的,需要更新网格视图。
  • 更正:你是对的DataBind()不需要。
  • 你能发布你的SP吗?
  • 已发布存储过程。这在常规方式和 SQL 数据源测试查询内部都可以正常工作,但在页面上却不行。

标签: asp.net stored-procedures gridview sqldatasource


【解决方案1】:

我刚遇到类似的问题,最后我通过在[SqlDataSource]->[Properties]视图或代码中设置CancelSelectOnNullParameter false解决了它:&lt;asp:SqlDataSource ID="..." runat="server" ... CancelSelectOnNullParameter="False"&gt;

如果您的存储过程允许 null 参数,因为它被设置为默认值,这很容易错过

【讨论】:

  • 这是救命稻草。说真的,MSFT 有谁想过将其默认设置为“真实”?
【解决方案2】:

我花了一天多的时间才解决它。 问题出在母版页。当我从页面中删除母版页时,一切正常。发生的事情是 txtFirstName 控件在页面上,但由于我使用的是母版页,所以从未找到它。结果它每次都传递一个空值。它没有产生任何错误(这是应该的),这使得调试非常棘手。

您还需要查看许多其他属性。重要的是

在 SQL 数据源中,配置数据源,参数部分:选择参数并单击“显示高级选项”,ConvertEmptyStringToNull。您可能需要将其更改为 false。

SQLDatasourc -> 属性 -> CancelSelectOnNullParamter = 将其更改为 false

【讨论】:

  • 如果您在 C# 中使用 FindControl,那么如果文本框名称存在于同一页面上,则通过 id 查找文本框名称应该没有问题,所以我不认为您的问题出在哪里
  • 我没有使用任何 C# 代码。一切都是ASP。我现在正在查看 $ 运算符来解决 findcontrol 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2016-01-22
  • 1970-01-01
  • 2013-12-23
  • 2018-08-12
  • 1970-01-01
相关资源
最近更新 更多