【问题标题】:How can I convert SQL Stored Procedure tables to HTML using C#如何使用 C# 将 SQL 存储过程表转换为 HTML
【发布时间】:2015-03-03 04:47:50
【问题描述】:

我有一个返回 5 个不同表的大型存储过程。 我需要将存储过程生成的这些表显示为 HTML。

由于封闭类中的方法给出的看似毫无意义的错误消息,我正在努力寻找问题所在;我正在寻找该问题的新解决方案,但欢迎所有贡献

我继承了一个系统,该系统使用一种非常古老的方法通过 IES.Core.ReportTool 执行此操作。 我有一个 XLST 文件和一些 c# 来执行此操作-

        string connStr = ConfigurationManager.AppSettings["DBConnStr"];

        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "Proc_cisiv_ProgramDayData";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@ProgramDayNodeID", SqlDbType.Int);
        cmd.Parameters.Add("@UserID", SqlDbType.Int);

        PageInfo pInfo = CMS.DocumentEngine.DocumentContext.CurrentPageInfo;
        cmd.Parameters["@ProgramDayNodeID"].Value = pInfo.NodeID;
        cmd.Parameters["@UserID"].Value = CMS.Membership.MembershipContext.AuthenticatedUser.UserID;
        ReportTool rt = new ReportTool();

        try
        {
            lit.Text = rt.GenerateHTML(Server.MapPath("~/CMSPages/XSLT/ProgrammeDay.xslt"), connStr, cmd, false);
        }
        catch (Exception ex)
        {
            lit.Text = ex.ToString();
        }

但有些地方不太对劲,它会抛出一个空引用异常,如下所示 -

System.NullReferenceException:对象引用未设置为对象的实例。在 IES.Core.ReportTool.BaseGenerateHTMLFromSQL(字符串 xslPathAndFileName,字符串 xsdPathAndFileName,字符串 xmlMapPathAndFileName,XsltArgumentList xslArgs,字符串 DBConnStr,SqlCommand sqlCommandObject,布尔调试)在 IES.Core.ReportTool.GenerateHTML(字符串 xslPathAndFileName,字符串 DBconnStr,SqlCommand sqlCommandObject,布尔调试) 在 ProgramDayDetail.Page_Load(Object sender, EventArgs e) 在 c:\Projects\brsweb\CMSWebParts\MyWebPart\ProgramDayDetail.ascx.cs:line 37

第 37 行是

lit.Text = rt.GenerateHTML(Server.MapPath("~/CMSPages/XSLT/ProgrammeDay.xslt"), connStr, cmd, false);

到目前为止我找到的解决方案(尚未完成,但它正在显示从存储过程返回的数据)

     string connStr = ConfigurationManager.AppSettings["DBConnStr"];

        SqlConnection connection = new SqlConnection(connStr);
        connection.Open();

        SqlCommand cmd = connection.CreateCommand();
        cmd.CommandText = "Proc_cisiv_ProgramDayData";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@ProgramDayNodeID", SqlDbType.Int);
        cmd.Parameters.Add("@UserID", SqlDbType.Int);

        PageInfo pInfo = CMS.DocumentEngine.DocumentContext.CurrentPageInfo;

        cmd.Parameters["@ProgramDayNodeID"].Value = pInfo.NodeID;
        cmd.Parameters["@UserID"].Value = CMS.Membership.MembershipContext.AuthenticatedUser.UserID;

        string mapPath = "";
        try
        {
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            lit.Text = ds.GetXml();
        }
        catch (Exception ex)
        {
            lit.Text = ex.ToString() + "</br></br>" + pInfo.NodeID + "</br></br>" + CMS.Membership.MembershipContext.AuthenticatedUser.UserID + "</br></br>" + mapPath;
        }

    connection.Close();

【问题讨论】:

  • 那么第 37 行的哪些本地人是空的? (使用您的调试器。)
  • 我在本地调试过,connStr和cmd都分配了。据我所知,没有任何 null 本地人。
  • 到 XSLT 的映射是否为空? Server.MapPath("~/CMSPages/XSLT/ProgrammeDay.xslt") 换句话说,尝试拉出映射到一个局部变量,看看值是否为空。
  • XSLT 文件真的被称为“ProgrammeDay.xslt”并且真的可以在那个位置找到吗?
  • 从您的描述看来,您有一个工具可以将 SProc 的结果转换为 XML,然后对其应用 XSLT 以获得输出。替换它需要重新实现 db 结果到 XML 转换或整个过程。两者都不可能是简单的。您可能会更好地确定该工具的来源并查看是否可以从该方向获得一些帮助(如果您的解决方案中有源代码,则构建它以进行调试......)。

标签: c# sql xslt stored-procedures


【解决方案1】:

查看您的异常,我认为您向我们展示的代码不足以理解问题。 对GenerateHTML 方法的调用以正确的方式开始。在那个电话里,你打电话给IES.Core.ReportTool.BaseGenerateHTMLFromSQL,你会得到System.NullReferenceException

异常会传播到line 37,但不是正确的行号。
检查内部异常

【讨论】:

  • GenerateHTML 是 ReportTool 类中的一个封闭方法,所以我已经为您提供了我能提供的所有代码
  • 所以ReportTool类有错误。可能是输入参数错误造成的,但是错误发生在那里!
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2013-10-10
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
相关资源
最近更新 更多