ADO.NET学习笔记(二)

4、DataSet
   在ADO.NET中DataSet的作用是为数据源提供一个断开式的存储,而不必关心数据源,操作只用在DataSet中进行就行了。
   有三种方法可以创建DataSet:1、通过DataAdapter 2、通过XML 文件 3、用人工方法确定架构,然后逐行输入数据。
   主要介绍第一种方法。
   DataAdapter用于将DataSet连接到基本数据存储,本质上是一种元Command对象。
   它包括SelectCommand对象,InsertCommand对象,UpdateCommand对象,DeleteCommand对象。
   模板代码:
   Dim dataAdpater As New SqlDataAdapter("Select * From Student",conn)
   Dim dataSet As New DataSet()
   dataAdapter.Fill(dataSet)
   这时dataSet的表名默认为Table
   如果使用批处理查询并将得到的结果填入dataSet中则表名默认为Table,Table1,Table2……
  
   TableMappings:
   表名映射:
   生成dataAdapter之后再进行表名映射
   dataAdapter.TableMappings.Add("Table","Customer")
   dataAdapter.Fill(dataSet)
   这时Table的别名就变为Customer(对dataSet用Table或Customer操作都可以),dataSet.Tables("Customer")就可以引用到这个表
   或
   dataAdapter.TableMappings.Add("ADONET","Customer")
   dataAdapter.Fill(dataSet,"ADONET")
   列名映射:
   dataAdapter.TableMappings.Add("Table","Customer")
   dataAdapter.TableMappings("Customer").ColumnMappings.Add("CustomerID","ID)
   dataAdapter.FIll(dataSet,"Customer")
     在dataAdapter中添加表名映射后,相对有两个表,一个表是原先的表,另一个表是映射后的表,列名也经过相应的映射,因此在Fill时要   指定是哪个表,否则显示的时候就不会显示映射后的列名。另外在表名映射后,在数据绑定时只能指定dataMember为Student。
   例子(绑定到DataGrid)
        Dim conn As New SqlConnection("data source=localhost;initial catalog=StudentCourse;" & _
        "User ID=;Password=;")
        conn.Open()
        Dim dataAdapter As New SqlDataAdapter("Select * From Student", conn)
        conn.Close()
        Dim dataSet As New DataSet
        dataAdapter.TableMappings.Add("Table", "Student")
        dataAdapter.TableMappings.Add("Student", "Student") //这一步不能省,否则在下面的列名映射时会提示找不到映射名为Student表
        dataAdapter.TableMappings("Student").ColumnMappings.Add("Sno", "学号")
        dataAdapter.TableMappings("Student").ColumnMappings.Add("Sname", "姓名")
        dataAdapter.TableMappings("Student").ColumnMappings.Add("sex", "性别")
        dataAdapter.TableMappings("Student").ColumnMappings.Add("classID", "班级号")
        dataAdapter.TableMappings("Student").ColumnMappings.Add("age", "年龄")
        dataAdapter.TableMappings("Student").ColumnMappings.Add("address", "地址")
        dataAdapter.Fill(dataSet, "Student")
        DataGrid1.DataSource = dataSet
        DataGrid1.DataMember = "Student"
   另一种添加映射的方法是创建DataTableMapping对象并把它添加到DataAdapter中
        Dim conn As New SqlConnection("data source=localhost;initial catalog=StudentCourse;" & _
        "User ID=sa;Password=firerainbow;")
        conn.Open()
        Dim dataAdapter As New SqlDataAdapter("Select * From Student", conn)
        conn.Close()
        Dim dataSet As New DataSet
        Dim myMap As New DataTableMapping("Table", "Student")
        myMap.ColumnMappings.Add("Sno", "学号")
        myMap.ColumnMappings.Add("Sname", "姓名")
        myMap.ColumnMappings.Add("sex", "性别")
        myMap.ColumnMappings.Add("classID", "班级号")
        myMap.ColumnMappings.Add("age", "年龄")
        myMap.ColumnMappings.Add("address", "地址")
        dataAdapter.TableMappings.Add(myMap)
        dataAdapter.Fill(dataSet, "Table")
        DataGrid1.DataSource = dataSet
        DataGrid1.DataMember = "Student" 

   架构(Schema),通过FillSchema添加架构
   1、添加主键
      customerTable.PrimaryKey=New DataColumn[]{CustomerTable.Columns("CustomerID")} (通过数组的形式添加主键)

   2、添加关系
      dataSet.Relations.Add("Customers_Invoices",dataSet.Tables("Customers").Columns("CustomerID"),dataSet.Tables ("Invoinces").Columns("CustomerID"),true)

   3、添加约束
      有两种主要约束:唯一约束、外码约束(UniqueConstraint,ForeignKeyConstraint)
      其中唯一约束又分为DeleteRule(级联删除约束)、UpdateRule(级联更新约束)、AcceptRejectRule(调用AcceptChanges或 RejectChanges时的约束)

   4、添加触发器
      可以对6中DataSet事件添加触发器
      RowChanging,RowChanged,ColumnChanging,ColumnChanged,RowDeleting,RowDeleted

   5、列架构
      比如添加列的属性:customerTable.Columns("CustomerID").ReadOnly=true
      或添加AutoIncrement列:
 customerTable.Columns("CustomerID").AutoIncrement=true
 customerTable.Columns("CustomerID").AutoIncrementSeed=1  (列起始位置)
 customerTable.Columns("CustomerID").AutoIncrementStep=1  (列递增步长)
   可能有人会说这一切在DBMS里面做不就行了吗,干吗那么大费周折的在ADO.NET对Dataset再写一遍呢?
   这主要是出于对效率方面的考虑,如果客户端的错误输入能在客户端就被发现出来,而不用传到服务端进行验证的话就可以减少不必要的传输了。

   表达式列:
   Dim exColumn As New DataColumn("LineTotal")
   exColumn.DataType=typeof(float)
   exColumn.Expression="((price-(price*Discount))*Quantity)"
   dataSet.Tables("items").Columns.Add(excolumn)

你可能感兴趣的:(VB.NET)