代码之家  ›  专栏  ›  技术社区  ›  mg1075

asp.net proc中的多个结果集:是否需要将结果映射到类?如果是,怎么做?

  •  1
  • mg1075  · 技术社区  · 15 年前

    请考虑以下情况。

    有一个存储过程返回 出于报告目的运行查询。

    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输出的完全控制,所以如果使用代码隐藏, 只有中继器和文本将用于数据绑定。

    我发现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 回复  |  直到 15 年前
        1
  •  0
  •   p.campbell    15 年前

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

    如果您觉得需要类的强类型、输入的某些验证或显示前应用于数据的其他逻辑,那么可以考虑编写一个方法,将数据表转换为类的集合。否则,如果这是为了显示,那么粘贴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
    
    推荐文章