通过前面学习SqlDataAdapter,我们差不多已经了解了DataSet,它就是一个位于内存中的数据库,其内有许多内存中的表(DataTable),并且它们里面的数据可以通过SqlDataAdapter和数据库进行"双向沟通"。在前面我们也有描述怎么样通过更新DataSet来更新数据库,可实际上通过更新DataSet里的DataTable来实现的,所以关于这种更新数据库及更新xml文件的描述会更多的出现在下面讲DataTable的文章里。现在我们来描述ADO.NET2.0为DataSet增加的另一项功能----操作XML:
SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=newsystem;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter("select * from comment", conn);
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),查看详情
①和
②)
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
主要用到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里,这些就不说了。
相关推荐
不管是Windows桌面应用程序,还是Web应用程序,存储和检索数据都是ADO.NET的核心功能。此PPT讲述ADO.NET的概念、概念和用法
连接类型,即ADO.NET数据提供者,包括Connection、Transaction、DataAdapter和Command对象,它们直接与数据库交互。断开类型主要涉及DataSet和DataRow,它们可以在内存中独立于数据库进行数据操作。 13.1.2 ADO.NET...
本资源“ADO.NET数据访问技术习题参考答案”是针对学习ADO.NET技术的学生或开发者的重要参考资料,包含了丰富的练习题及解答,有助于加深对ADO.NET的理解和应用。 在ADO.NET中,主要有四个关键组件: 1. **DataSet...
本系列教程由专家王然讲解,涵盖了ADO.NET数据访问技术的基础到高级应用,包括连接池的使用、不同连接方式、连接字符串的安全管理以及课程的总体概览。 首先,我们来看“01 ADO.NET数据访问技术系列课程概览”。这...
本课程的“ADO.NET数据访问技术”着重讲解了如何使用这些类来连接、查询、操作和更新数据库。龚根华、王炜立主编的教材,结合清华大学出版社的严谨风格,为学习者提供了深入浅出的理论讲解和实践指导。 1. **ADO...
【标题】:“宿舍管理系统,各种控件的使用及ADO.net数据访问技术的融合” 这个管理系统主要关注于在校园环境中对学生宿舍的高效管理。系统利用了多种控件来提供直观、友好的用户界面,使得管理员能够轻松地进行...
ADO.NET数据访问技术 作者:龚根华、王炜立 图书详细信息: ISBN:9787302275084 定价:29元 印次:1-1 装帧:平装 印刷日期:2012-3-23 图书简介: 本书是一本专门介绍ADO.NET基本功能和新特性的技术参考书。...
本课程"数据访问技术系列课程(1):ADO.NET数据访问技术系列课程概览"旨在深入浅出地介绍ADO.NET的基础知识和核心概念,为后续的数据库操作打下坚实基础。 在.NET框架中,ADO.NET是连接应用程序与各种数据库(如SQL ...
Oracle 12c 数据库基础教程 - ADO.NET 数据访问技术完整教程 本教程主要介绍 Oracle 12c 数据库基础知识和 ADO.NET 数据访问技术的完整实现。 知识点 1: ADO.NET 结构与命名空间 ADO.NET 是一种流行的数据库访问...
第9章 ADO.NET数据访问技术.ppt
ADO.NET是一种用于访问数据库的技术,它是.NET框架的一部分,主要用于构建高性能、可靠且灵活的数据访问应用程序。下面将详细解释这些试题中涉及的知识点。 1. ADO.NET模型中的Connected对象包括Connection(连接)...
ADO.NET 数据访问技术笔记 本笔记主要记录了 ADO.NET 数据访问技术的相关知识点,包括 ADO.NET 的概念、主要组件、连接数据库的准备工作、Connection 对象、Command 对象、数据操作常见错误总结等。 一、ADO.NET ...
本实验“ADO.NET大数据量操作数据库实验”聚焦于如何高效地在SQL Server中存储和处理大量数据。实验环境基于Visual Studio 2015(VS2015)和SQL Server 2008,采用多种方法来演示批量数据插入,包括常规方法、Bulk ...
此课后习题参考答案涵盖了ADO.NET数据访问的关键概念和技术,帮助学习者深入理解和掌握该技术。 1. **连接管理**: ADO.NET通过`SqlConnection`(对于SQL Server)或其他特定于数据提供商的类(如Oracle的`Oracle...
ADO.NET是微软.NET框架下的一种数据访问技术,用于与各种关系型数据库进行交互。它提供了一组组件和服务,使得开发者可以高效、灵活地存取和处理数据。在本"ADO.NET数据库访问技术案例教程"中,我们将深入探讨ADO...
通过使用 ADO.NET 数据库访问技术,可以实现登录界面的数据库操作,例如用户验证、数据存储等。 在设计考试系统登录界面时,需要使用 Windows 窗体应用程序、设置窗体 Form 的相关属性、设计登录界面所需的控件,并...
在Internet上的ADO.NET数据访问中,主要涉及以下几个关键知识点: 1. **Connection对象**:这是ADO.NET与数据源建立连接的核心对象。通过SqlConnection(对于SQL Server)或其他特定于数据库的连接类,开发者可以...