【发布时间】: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