DataTable与泛型

    刚刚开始机房重构的时候用的最多的就是DataTable,在用的时候感觉有一点点别扭,因为D层从数据库中
 把数据取出来之后直接通过DataTable返回到B层和U层了,这样对于数据库数据的安全性不太好。然后慢慢知
 道了泛型,通过泛型可以很好的解决数据安全的问题
 一、DataTable

  Public Function QueryCard(card As Entity.CardEntity) As Entity.CardEntity Implements ICard.QueryCard
        Dim helper As New SqlHelper()    '实例化SqlHelper的对象为helper
        Dim dt As DataTable              '接收从SqlHelper中返回的DataTable
        Dim CardInfo As Entity.CardEntity = New Entity.CardEntity()

        Dim Query As String = "select * from card_info where [email protected]"    '存储Sql字段<span style="white-space:pre">
</span><pre name="code" class="csharp">        '实例化SqlParameter,并传入参数

Dim sqlParams As SqlParameter() = {New SqlParameter("@cardno", card.CardNo)}  

        dt = helper.ExecSelect(Query, sqlParams)        '调用对象helper的方法

        '把DataTable中的数据分别放入实体CardInfo中对应的字段
        Try
            CardInfo.CardNo = dt.Rows(0)(0)

            CardInfo.Dates = dt.Rows(0)(5)
            CardInfo.Time = dt.Rows(0)(6)
            CardInfo.Status = dt.Rows(0)(7)
            CardInfo.IsCheck = dt.Rows(0)(8)
            CardInfo.Explain = dt.Rows(0)(9)
            CardInfo.CardType = dt.Rows(0)(1)
            CardInfo.Cash = dt.Rows(0)(2)
            CardInfo.StudentNo = dt.Rows(0)(3)

        Catch ex As Exception
            '出错以后的提示
            MsgBox("卡号不存在或错误", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "提示")
        End Try
        Return CardInfo    '返回实体

    End Function

      这是把DataTable中的数据在D层中直接赋值给实体了,个人认为这样做会相对好一点,因为从数据库
  取得的数据不会直接返回给U层和B层;当然也可以在D层直接将获得的DataTable返回给U层B层,然后在U层
  对DataTable中的数据进行操作,很明显这样对数据来说是很不安全的,而且三层之间通过DataTable传输
  数据也会增加三层的耦合度
 二、泛型

    'DataTable转换为泛型
    Public Shared Function ConvertList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)

        Dim MyList As New List(Of T)                  '定义返回的集合
        Dim Mytype As Type = GetType(T)               '得到类型名

        Dim dr As DataRow                             '定义DataTable的行集

        Dim TmpName As String = String.Empty          '变量初始化,定义空的临时变量
        '遍历DataTable的所有行
        For Each dr In dt.Rows
            Dim MyT As New T                          '创建实体类的对象
            Dim Propertys() As PropertyInfo = MyT.GetType().GetProperties()  '定义属性集合
            Dim pr As PropertyInfo                    'PropertyInfo的实例化

            '遍历pr对象在集合中的所有属性
            For Each pr In Propertys
                TmpName = pr.Name                     '属性名称赋值给定义的临时变量

                '检查DataTable中是否包含此属性,如果包含继续执行
                If (dt.Columns.Contains(TmpName)) Then
                    If (pr.CanWrite = False) Then  '判断属性是否可写,如果不可写跳出本次循环
                        Continue For
                    End If

                    Dim Value As Object = dr(TmpName) '定义对象型的变量保存列的值
                    '如果非空,给对象属性赋值
                    If (Value.ToString <> DBNull.Value.ToString()) Then
                        pr.SetValue(MyT, Value, Nothing)  '通过反射,动态访问对象属性并赋值
                    End If
                End If
            Next
            MyList.Add(MyT)         '把获得的属性添加到集合中
        Next

        Return MyList               '返回集合
    End Function
    D层直接调用该方法即可
	
    Public Function SelectStudent(ByVal student As Entity.StudentEntity) As IList(Of Entity.StudentEntity) Implements ISelectStudent.SelectStudent
        Dim helper As New SqlHelper
        Dim dt As DataTable

        Dim sql As String = "select * from student_info where [email protected]"
        Dim stuInfo As List(Of Entity.StudentEntity)
<span style="white-space:pre">	</span>
        Dim para As SqlParameter() = {New SqlParameter("@studentno", student.StudentNo)}
<span style="white-space:pre">	</span>'调用SqlHelper方法
        dt = helper.ExecSelect(sql, para)
<span style="white-space:pre">	</span>'DataTable类型转换为泛型
        stuInfo = Entity.Genericity.ConvertList(Of Entity.StudentEntity)(dt)

        Return stuInfo
    End Function
     这样通过泛型的转换可以让B层和D层之间解耦,泛型定义的类型限制也可以在很大程度上保证数据的安
  全性。
 三、小结
     在使用泛型的时候一定要注意数据类型,实体中的数据类型与数据库的数据类型一定要保持一直
     在多用一些自己没用的技术,对自己很有帮助的。。
时间: 2024-12-25 16:02:40

DataTable与泛型的相关文章

机房收费系统重构——Datatable转泛型

刚开始在机房重构中用的最多的是Datatable,之前没有开始的时候就听大家一直在说泛型,很好奇这个东西,也很想知道明明用Datatable就可以,为什么非要转成泛型?它到底有什么好处呢?于是,便开始了研究-- Datatable是一个临时保存数据的网格,是一个虚拟表.我们在使用Datatable时,通过D层直接将数据库中的数据选出来,返回到B层和U层,在返回的时候我们要是想显示到窗体,就需要将U层的文本框与这个表中的字段一一对应.如果不小心就会写错,然后数据显示就不对.这样对数据库的耦合性太大

[工具类]DataTable与泛型集合List互转

写在前面 工作中经常遇到datatable与list,对于datatable而言操作起来不太方便.所以有的时候还是非常希望通过泛型集合来进行操作的.所以这里就封装了一个扩展类.也方便使用. 类 方法中主要使用了反射的方式动态的为属性赋值以及取值. public static class Extension { /// <summary> /// 将datatable转换为泛型集合 /// </summary> /// <typeparam name="TEntity

C#如何根据DataTable生成泛型List或者动态类型list

背景:在项目中,sql语句检索返回DataTable,然后根据检索结果做进一步的操作,本篇文章即是介绍如何将DataTable快速生成泛型List返回. 假设存在如下学生类: 1 public class student 2 { 3 public int ID { get; set; } 4 public string StuName { get; set; } 5 public string CityCode { get; set; } 6 } 存在如下数据表Student: 1.泛型List

重构小结——从传参到传实体,从datatable到泛型

在介绍这些内容之前,我们首先来了解什么是面向对象,面向对象的核心是什么? 一.面向对象的简单介绍 起初,"面向对象"是专指在程序设计中采用封装.继承.多态等设计方法.但,后来面向对象的思想设计到了各个方面.一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类.继承,帮助人们实现对现实世界的抽象与数字建模.通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析.设计与编程. 所以我们可以简单的将面向对象的核心概况为对象,也可以说是类. 二.实体的简

机房重构之DataTable转泛型

在重构的过程中看到好多人都用泛型,后来觉得自己也得试试用用泛型不然没有体验怎么会知道好不好用! 关于泛型这个概念其实在看<大话设计模式>这本书的时候书中的附录提到过,但是当时好像没怎么认真理解只是知道这个名词而已... 泛型是具有占位符(类型参数)的类.结构.接口的方法,这些占位符是类.结构.接口和方法所存储或使用的一个或多个类型的占位符.(摘自书中) 通过自己在重构过程的实践,感觉到泛型和DataTable相比的一些好处. 泛型它很好的维护了我们所涉及的七层结构,我们对于数据库的设计不必太清

vb.net环境下将DataTable转成泛型集合方法

背景 做机房收费系统的时候,遇到这样一个问题,将数据库表中的数据取出一行,将每个单元格中的内容填充到窗体 的文本框中.考虑到用DataReader获取结果的复杂性,我就用了泛型集合.可是这么一用却出现了如图所示的问 题. 问题一: 出现这种问题,是因为在DataTable转实体类型时表的字段类型和实体的字段类型不一致造成的. 这个也可以 这么说,中国人的孩子都随父姓,这是传统.但孩子随母姓,就有些不妥. 问题二: 数据库表中字段名和要转换的实体属性字段名不一致,导致转换后实体中depart为空值

DataGridview 绑定泛型List&lt;T&gt;

1.DataGridView数据绑定对比(DataTable与泛型List): 当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView. 当DataGridView的DataSource是泛型List,当List的数据改变时,则需要先将DataGridView的DataSource设置为new List<T>(),再将改变后的List<T>赋给Dat

[转]DataGridView绑定泛型List的种种

1.DataGridView数据绑定对比(DataTable与泛型List):当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView.当DataGridView的DataSource是泛型List,当List的数据改变时,则需要先将DataGridView的DataSource设置为new List<T>(),再将改变后的List<T>赋给DataG

ADO.NET

1.vb.net: vb.net自身并不具备对数据库进行操作的功能,它对数据库的处理通过.NET Framwork SDK中面向数据库编程的类库和微软的MDAC 来实现的,其中ADO.NET 是.NET Framwork SDK重要组成部分.它是.NET Framwork SDK中用以操作数控的类库的总称. 2.ado.net     1.命名空间:在使用前先引用 imports system.data imports system.sqlclient 2.ado.net的核心内容 Connec