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