c# - GridView 没有拾取空数据对象

标签 c# asp.net sql-server-2008

我有一个 gridview,它由一个存储过程通过标准的 n 层结构提供,它应该触发空行对象,但它没有。相反,我得到一个异常“IListSource 不包含任何数据源”。如果我在 SQL Server Management Studio 中运行查询,它会返回一个空行。

我怀疑问题出在 transact-sql 上,我使用的是 PIVOR consrtuct,因为我不太熟悉它的工作原理,所以我认为这是导致问题的原因。这是从this blog借来的并由我的前任修改。

有谁知道是什么导致了这个问题?这是代码。

<asp:GridView ID="gvSystemRMRiskRpt" runat="server" AutoGenerateColumns="true"
   CellPadding="3" PageSize="25" BackColor="White" BorderColor="MidnightBlue"
   BorderStyle="Groove" BorderWidth="1px" CssClass="TextCompact" GridLines="Vertical"
   OnRowDataBound="gvSystemRMRiskRpt_OnDataBound" EmptyDataText="Your request has returned zero records" >                
    <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
    <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
    <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
    <AlternatingRowStyle BackColor="Gainsboro" />
    <FooterStyle BackColor="#CCCCCC" ForeColor="Black" VerticalAlign="Top" />
</asp:GridView>

代码文件:

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        Guid site = new Guid(ddlSites.SelectedValue);
        int interval = Convert.ToInt16(ddlIntervals.SelectedValue);
        string[] startDate = tbStartDate.Text.Split('/');  // 01-2001
        string[] stopDate = tbEndDate.Text.Split('/');     // 12/2002

        gvSystemRMRiskRpt.DataSource = Data.ByMonthYear(connectionManager,site,startDate[1],stopDate[1],interval);
        gvSystemRMRiskRpt.DataBind();
     }

数据层:

 public static DataSet ByMonthYear(ConnectionManager connectionManager, Guid site, string startDate, string stopDate, int interval)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "[dbo].[ByMonthYear_StoredProc]";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = connectionManager.GetSqlConnectionContext();
        cmd.Transaction = connectionManager.GetSqlTransactionContext();

        SqlParameter paramSiteGUID = new SqlParameter("@SiteGUID", SqlDbType.UniqueIdentifier);
        paramSiteGUID.Value = site;
        cmd.Parameters.Add(paramSiteGUID);

        SqlParameter paramStartDate = new SqlParameter("@StartDate", SqlDbType.VarChar);
        paramStartDate.Value = startDate;
        cmd.Parameters.Add(paramStartDate);

        SqlParameter paramStopDate = new SqlParameter("@StopDate", SqlDbType.VarChar);
        paramStopDate.Value = stopDate;
        cmd.Parameters.Add(paramStopDate);

        SqlParameter paramProcedureAction = new SqlParameter("@ProcedureAction", SqlDbType.Int);
        paramProcedureAction.Value = 0; // From Primary Key
        cmd.Parameters.Add(paramProcedureAction);

        SqlParameter paramInterval = new SqlParameter("@Interval", SqlDbType.Int);
        paramInterval.Value = interval;
        cmd.Parameters.Add(paramInterval);

        SqlDataAdapter sqlDA = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        sqlDA.Fill(ds);

        cmd.Dispose();
        cmd = null;

        return ds;
    }

和实际的存储过程:

alter PROCEDURE [dbo].[ByMonthYear_StoredProc]
@ProcedureAction int,
@SiteGUID uniqueidentifier = null,
@StartDate varchar(4),
@StopDate varchar(4),
@Interval int
AS

DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)

IF (@ProcedureAction = 0) -- From 
BEGIN

    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    IF (@Interval = 1) -- Montly
    BEGIN
        SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT '],[' + cast(MonthYear as varchar(10)) FROM vByMonthYear where SiteGUID = @SiteGuid 
        and [Year] BETWEEN '2005' AND '2010' ORDER BY '],[' + cast(MonthYear as varchar(10)) FOR XML PATH('') ), 1, 2, '')
         + ']' SET @query = N'SELECT EventType, ' + @cols +' FROM (SELECT MonthYear,EventType,Value,OrderBy FROM vRByMonthYear 
         where SiteGUID = ' + CHAR(39) + CONVERT(nvarchar(36), @SiteGuid) + CHAR(39) + ' and Year BETWEEN 2005 AND 2010) p 
         PIVOT ( Sum ([Value] ) FOR MonthYear IN ( '+ @cols +' ) ) AS pvt order by OrderBy' 
        execute(@query)
    END
END

重申一下,如果我运行 SELECT DISTINCT TOP 100 PERCENT '],[' + cast(MonthYear as varchar(10)) FROM vByMonthYear where SiteGUID = @SiteGuid and [Year] BETWEEN '2005' AND '2010' in在查询窗口中,我将 @SiteGuid 替换为一个我知道没有记录的实际值,我得到一个空行,但在我的应用程序中我得到了异常。

最佳答案

我怀疑这就是发生的事情,但不是 100% 确定。适配器

  SqlDataAdapter sqlDA = new SqlDataAdapter(cmd);
  DataSet ds = new DataSet();
  sqlDA.Fill(ds);

被一行无数据填充,因此返回的数据集未被视为空数据集 - 不知道为什么。我怀疑奇怪的 SQL Pivot 返回了一些引用或空白。

无论如何,我已经更改了方法以返回 DataTable 而不是 DataSet 并删除了整个 SqlDataAdapter 而是使用了 SqlReader 有效。可能在此过程中节省了大约 1 毫秒的开销。

using (SqlDataReader _reader = cmd.ExecuteReader())
{
     DataTable dt = new DataTable();
     dt.Load(_reader);
     cmd.Dispose();
     return dt;
}

关于c# - GridView 没有拾取空数据对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14388938/

相关文章:

c# - 将消息从网站发布到 Facebook 墙

javascript - Telerik RadConfirm 不适用于 asp.net 的 UserControls

asp.net - MySQL/ASP.NET 存储过程

sql - 如何使用sql选择其他相关表中不存在的记录?

sql-server-2008 - MS SQL 搜索文本字段不正确

c# - 在 C# 中将 Stream 转换为 FileStream

c# - 如何在 C# .NET 中翻转/旋转 PrintDocument?

c# - 将所有 Area、Controller 和 Action 获取为一棵树

c# - HTML Agility Pack 是否包含非托管代码?如果是这样,我的应用程序会遇到问题吗?

sql - 在 SQL Server 中执行日期/时间减法