C# GridView未拾取空数据对象

C# GridView未拾取空数据对象,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,我有一个gridview,它由一个存储过程通过标准的n层结构提供,该结构应该触发emplty行对象,但它没有。相反,我得到一个异常“IListSource不包含任何数据源”。如果在SQLServer管理研究中运行查询,它将返回一个空行 我怀疑问题出在transact-sql上,我使用的是PIVOR consrtuct,因为我对它的工作原理不太熟悉,我认为这就是问题的原因。它是从我的祖先那里借来的,被我的祖先修改过 有人知道问题的原因吗?这是代码 <asp:GridView ID="gvSy

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

我怀疑问题出在transact-sql上,我使用的是PIVOR consrtuct,因为我对它的工作原理不太熟悉,我认为这就是问题的原因。它是从我的祖先那里借来的,被我的祖先修改过

有人知道问题的原因吗?这是代码

<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>
数据层:

 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

重申一下,如果我从vByMonthYear运行SELECT DISTINCT TOP 100 PERCENT'],['+cast(MonthYear为varchar(10)),其中SiteGUID=@SiteGUID和[Year]在查询窗口中的“2005”和“2010”之间,我用一个我知道没有记录的实际值替换@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;
}

Year在数据库中是一个实际的4字符字段吗..?关于BTWEEN语句..?如果您得到一个错误/异常,那么您也需要将该异常粘贴到此处..@DJKRAZE:是的,Year是一个4字符的db字段。异常是“IListSource不包含任何数据源”。在DataBind()上抛出;当您调试这一行的代码vSystemRpt.DataSource时,是否返回一个填充的数据源?@DJKRAZE:我已将“返回ds”包装到if中(ds.Tables.Count>0返回ds;else返回null;在sql不返回任何行的情况下,IF语句的计算结果确实为null。因此,它似乎确实填充了数据源。您需要显示所有相关的代码。否则,您将让其他人猜测与提供有效答案相关的工作
using (SqlDataReader _reader = cmd.ExecuteReader())
{
     DataTable dt = new DataTable();
     dt.Load(_reader);
     cmd.Dispose();
     return dt;
}