`

ADO.NET数据访问技术

阅读更多

现在我们来学习两个虽然不属于数据驱动程序但很重要的类DataSetDataTable

 

1.DataSet

 

通过前面学习SqlDataAdapter,我们差不多已经了解了DataSet,它就是一个位于内存中的数据库,其内有许多内存中的表(DataTable),并且它们里面的数据可以通过SqlDataAdapter和数据库进行"双向沟通"。在前面我们也有描述怎么样通过更新DataSet来更新数据库,可实际上通过更新DataSet里的DataTable来实现的,所以关于这种更新数据库及更新xml文件的描述会更多的出现在下面讲DataTable的文章里。现在我们来描述ADO.NET2.0为DataSet增加的另一项功能----操作XML:

将DataSet中某个表写到XML文件里:

  SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=newsystem;Integrated Security=True");

            SqlDataAdapter da = new SqlDataAdapter("select * from comment", conn);

            DataSet ds = new DataSet();

            da.FillSchema(ds, SchemaType.Source, "com");

            da.Fill(ds, "com");

            string xmlpath = Server.MapPath("../xml");

            ds.WriteXml(xmlpath+"/"+"comment.xml");

将XML文件里的数据读到DataSet中的某个表里:

  DataSet ds = new DataSet();

            string xmlpath=Server.MapPath("../xml/XMLFile1.xml");

            ds.ReadXml(xmlpath);

            GridView1.DataSource = ds.Tables[0];  或ds.Tables["次节点名"];

            GridView1.DataBind();

可以看出ds的WriteXml()和ReadXml()这两个方法主要参数就是包括路径的文件名

另外需要强调的一点是xml文件中的节点与ds和dt名的关系:

根节点名---------------------ds名(默认为NewDataSet)

次节点名---------------------dt名(默认为Table)

次节点里面的节点名---------字段名

所以不是任何结构的xml文件都能被正确的读到ds里的某一个dt中。

另外关于对XML文档进行约束,有两种方法:DTD和XSD(xml架构文件或Shema模式文件)  关于XML DTD XSD

ds与xsd有关的方法是ds.WriteXmlSchema()和ds.ReadXmlSchema()。


http://www.cnblogs.com/xugang/archive/2010/09/16/1827988.html
http://book.51cto.com/art/200806/76138.htm

2.DataTable

dt除了可以通过da.Fill()填充到ds里的dt以外,还可以将new出来的dt添加到ds里:DataTable dt=new DataTable("dt名"); DataSet ds=new DataSet(); ds.Tables.Add(dt); 由于ds里可以有很多dt,所以在将通过构造函数创建的dt添加到ds中时,要注意每一个dt名要不一样,以便区别。要删除的话ds.Tables.Remove("dt名")。如果在添加前dt.Load(reader)过了,这个dt是可以用的,否则这个dt是没有架构的(没有列及列类型),我们需要给其添加列:
 DataTable dt = new DataTable("newtable");
            DataColumn datacolumn1 = new DataColumn("编号", typeof(Int32));
            datacolumn1.Unique = true;                 是否唯一
            datacolumn1.AllowDBNull = false;          是否为空
            datacolumn1.AutoIncrement = true;     是否自动递增
            datacolumn1.AutoIncrementSeed = 0;  初始值
            datacolumn1.AutoIncrementStep = 1;   步长
            DataColumn datacolumn2 = new DataColumn("姓名", typeof(String));
            DataColumn datacolumn3 = new DataColumn("成绩", typeof(Int32));
            dt.Columns.Add(datacolumn1);
            dt.Columns.Add(datacolumn2);
            dt.Columns.Add(datacolumn3);
添加完了列,这个表还是个空表,我们再来添加行:
    DataRow datarow1 = dt.NewRow();
            datarow1["姓名"] = "李瀚林";
            datarow1["成绩"] = 80;
            DataRow datarow2 = dt.NewRow();
            datarow2["姓名"] = "王兴伦";
            datarow2["成绩"] = 90;
            DataRow datarow3 = dt.NewRow();
            datarow3["姓名"] = "何为云";
            datarow3["成绩"] = 100;
            dt.Rows.Add(datarow1);
            dt.Rows.Add(datarow2);
            dt.Rows.Add(datarow3);
这样我们就构建完了一个可用的dt了,现在我们来学习怎么样来修改行:
 DataRow[] datarows = dt.Select("成绩=100");   ADO.NET2.0为dt提供了Select()方法,类似于SQL里的Select * from 表 where 条件,将符合条件的行添加到一个数组中。过滤条件为方法的参数:Select("列名=值")
            foreach (var datarow in datarows)  
            {
                datarow["姓名"] = "何云伟";   遍历所有数组元素,然后更新想要更新的列
            }
然后我们来学习怎么来删除行,删除行有两种方法 1是dt.Rows.Remove() 2是dt.Rows[i].Delete :
第一种方法,本人觉得没什么用,因为它只是删除内存中dt的一行,无法更新到数据库
  SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=newsystem;Integrated Security=True");
            SqlDataAdapter da = new SqlDataAdapter("select * from comment", conn);
            SqlCommandBuilder cmdb = new SqlCommandBuilder(da);
            DataSet ds = new DataSet("myds");
            da.FillSchema(ds, SchemaType.Source, "comment");
            da.Fill(ds, "comment");
            DataRow[] datarows=ds.Tables["comment"].Select("id=66");
  foreach (var datarow in datarows)
            {
                ds.Tables["comment"].Rows.Remove(datarow);
            }
            da.Update(ds.Tables["comment"]);
            ds.Tables["comment"].AcceptChanges();
虽然内存中dt已经删除了这些行,但这时到数据库里去看,是没有删除这些行的,而如果我们用第二种方法:
 foreach (var datarow in datarows)
            {
                datarow.Delete();
            }
            da.Update(ds.Tables["comment"]);
   ds.Tables["comment"].AcceptChanges();   AcceptChanges()方法前面有讲,与其相反的是RejectChanges()
这里会涉及到行状态(行的属性RowState,属性值可取为枚举的DataRowState(Added,Deleted,Detached,Modified,Unchanged),查看详情)
我们在讲GridView时也有提到过GridView里的状态行

new出来的datatable操作xml,需要有架构(有列及列类型等)才能操作xml
SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=newsystem;Integrated Security=True");
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from comment", conn);
            SqlDataReader reader = cmd.ExecuteReader();
            DataTable dt = new DataTable("comment");
            DataSet ds = new DataSet("newsystem");
            dt.Load(reader);    有了架构
            reader.Close();
            ds.Tables.Add(dt);     也可以将其填充到dataset
现在就可以操作xml了,先将其内容写到xml文件
            string xmlpath = Server.MapPath("../xml");
            ds.WriteXml(xmlpath + @"\mycomment.xml");
            conn.Close();
如果要更新xml文件中的内容,可以将其读出,更新后(更新过程与上面讲的一样)再写回去
 ds.ReadXml(xmlpath + @"\mycomment.xml");    先读出
然后进行各种更新
 DataColumn datacolumn = new DataColumn("添加的列", typeof(String));    添加一列,在xml中就是添加了一个次次节点,注意每个列名都要不一样
            datacolumn.DefaultValue = "我是列的默认值";                              如果添加行时该列无值,xml里将不会添加此次次节点,所以可以指定该列默认值
            ds.Tables["comment"].Columns.Add(datacolumn);                       ds.Tables["comment"]里的comment表名就是xml里的次节点名
            DataRow datarow = ds.Tables["comment"].NewRow();                添加一行
            datarow["id"] = 99;                                                                 xml只显示有值的节点,如果某个节点无值,则不会显示该节点
            datarow["content"] = "我又是新添的一行";
            datarow["createtime"] = "2010-09-10T19:55:35+08:00";
            datarow["userip"] = "192.168.2.34";
            datarow["newsid"] = 29;
            datarow["添加的列"] = "*******";
            ds.Tables["comment"].Rows.Add(datarow);
 DataRow[] datarows1 = ds.Tables["comment"].Select("添加的列='*******'");     修改某些行
            foreach (var datarow1 in datarows1)
            {
                datarow1["添加的列"] = "+++++++";
            }
            DataRow[] datarows2 = ds.Tables["comment"].Select("id=68 and content='哈哈'");     删除某些行
            foreach (var datarow2 in datarows2)
            {
                datarow2.Delete();
            }
    ds.WriteXml(xmlpath + @"\mycomment.xml");    最后别忘了再写回xml文件
  GridView1.DataSource = ds.Tables["comment"];
  GridView1.DataBind();

调用 ReadXml 来加载非常大的文件,则性能可能会下降。为确保最佳的 ReadXml 性能,对于大文件,请为 DataSet 中的每个表调用 BeginLoadData 方法,然后调用 ReadXml。最后,为 DataSet 中的每个表调用 EndLoadData:
  DataSet ds = new DataSet("newsystem");
            ds.ReadXml(xmlpath + @"\mycomment");
            ds.Tables["comment"].EndLoadData();
   GridView1.DataSource = ds.Tables["comment"];
            GridView1.DataBind();
感觉使用DataSet只能操作比较规范的xml,对于那些不规范的xml文件的操作,我们LINQ to XML见吧!
http://www.cnblogs.com/longshengqun/archive/2008/05/13/1195253.html

在datatable中进行数据记录的统计①(老翁)  
主要用到dt的Compute("函数表达式等","过滤行表达式")方法
SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=newsystem;Integrated Security=True");
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from comment", conn);
            SqlDataReader reader = cmd.ExecuteReader();
            DataTable dt = new DataTable("comment");
            dt.Load(reader);
            reader.Close();
            DataRow datarow = dt.NewRow();
            datarow["id"] =dt.Compute("Count(id)", "");
            datarow["newsid"] =dt.Compute("Sum(newsid)", "").ToString();
            datarow["content"] = "newsid的平均值:" + dt.Compute("Avg(newsid)", "newsid<32");
            datarow["createtime"] ="2010-09-10";
            datarow["userip"] = "192.168.2.43";
            dt.Rows.Add(datarow);
            conn.Close();
GridView1.DataSource = dt;
            GridView1.DataBind();

合并两个架构相同(相同的列及列类型)的dt
将dt2接在dt1后面
dt1.Merge(dt2);
GridView1.DataSource = dt1;
            GridView1.DataBind();

对datatable中的数据进行排序要用到dataview(相当于数据库中的表的视图,就是datatable的视图)
  DataView dv = dt.DefaultView;      获取dt表的自定义dv视图
            dv.Sort = "id Desc,newsid Asc";   Sort属性 先id降序再newsid升序 多个列之间用逗号分开
            dt = dv.ToTable();            将dv视图中的现有结构返回到一个dt表中
    GridView1.DataSource = dt;
            GridView1.DataBind();

关于dt差不多就这些了,还有其他应用如将其导出到Excel里,这些就不说了。
分享到:
评论

相关推荐

    ADO.NET数据访问技术的PPT

    不管是Windows桌面应用程序,还是Web应用程序,存储和检索数据都是ADO.NET的核心功能。此PPT讲述ADO.NET的概念、概念和用法

    第13章 ADO.NET数据访问技术

    连接类型,即ADO.NET数据提供者,包括Connection、Transaction、DataAdapter和Command对象,它们直接与数据库交互。断开类型主要涉及DataSet和DataRow,它们可以在内存中独立于数据库进行数据操作。 13.1.2 ADO.NET...

    ADO.NET数据访问技术习题参考答案

    本资源“ADO.NET数据访问技术习题参考答案”是针对学习ADO.NET技术的学生或开发者的重要参考资料,包含了丰富的练习题及解答,有助于加深对ADO.NET的理解和应用。 在ADO.NET中,主要有四个关键组件: 1. **DataSet...

    ADO.net数据访问技术系列(王然)

    本系列教程由专家王然讲解,涵盖了ADO.NET数据访问技术的基础到高级应用,包括连接池的使用、不同连接方式、连接字符串的安全管理以及课程的总体概览。 首先,我们来看“01 ADO.NET数据访问技术系列课程概览”。这...

    ADO.NET数据访问技术课后参考答案

    本课程的“ADO.NET数据访问技术”着重讲解了如何使用这些类来连接、查询、操作和更新数据库。龚根华、王炜立主编的教材,结合清华大学出版社的严谨风格,为学习者提供了深入浅出的理论讲解和实践指导。 1. **ADO...

    宿舍管理系统,各种控件的使用及ADO.net数据访问技术的融合

    【标题】:“宿舍管理系统,各种控件的使用及ADO.net数据访问技术的融合” 这个管理系统主要关注于在校园环境中对学生宿舍的高效管理。系统利用了多种控件来提供直观、友好的用户界面,使得管理员能够轻松地进行...

    ADO.NET数据访问技术 课后答案

    ADO.NET数据访问技术 作者:龚根华、王炜立 图书详细信息: ISBN:9787302275084 定价:29元 印次:1-1 装帧:平装 印刷日期:2012-3-23 图书简介: 本书是一本专门介绍ADO.NET基本功能和新特性的技术参考书。...

    数据访问技术系列课程(1):ADO.NET数据访问技术系列课程概览

    本课程"数据访问技术系列课程(1):ADO.NET数据访问技术系列课程概览"旨在深入浅出地介绍ADO.NET的基础知识和核心概念,为后续的数据库操作打下坚实基础。 在.NET框架中,ADO.NET是连接应用程序与各种数据库(如SQL ...

    Oracle-12c数据库基础教程-Oracle-12c数据库ADO.NET数据访问技术完整.pptx

    Oracle 12c 数据库基础教程 - ADO.NET 数据访问技术完整教程 本教程主要介绍 Oracle 12c 数据库基础知识和 ADO.NET 数据访问技术的完整实现。 知识点 1: ADO.NET 结构与命名空间 ADO.NET 是一种流行的数据库访问...

    第9章 ADO.NET数据访问技术.ppt

    第9章 ADO.NET数据访问技术.ppt

    ADO.NET数据库访问技术试题

    ADO.NET是一种用于访问数据库的技术,它是.NET框架的一部分,主要用于构建高性能、可靠且灵活的数据访问应用程序。下面将详细解释这些试题中涉及的知识点。 1. ADO.NET模型中的Connected对象包括Connection(连接)...

    C#笔记三[ADO.NET数据访问技术]

    ADO.NET 数据访问技术笔记 本笔记主要记录了 ADO.NET 数据访问技术的相关知识点,包括 ADO.NET 的概念、主要组件、连接数据库的准备工作、Connection 对象、Command 对象、数据操作常见错误总结等。 一、ADO.NET ...

    ADO.net大数据量操作数据库实验

    本实验“ADO.NET大数据量操作数据库实验”聚焦于如何高效地在SQL Server中存储和处理大量数据。实验环境基于Visual Studio 2015(VS2015)和SQL Server 2008,采用多种方法来演示批量数据插入,包括常规方法、Bulk ...

    ADO.NET数据访问技术课后习题参考答案

    此课后习题参考答案涵盖了ADO.NET数据访问的关键概念和技术,帮助学习者深入理解和掌握该技术。 1. **连接管理**: ADO.NET通过`SqlConnection`(对于SQL Server)或其他特定于数据提供商的类(如Oracle的`Oracle...

    ADO.NET数据库访问技术案例教程

    ADO.NET是微软.NET框架下的一种数据访问技术,用于与各种关系型数据库进行交互。它提供了一组组件和服务,使得开发者可以高效、灵活地存取和处理数据。在本"ADO.NET数据库访问技术案例教程"中,我们将深入探讨ADO...

    ADO.NET数据库访问技术

    通过使用 ADO.NET 数据库访问技术,可以实现登录界面的数据库操作,例如用户验证、数据存储等。 在设计考试系统登录界面时,需要使用 Windows 窗体应用程序、设置窗体 Form 的相关属性、设计登录界面所需的控件,并...

    Internet 上的ADO.NET数据访问技术

    在Internet上的ADO.NET数据访问中,主要涉及以下几个关键知识点: 1. **Connection对象**:这是ADO.NET与数据源建立连接的核心对象。通过SqlConnection(对于SQL Server)或其他特定于数据库的连接类,开发者可以...

Global site tag (gtag.js) - Google Analytics