c# - CTE 查询在 asp.net 中使用 c# for webform 在数据集中生成错误

标签 c# asp.net sql webforms common-table-expression

已解决..

这已经解决了,因为我犯了一个愚蠢的错误。我没有初始化字符串生成器 StringBuilder sb = new StringBuilder();

我在我的网站中使用以下 CTE 查询来使用 C# 获取数据。但是它在 for 循环中的 if 语句中给出了一个错误

错误信息

System.NullReferenceException 未被用户代码处理 Message=对象引用未设置为对象的实例。

    String strSqlCTE;

    strSqlCTE= " DECLARE @PageId int ";
    strSqlCTE += " SET @PageId =" + pageid + "; ";
    strSqlCTE += " WITH RecursiveTable (PageId, PageName, PageInternalLink, PageInternalLinkUrl, PageInheritance, Level) ";
    strSqlCTE += " AS(SELECT      tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance,  0 AS Level ";
    strSqlCTE += " FROM pg_Pages AS tt WHERE PageId = @PageId ";
    strSqlCTE += " UNION ALL ";
    strSqlCTE += " SELECT tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, Level + 1 ";
    strSqlCTE += " FROM pg_Pages AS tt ";
    strSqlCTE += " INNER JOIN RecursiveTable rt ON rt.PageInheritance = tt.PageId  ) ";
    strSqlCTE += " SELECT * FROM RecursiveTable ORDER BY Level DESC ";

    DataSet dsBC = new DataSet();
    dsBC = DataProvider.Connect_Select(strSqlCTE);
    if (dsBC.Tables[0].Rows.Count > 0)
    {
        int RowCount = dsBC.Tables[0].Rows.Count;
        StringBuilder sb = null;
        for ( int i = 0; i <= RowCount; i++)
        {
            if (i == RowCount)
            {
                sb.Append("<a href='" + dsBC.Tables[0].Rows[0]["PageInternalLinkUrl"].ToString() + "'>" + dsBC.Tables[0].Rows[0]["PageName"].ToString().ToUpper() + "</a>");
            }
            else
            {
                sb.Append("<a href='" + dsBC.Tables[0].Rows[0]["PageInternalLinkUrl"].ToString() + "'></a> ● ");
            }

        }

        ltrBreadCrumb.Text = sb.ToString();

    }

我的 CTE 查询正在运行,下面是实际查询

DECLARE @PageId int
SET @PageId = 31;
WITH RecursiveTable (PageId, PageName, PageInternalLink, PageInternalLinkUrl, PageInheritance, Level)
AS(
   --Anchor
    SELECT      tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance,  0 AS Level
    FROM pg_Pages AS tt
    WHERE PageId = @PageId
    UNION ALL
   --Recursion
    SELECT tt.PageId,  tt.PageName , tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, Level + 1
    FROM pg_Pages AS tt
    INNER JOIN RecursiveTable rt ON rt.PageInheritance = tt.PageId
)
SELECT * FROM RecursiveTable ORDER BY Level DESC

这在 Management studio 中运行时效果很好,但以下语句会产生错误

sb.Append("<a href='" + dsBC.Tables[0].Rows[0]["PageInternalLinkUrl"].ToString() + "'></a> ● ");

dsBC.Tables[0].Rows.Count 语句根据输入返回正确的行号。问题似乎在于它无法识别 CTE 查询中存在的列名。

我是不是做错了什么,请指正我的问题。

最佳答案

这已经解决了,因为我犯了一个愚蠢的错误。我错过了初始化字符串生成器

StringBuilder sb = new StringBuilder();

String strSqlCTE;

    strSqlCTE= " DECLARE @PageId int ";
    strSqlCTE += " SET @PageId =" + pageid + "; ";
    strSqlCTE += " WITH RecursiveTable (PageId, PageName, PageInternalLink, PageInternalLinkUrl, PageInheritance, Level) ";
    strSqlCTE += " AS(SELECT      tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance,  0 AS Level ";
    strSqlCTE += " FROM pg_Pages AS tt WHERE PageId = @PageId ";
    strSqlCTE += " UNION ALL ";
    strSqlCTE += " SELECT tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, Level + 1 ";
    strSqlCTE += " FROM pg_Pages AS tt ";
    strSqlCTE += " INNER JOIN RecursiveTable rt ON rt.PageInheritance = tt.PageId  ) ";
    strSqlCTE += " SELECT * FROM RecursiveTable ORDER BY Level DESC ";

    DataSet dsBC = new DataSet();
    dsBC = DataProvider.Connect_Select(strSqlCTE);
    if (dsBC.Tables[0].Rows.Count > 0)
    {
        int RowCount = dsBC.Tables[0].Rows.Count;
        StringBuilder sb = new StringBuilder();
        for ( int i = 0; i <= RowCount; i++)
        {
            if (i == RowCount)
            {
                sb.Append("<a href='" + dsBC.Tables[0].Rows[i]["PageInternalLinkUrl"].ToString() + "'>" + dsBC.Tables[0].Rows[i]["PageName"].ToString().ToUpper() + "</a>");
            }
            else
            {
                sb.Append("<a href='" + dsBC.Tables[0].Rows[i]["PageInternalLinkUrl"].ToString() + "'></a> ● ");
            }

        }

        ltrBreadCrumb.Text = sb.ToString();

    }

关于c# - CTE 查询在 asp.net 中使用 c# for webform 在数据集中生成错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10207991/

相关文章:

sql - MySQL 不首先显示最短的结果

c# - ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

c# - 在 foreach 语句中使用空合并

c# - 如何让 .Net Framework SignalR 客户端连接到 .Net Core SignalR 服务器?

c# - 我可以在中继器中使用循环吗?推荐吗?

c# - 在 Internet Explorer 8 和 9 中播放非 pcm (gsm) ".wav"-文件

sql - 按所有列分组的简写?

sql - 从结果中消除重复的组合

c# - 如何使用 servicestack 类型的客户端?

c# - OWIN 自托管中的 Nancy 和 WebAPI 路由冲突