来自proc的asp.net多个结果集:是否有必要将结果映射到类?如果是这样,怎么样?

时间:2010-11-26 16:21:21

标签: asp.net ado.net data-access-layer

请考虑以下情况。

你有一个存储过程返回多个结果集 查询运行以用于报告目的。

proc也使用表值参数(SQL 2008)。 http://www.sommarskog.se/arrays-in-sql-2008.html#LINQ_EF

这些结果集是只读的,这意味着您不必这样做 担心更新,删除或插入。

这些结果集不会映射到数据库中的任何表; 这些是报告结果,而不是数据库表的镜像。

现在,我的背景是asp经典,而我一直在尝试阅读 在所有.NET数据访问策略中,似乎: (1)MS正在推动实体框架 (2)MS拥有大量的数据访问/架构策略 (3)整个主题是一个持续争论的主题 (4)项目的情况有助于规定正确的数据访问策略,     并且ORM似乎没有针对此数据访问方案进行优化 (5)没有用于映射多个结果集存储过程的开箱即用解决方案

另外,我正在寻找对html输出的完全控制,所以如果使用后面的代码, 只有Repeater和Literals才会用于数据绑定。

我发现Web窗体编程模型无法实现完全分离 代码和内容,可以像asp经典一样“意大利面”。 (MVC 方法似乎更像asp经典,但这个项目已经是WebForms。)

我认为通过数据访问和内联脚本实现这很容易实现< %%>在同一页上。 以下是将产生的代码类型的示例:

<%
' data access (skipping a bunch of code)....
Dim myDataSet As New DataSet()
myCommand.Fill(myDataSet)
'...etc.    

Teachers = myDataSet.Tables(0).Rows
Students = myDataSet.Tables(1).Rows
'... etc.%>

然后

<%  If Teachers.Count > 0 Then%>
<table><%  For Each _Teachers In Teachers%>
    <tr>
        <td><%= _Teachers(0)%></td>
        <td><%= _Teachers(1)%></td>
    </tr><% Next %>    
</table>
<%  Else%>Hey, there's no records.<% End If %> 

(当我尝试在“Protected Sub Page_Load ...”下面的代码中分离数据访问时, 我在.aspx页面中使用的代码中的变量不断给出错误: “[变量]未声明。由于其保护级别,它可能无法访问。”)

如果来自proc的结果集没有强类型, 它是世界末日,糟糕的编程实践,可维护性的噩梦, 最糟糕的选择等等?

如果存储过程的结果集应该是强类型的, 那么最有效的方法是什么? (我不是 找到关于这个主题的直接教程。)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

听起来您在询问是否应该继续为数据使用ADO.NET容器或自定义域类。

如果您觉得在显示之前需要强类型类,输入验证或其他逻辑应用于您的数据,那么请考虑编写一个方法将DataTable转换为YourClass的集合。否则,如果这是显示,那么坚持使用DataTable没有任何问题。如果您为其他组件提供界面,或者需要类可以提供的功能,请选择类的强类型。

public IEnumerable<Teacher> ConvertToTeachers(DataTable dt)
{
    foreach (var row in dt.Rows.AsEnumerable())
    {
        //create a teacher from this row. modify row indexers as required.
        yield return new Teacher{ TeacherName = row["Name"].Value,
                                  Location = row["Location"].Value };
    }   
}

在表示层上,请考虑利用ASP.NET webforms为您提供的服务器控件。它们提供了数据绑定功能,可以消除所有循环。

  • 确保您的gridview按照您的喜好进行设计。包含所需数据的正确列:常规绑定字段和超链接。

  • 将您的数据绑定到网格。

 gridViewTeachers.DataSource = myDataSet.Tables(0).Rows
 gridViewTeachers.DataBind