• ADO.NET 之断开连接层


    定义:

    使用ADO.NET断开连接层,就会使用System.Data命名空间的许多成员(主要是DataTable、DataTable、DataRow、DataColumn、DataView和DataRelation)在调用层建模内存中的数据库数据。

    当使用ADO.NET断开式访问方式的时候,不需要连接到数据库,但任然会使用拦截和命令对象。我们还会补充一个叫做数据适配器的特殊对象(扩展自DbDataAdapter抽象类)来获取和更新数据。

     DataSet的作用

        DataSet类型内部包含了3个强类型的集合。 DataTableCollection,DataRelationCollection,PropertyCollection.

     DataSet的Table属性允许访问包含独立DataTable的DataTableCollection.而DataRelationCollection可以通过编程来表示各表之间的父子关系。(后面胡仔细介绍的)

    ExtendedProperties属性提供了PropertyCollection对象的访问,通过它能把额外的名称/值信息关联到DataSet.

                                                                DataSet主要属性

      

      

     

      

    方法:

     

    构建DataSet ,一般我们的DataSet都是用来保存获取到的是数据,后面会就介绍到

      

     只有在DataSet中插入几个DataTable时,DataSet对象才会有意思。我们先从DataColumn结构开始。

    使用DataColumn  

        DataColumn类型表示DataTable中的一个单列,是DataTable中的结构。

      

    构建DataColumn

        

    启用自增列

     

    使用DataRow

        DataRow表示DataTable中的数据。

     

    使用方法:

     DataSate属性

      当需要以编程方式指定表中的一组行被修改、新增等的时候。就会使用这个属性。是个枚举。

      

      //创建一张表来做测试
                DataTable temp = new DataTable("Temp");
                temp.Columns.Add(new DataColumn("TempColumn", typeof(int)));
    
                DataRow row = temp.NewRow();
                Console.WriteLine("添加行之前:{0}",row.RowState);
    
                temp.Rows.Add(row);
                Console.WriteLine("添加行:{0}", row.RowState);
    
                row["TempColumn"] = 11;
                Console.WriteLine("赋值:{0}",row.RowState);
    
                temp.AcceptChanges();
                Console.WriteLine("提交更改:{0}",row.RowState);
    
                row["TempColumn"] = 10;
                Console.WriteLine("修改:{0}", row.RowState);
    
                temp.Rows[0].Delete();
    
                Console.WriteLine("删除:{0}", row.RowState);
    
                Console.ReadLine();

     使用DataTable

     

     

     

    获取DataSet中的数据

     一个完整的创建,填充,获取过程

     DataTable dt = new DataTable();
                DataColumn one = new DataColumn("One", Type.GetType("System.Int32"));
                DataColumn two = new DataColumn("Two", Type.GetType("System.String"));
                dt.Columns.AddRange(new DataColumn[] { one, two });
    
                DataRow rowOne = dt.NewRow();
                rowOne[0] = 1;
                rowOne[1] = "测试数据2";
    
                DataRow rowTwo = dt.NewRow();
                rowOne["One"] = 2;
                rowOne["Two"] = "好啊";
    
                dt.Rows.Add(rowOne);
                dt.Rows.Add(rowTwo);
                DataSet ds = new DataSet("数据名称");
                ds.Tables.Add(dt); //把表添加到DataSet中
    
                ds.ExtendedProperties["TiemSpan"] = DateTime.Now;
                ds.ExtendedProperties["haha"] = "Hello";
                Console.WriteLine("Set名称:{0}", ds.DataSetName);
    
                foreach (DataTable dt1 in ds.Tables)
                {
                    foreach (System.Collections.DictionaryEntry item in ds.ExtendedProperties)
                    {
                        Console.WriteLine("Key={0}, Value={1}", item.Key, item.Value);
                    }
                    Console.WriteLine();
                    for (int i = 0; i < dt1.Columns.Count; i++)
                    {
                        Console.Write(dt1.Columns[i].ColumnName + "	");
                    }
                    Console.WriteLine();
                    for (int i = 0; i < dt1.Rows.Count; i++)
                    {
                        for (int j = 0; j < dt1.Columns.Count; j++)
                        {
                            Console.Write(dt1.Rows[i][j].ToString() + "	");
                        }   
                    }
                }

    使用DataTableReader对象处理 DataTable

        DataTable支持一个叫做CreateDataReader()的方法,这个方法允许使用像数据读取器一样的方式(数据读取器会从内存DataTable而不是实际的数据库中读取数据,因此这里不涉及数据库连接)来获取DataTable内的数据。

              DataTableReader dtReader = dt.CreateDataReader();
                while (dtReader.Read())
                {
                    for (int i = 0; i < dtReader.FieldCount; i++)
                    {
                        Console.WriteLine("{0}	", dtReader.GetValue(i).ToString().Trim());
                    }
                    Console.WriteLine();
                }
                dtReader.Close();

    序列化 DataTable/DataSet对象为XML

      DataSet()和DataTable()都支持WriteXml()ReadXml()方法。WiterXml()允许把它们的内容持久化成XML文档形式的本地文件(包括所有从System.IO.Stram继承的类型)。ReadXml()允许从XML文档加载数据到DataSet(或者DataTable).另外,DataSet和DataTable都支持WriteXmlSchema()ReadXmlSchema()来保存和加载一个*.xsd文件。

     例如:

             //保存数据
                ds.WriteXml("Test.xml");
                ds.WriteXmlSchema("Demo.xsd");
    
                //清除数据
                ds.Clear();
    
                //读取数据
                ds.ReadXml("Test.xml");

    XML格式:

    XSD格式:

     

    以二进制格式序列化DataTable/DataSet对象

       还可以把DataSet(或单个DataTable)的内容以紧凑二进制格式进行持久化。如果DataSet对象需要跨越机器边界传递的话,这就特别有用。XML数据表现的一个劣势就是其强描述性可能会导致大量的负担。

      我们只用设置 RemotingFormat属性为SerializationFormat.Binary.

        //设置二进制序列化标记   Stsrem.Data
                ds.RemotingFormat = SerializationFormat.Binary;
                //以二进制格式保存DataSet
                FileStream fs = new FileStream("Binary.bin", FileMode.Create);
                //using System.Runtime.Serialization.Formatters.Binary;
                BinaryFormatter bFormat = new BinaryFormatter();
                bFormat.Serialize(fs, ds);
                fs.Close();
                ds.Clear();
                //从二进制文件加载DataSset
                fs = new FileStream("Binary.bin", FileMode.Open);
                DataSet ds1 = (DataSet)bFormat.Deserialize(fs);

    有关BinaryFormatter的操作,请查看 System.IO 二

    从泛型List<T>合成DataTable

          

     protected override void OnInit(EventArgs e)
            {
                //list集合
                List<Car> listCar = new List<Car>()
                {
                    new Car{ID=100, PetName="Chucky",Make="BMW",Color="Green"},
                    new Car{ID=101, PetName="Tiny",Make="Yugo",Color="white"}, 
                    new Car{ID=102, PetName="Ami",Make="Jeep",Color="Tan"}, 
                    new Car{ID=103, PetName="Pain",Make="Caravan",Color="Pink"}, 
                    new Car{ID=104, PetName="Fred",Make="BMW",Color="Green"}, 
                    new Car{ID=105, PetName="Sidd",Make="BMW",Color="Black"}, 
                    new Car{ID=106, PetName="Mel",Make="Firebird",Color="Red"}, 
                    new Car{ID=107, PetName="Sarah",Make="Colt",Color="Black"}
                };
                DataTable dt = new DataTable();
                //创建表结构
                DataColumn IDColumn = new DataColumn("ID",typeof(int));
                DataColumn PetNameColumn = new DataColumn("PetName",Type.GetType("System.String"));
                DataColumn MakeColumn = new DataColumn("Make",Type.GetType("System.String"));
                DataColumn ColorColumn = new DataColumn("Color",Type.GetType("System.String"));
                dt.Columns.AddRange(new DataColumn[] { IDColumn, PetNameColumn, MakeColumn, ColorColumn });
                //添加行
                foreach (Car item in listCar)
                {
                    DataRow newRow = dt.NewRow();
                    newRow["ID"] = item.ID;
                    newRow[1] = item.PetName;
                    newRow["Make"] = item.Make;
                    newRow["Color"] = item.Color;
                    dt.Rows.Add(newRow);
                }
                //绑定数据
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }

     显示的数据:

     从DataTable中删除行
     //项目需要在4.5以上 异步才能使用,并且在页面上设置Async="true"
            protected async void  Button1_Click(object sender, EventArgs e)
            {
                await Task.Run(() =>
                {
                    try
                    {
                        string id = TextBox1.Text;
                        //查找需要删除的行
                        DataRow[] rowDelete = dt.Select(string.Format("ID={0}",int.Parse(id)));
                        rowDelete[0].Delete(); //删除
                        dt.AcceptChanges();//提交更改
                        //重新绑定
                        GridView1.DataSource = dt;
                        GridView1.DataBind();
                    }
                    catch (Exception)
                    {
                        
                        throw;
                    }
                });
            }

    根据筛选条件选择行

      //项目需要在4.5以上 异步才能使用,并且在页面上设置Async="true"
            protected async void Button2_Click(object sender, EventArgs e)
            {
                await Task.Run(() =>
                {
                    try
                    {
                        string name = TextBox2.Text;
                        //过滤条件
                        //Select 第一个参数:条件,第二个参数:排序
                        DataRow[] makes = dt.Select(string.Format("Make='{0}'",name));
                        if (makes.Count()==0)
                        {
                            Page.ClientScript.RegisterStartupScript(Page.ClientScript.GetType(), "myScript", "<script>alert('没有找到合适的内容');</script>");
                        }
                        else
                        {
                            string strMake = "";
                            for (int i = 0; i < makes.Length; i++)
                            {
                                strMake += makes[i]["PetName"] + ",";
                            }
                            Page.ClientScript.RegisterStartupScript(Page.ClientScript.GetType(), "myScript", "<script>alert('"+strMake+"');</script>");
                        }                  
                    }
                    catch (Exception)
                    {
    
                        throw;
                    }
                });
            }

    在DataTable中更新行
      修改是在找到行的基础上进行的,我们把上面的代码改下

    使用DataView类型

       视图对象是一个表(或一组表)自定义的表现形式。

     使用数据适配器

     

     一个简单的数据适配示例

                string cnStr = @"server=Sealeesealee;uid=sa;pwd=a123;database=NewsDB;";//连接数据库
                SqlDataAdapter dAdapt = new SqlDataAdapter("select * from News", cnStr); //查询数据
                DataSet ds=new DataSet();
                dAdapt.Fill(ds,"News");//填充DataSet
    

      

    还可以使用强类型来操作DataSet,这里就不演示了。

    LinQ to DataSet

       详解:LinQ To DataSet

       

  • 相关阅读:
    编码标准之结构
    Python学习入门基础教程(learning Python)--6.3 Python的list切片高级
    dddd
    QT 多线程程序设计(也有不少例子)
    Qt多线程(有详细例子)
    mormort 土拨鼠,做后端服务那是杠杠的,基于http.sys
    每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行
    ASP.NET MVC的路由
    asp.net通用查询模块设计
    自定义Windows性能监视器
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/7512578.html
Copyright © 2020-2023  润新知