定义:

使用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主要属性

  ADO.NET 之断开连接层

  ADO.NET 之断开连接层

 ADO.NET 之断开连接层

  ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

方法:

 ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

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

  ADO.NET 之断开连接层

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

 

使用DataColumn  

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

ADO.NET 之断开连接层

 

  ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

构建DataColumn

    ADO.NET 之断开连接层

 

启用自增列

 ADO.NET 之断开连接层

 

使用DataRow

    DataRow表示DataTable中的数据。

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

 ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

使用方法:

ADO.NET 之断开连接层

 

 DataSate属性

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

  ADO.NET 之断开连接层

  //创建一张表来做测试
            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();

ADO.NET 之断开连接层

 

 使用DataTable

 ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

 ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

 

获取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 + "\t");
                }
                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() + "\t");
                    }   
                }
            }

ADO.NET 之断开连接层

 

 

使用DataTableReader对象处理 DataTable

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

          DataTableReader dtReader = dt.CreateDataReader();
            while (dtReader.Read())
            {
                for (int i = 0; i < dtReader.FieldCount; i++)
                {
                    Console.WriteLine("{0}\t", 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文件。

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

 例如:

         //保存数据
            ds.WriteXml("Test.xml");
            ds.WriteXmlSchema("Demo.xsd");

            //清除数据
            ds.Clear();

            //读取数据
            ds.ReadXml("Test.xml");

XML格式:

ADO.NET 之断开连接层

XSD格式:

ADO.NET 之断开连接层

 

 

以二进制格式序列化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

      ADO.NET 之断开连接层

 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();
        }

 显示的数据:

ADO.NET 之断开连接层

 

 从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中更新行
  修改是在找到行的基础上进行的,我们把上面的代码改下

ADO.NET 之断开连接层

 

使用DataView类型

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

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 

 使用数据适配器

 ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

ADO.NET 之断开连接层

 一个简单的数据适配示例

            string cnStr = @"server=Sealee\sealee;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

   

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-22
猜你喜欢
  • 2021-10-24
  • 2022-12-23
  • 2022-02-16
  • 2022-12-23
  • 2021-10-21
  • 2021-11-09
  • 2021-04-19
相关资源
相似解决方案