针灸的原理是什么| 筵是什么意思| 咖啡配什么好喝| hcg是什么激素| 门客是什么意思| 办理慢性病需要什么手续| 小清新是什么意思啊| 慢性病卡有什么用| 笑面虎比喻什么样的人| 出虚汗是什么原因引起的| 为什么我不快乐| 100mg是什么意思| 立冬吃什么| upup是什么意思| 西瓜跟什么不能一起吃| 整形什么医院好| 盆腔积液是什么原因造成的| 女生的隐私部位长什么样| 炼蜜是什么| 姐字五行属什么| zoom是什么| 站桩对身体有什么好处和功效| 咳黄痰是什么原因| 鳞状上皮内高度病变什么意思| 看输卵管是否堵塞做什么检查| 吃狗肉不能和什么一起吃| 宫颈欠光滑是什么意思| 为什么会得近视眼| 内痔疮用什么药治最好效果最快| 女人做春梦预示着什么| 后脑两侧痛是什么原因| 911是什么| alpaca是什么意思| 黄山四绝是什么| 渗透率是什么意思| 313什么意思| 为什么大便是绿色的| 早搏吃什么药| 以前没有狐臭为什么突然就有了| 高锰酸钾是什么颜色| 路亚什么意思| 高血压是什么症状| 大荔冬枣什么时候成熟| 处女座前面是什么星座| 四大洋分别是什么| 伏脉常见于什么病| 省亲是什么意思| 柴鸡是什么鸡| 邮政ems是什么意思| 护士资格证有什么用| 2022什么年| 什么是多囊卵巢综合症| 什么药化痰效果最好| 什么空调省电| 来月经可以吃什么| 心虚吃什么补最快| 胃总疼是什么原因| 牛骨头炖什么好吃| 中药天龙又叫什么| 530是什么意思| 非那雄胺片是什么药| 有胆结石的人不能吃什么东西| 厚实是什么意思| 大三阳是什么| 荨麻疹是什么引起| 大腿后侧疼痛什么原因| 荔枝对身体有什么好处| 打嗝是什么毛病| 旌旗是什么意思| 一饿就胃疼是什么原因| 九月初三是什么星座| 小鸟喜欢吃什么食物| 冰箱买什么牌子好| 睡觉吹气是什么原因| 肠道痉挛吃什么药| 心识是什么意思| 吃什么能| 造口是什么意思| 武松是什么生肖| 比利时用什么货币| 孕酮低吃什么可以补| hbv是什么意思| 脂浊是什么意思| 什么一笑| foreverlove是什么意思| 心悸是什么意思啊| 三唑仑是什么药| 淋巴细胞偏高是什么意思| 夫妻都是b型血孩子是什么血型| 香港的别称是什么| 什么是红颜知己| 大姨妈黑色是什么原因| 尿胆红素高是什么原因| 主动脉硬化吃什么药好| 腹股沟黑是什么原因| 玲珑是什么意思| 淋巴结肿大是什么原因引起的| 什么人适合学玄学| ogtt是什么意思| 糖尿病是什么原因造成的| 法警是什么编制| 皮肤炎症用什么药| 垂体瘤挂什么科| 失聪是什么原因造成的| 呆若木鸡的意思是什么| 岳飞属什么生肖| 一个虫一个夫念什么| 水油是什么| 什么时候有雨| 后会有期什么意思| 什么是包皮过长图片| 榆字五行属什么| 牛肉粉是什么调料| p是什么意思| 紫色心情是什么意思| 八卦是什么生肖| 乳头瘤有什么症状| 百无一用是什么意思| 白子是什么东西| 眼球出血是什么原因引起的| 五彩缤纷是什么意思| 为什么睡不着觉会胡思乱想| 骨盐量偏低是什么意思| 对酒当歌是什么生肖| 孩子发烧肚子疼是什么原因| 例行检查是什么意思| 睾丸潮湿是什么原因| tct和hpv有什么区别| 宫颈息肉是什么原因引起的| 梦见别人吐血是什么预兆| 冥币是什么意思| 黑胡桃色是什么颜色| 口是心非是什么生肖| 市斤是什么意思| 右边肋骨下面是什么器官| 朵的第二笔是什么| 手上螺纹多少代表什么| 1978年出生是什么命| 肺纤维化是什么病| 尿蛋白高有什么危害| 壬子五行属什么| 过命之交是什么意思| 糖尿病人早餐吃什么最好| 什么照镜子里外不是人| 凶猛的动物是什么生肖| 什么是大麦| 骨折什么症状| 什么病不能吃茄子| 男人腰痛吃什么药| 101什么意思| 老赖什么意思| 什么叫细胞| 喉咙痛吃什么药好得快| 白猫是什么品种| 三高挂号挂什么科| 入心是什么意思| 酉是什么字| 打牙祭是什么意思| 骨质增生挂什么科| 抗核抗体阳性对怀孕有什么影响| 贫血不能吃什么| 慈是什么意思| 肛瘘是什么原因引起的| 属马本命佛是什么佛| 什么样的羽毛| 什么是心脏病| 什么盛开| 稍纵即逝什么意思| 津液是什么| 奶油小生什么意思| 运钞车押运员是什么人| 啤酒喝了有什么好处| 人头什么动| 经期量少吃什么来排血| 游离脂肪酸是什么| 大便里急后重什么意思| 脑筋急转弯什么东西越洗越脏| 什么是鸡胸| 什么牌子的氨糖最好| 补体c4偏低是什么意思| 八月初三是什么星座| 胃泌素17是什么检查| 什么是制片人| 排骨和什么一起炖好吃| 结婚40年是什么婚| 心慌胸闷是什么原因| 冬瓜什么季节吃最好| tf是什么| 误会是什么意思| 舌头裂开是什么原因| 腹腔气体多是什么原因| 女人更年期什么症状| 大便干燥一粒一粒的是什么原因| 口加女念什么| 绝经是什么意思| 62岁属什么| 肉沫炒什么好吃| 一什么酒店| 什么的散步| vsd是什么意思| n2是什么意思| 起大运是什么意思| 臁疮是什么病| 湿气是什么原因造成的| 什么叫肾功能不全| 梦见下大雨是什么意思| 十指不沾阳春水什么意思| 长卿是什么意思| 爱屋及乌是什么意思| 牛奶不能和什么一起吃| 婴儿什么时候长牙齿| 脑死亡是什么原因引起的| 冬枣是什么季节的水果| 正印代表什么意思| 盐水洗脸有什么好处| 恳谈会是什么意思| 胸口隐隐作痛挂什么科| 张飞的兵器是什么| 517是什么星座| 985211是什么意思| 血色素是什么意思| 促甲状腺激素高是什么意思| 陈皮泡水喝有什么功效| 宝宝什么时候长牙| 喊麦什么意思| 梦到别人怀孕是什么意思| 什么情况下打破伤风针| 吃什么可以降血脂| 瑜伽垫什么材质的好| 半夜容易醒是什么原因| 上海市市委书记是什么级别| 学长是什么意思| 肺结节是什么病严重吗| 驻马店有什么大学| 初七是什么日子| 舌苔发黑是什么原因引起的| 苦瓜不能和什么一起吃| 大便弱阳性是什么意思| 睡前一杯牛奶有什么好处| 小便短赤吃什么药| 眼干是什么原因引起的| 尤物是什么意思| 心什么如什么的成语| 今年54岁属什么生肖| 偶发性房性早搏是什么意思| 为什么声音老是嘶哑| 心脏无力吃什么药最好| 什么动物会冬眠| 低钾血症是什么意思| 什么东西一吃就死| 甲状腺结节有什么感觉| 清肺火吃什么药| 全是什么意思| 宝宝湿疹用什么药膏| 八纲辨证中的八纲是什么| 高等院校是什么意思| 亲密是什么意思| hpu是什么意思| 什么金属最贵| 小青柑属于什么茶| 尼古丁是什么东西| 宝宝乳糖不耐受喝什么奶粉比较好| 血脂高喝什么茶好| 鸡为什么喜欢吃泡沫| 百度跳转到内容

2017组装电脑教程:i5-6500家用办公主机装机实录

本页使用了标题或全文手工转换
维基百科,自由的百科全书
ADO.NET
操作系统Microsoft Windows
类型软件框架
许可协议MS-EULABCL(在微软参考授权下发布)
网站ADO.NET Overview on MSDN
百度 同时,问题也主要集中在“机身边缘不平”、“屏幕漏光”、“键帽歪斜”等细节方面,产品品控表现出一定随机性。

ADO.NET是微软在.NET Framework中负责数据访问的类别库集,它是使用在COM时代奠基的OLE DB技术以及.NET Framework的类别库和编程语言来发展的,它可以让.NET上的任何编程语言能够连接并访问关系数据库与非数据库型数据来源(例如XML,Excel或是文字档数据),或是独立出来作为处理应用程序数据的类别对象,其在.NET Framework中的地位是举足轻重,许多人将ADO.NET视为 ActiveX Data Objects (ADO) 的下一个版本,但其实它是一个全新的架构、产品与概念。

ADO.NET类封装在System.Data.dll中,并且与System.Xml.dll中的XML类集成。

历史

[编辑]

发展缘起

[编辑]

在1990年代初期,微软已经开发了许多的数据访问方式,像是ODBC架构、和Microsoft Access数据库交互使用的DAO对象、可以跨越网络访问数据的RDO英语Remote Data Objects以及让DAO组件可以访问ODBC数据来源的ODBCDirect技术等等,技术虽然多,但是却又各自为政,而且每个技术的重叠性也很高(像是ODBC有Microsoft Access的驱动程序);RDO虽然可跨网络,但是ODBC的驱动程序中也有提供跨网络的功能(像是SQL ServerOracle驱动程序),如此琳琅满目重叠性又高的技术群,让企业与开发人员在选择、学习与应用上产生了很多的困难。

1996年,适逢COM的出现,微软将数据访问的核心开始改写为以COM为基础的OLE DB,并且在它上面创建一个新的统一的数据访问的高层对象模型-ADO。ADO推出后顺利的取代了DAO和RDO,成为在Windows NT 4.0Windows 2000操作系统上开发数据库应用程序的首选。它将OLE DB的对象模型进一步简化;由数据库厂商开发满足OLE DB接口的数据提供者(data provider,这个模式在此时奠基),而ADO本身则是与数据来源无关(data source independent)的对象结构,让它迅速的获得了使用ASPVisual BasicCOM的开发人员的青睐。它能够顺利取代DAO与RDO,要关键在于ADO的与数据库服务器端/客户端的特性无关,这使得ADO通用性极好。然而ADO本身的架构仍然有缺陷(尤其是在开发网络应用程序时,最好的例子就是Recordset无法离线),这也是微软为何不在.NET Framework中继续使用ADO的主要原因。

1998年时,微软提出了一个下一代的应用程序开发框架(Application Framework)的项目[1],项目中包含了:

  • ASP+:改良与重新设计ASP技术,强化它的Web应用程序发展能力。
  • Storage+:发展新的数据库与面向对象之文件系统结构(用于SQL Server 8.0(即后来的SQL Server 2000)与NTFS),以及发展新一代的数据访问组件,并改良ADO本身的缺陷,让它更能够成为应用程序数据访问的核心功能。
  • COM+:改良COM和MTS,成为企业级应用程序开发的基础组件。

ADO+即为Storage+的一支。

ADO.NET的前身:ADO+

[编辑]

1998年起,因为Web应用程序的窜起,大大改变了许多应用程序的设计方式,传统的数据库连线保存设计法无法适用于此类应用程序,这让ADO应用程序遇到了很大的瓶颈,也让微软开始思考让数据集(Resultset,在ADO中称为Recordset)能够离线化的能力,以及能在客户端创建一个小型数据库的概念[2][注 1],这个概念就是ADO.NET中离线型数据模型(disconnected data model)的基础,而在ADO的使用情形来看,数据库连线以及资源耗用的情形较严重(像是Server-side cursor或是Recordset.Open会保持连线状态),在ADO.NET中也改良了这些对象,构成了能够减少数据库连线和资源使用量的功能。XML的使用也是这个版本的重要发展之一。

2000年,微软的Microsoft .NET项目开始成形,许多的微软产品都冠上.NET的标签,ADO+也不例外,改名为ADO.NET[注 2],并包装到.NET Framework类别库中,成为.NET平台中唯一的数据访问组件。

架构

[编辑]

ADO.NET由连线数据来源(connected data source)以及离线数据模型(disconnected data model)两个部分构成[3],这两个部分是相辅相成的。

连线数据来源

[编辑]

若没办法连线到数据库,则无法被称为数据访问组件。连线数据来源便是用来连接数据库(或是具有OLE DB数据来源提供者)的对象类别[4],由下列接口构成:

  • IDbConnection,负责与数据库的连线管理,包含连线字符串(connection string),连线的开关,数据库交易的启始与连线错误的处理,所有的ADO.NET数据提供者都要实现此接口。
    • Open()/Close():开启与关闭数据库连线。
    • BeginTransaction():启动数据库交易,并回传一个IDbTransaction对象,以控制交易的结果。
  • IDbCommand,负责执行数据库指令(在大多数的案例中都是SQL指令),并传回由数据库中截取的结果集,或是执行不回传结果集的数据库指令。
    • ExecuteNonQuery():执行不回传结果集的数据库指令,像是INSERTUPDATEDELETE指令,返回值为该命令所影响的行数。 对于其他所有类型的语句,返回值 为 -1。
    • ExecuteScalar():执行指令并回传第一列第一行中的值(object类型)。当没有数据时,ExcuteScalar方法返回System.DBNull。
    • ExecuteReader():执行指令并回传IDataReader对象,以读取数据集中的数据。
    • BeginExecuteNonQuery:开始执行异步查询
    • EndExecuteNonQuery: 结束执行异步查询
  • IDataParameter,负责装载数据库指令所需要的参数数据,在使用参数化查询时会经常使用。 对于不同的数据源来说,占位符不同。SQLServer数据源用@parametername格式来命名参数,OleDb以及Odbc数据源均用问号(?)来标识参数位置,而Oracle则以:parmname格式使用命名参数。
  • IDbTransaction,负责装载数据库交易所需的控制对象,以执行交易的认可(commit)或撤销(rollback)的工作。
    • Commit():认可数据库交易。
    • Rollback():撤销数据库交易。
  • IDbDataAdapter,负责将来自于IDbCommand执行获取的结果集,装载到离线型数据集(DataSet)或是离线型数据表(DataTable)中。
    • Fill():将数据填入离线型数据对象。
    • Update():将变更过的离线型数据对象中的数据写回数据库。
  • IDataReader,创建一个只可向前读取光标(forward-only)的数据读取器工具,以逐列读取方式访问数据,IDbDataAdapter内部也是由它来读取数据。
    • Read():第一次调用Read()方法获取第一行数据,并将游标指向下一行数据。当再次调用该方法时候,将读取下一行数据。当检测到不再有数据行时,Read()方法将返回false
  • IDataRecord,在IDataReader读取数据后实际装载数据列的对象,提供方法来读取数据行中的数据,以及转换成.NET Framework原生类型的工具。
    • GetOrdinal():获取指定数据行的字段索引值。
    • IsDBNull():判断指定字段的数据是否为NULL值

使用连线数据来源需要由开发人员自我管理连线,并且直接操作数据访问的相关细节,但它的优点是速度快,而且可以自定义整个数据访问流程的逻辑。


ADO.NET数据提供者(Data Provider)

[编辑]

在.NET Framework中,ADO.NET默认提供了四种数据来源:

  • SQL Server:由System.Data.SqlClient提供原生数据来源,是微软官方建议访问SQL Server时建议使用的数据提供者。以Sql为前缀的类别群
  • OLE DB Data Source:由System.Data.OleDb提供支持,可适用于OLE DB Provider for ODBC以外的OLE DB数据提供者。以OleDb为前缀的类别群。支持本地事务和分布式事务。 对于分布式事务,默认情况下,用于 OLE DB 的 .NET Framework 数据提供程序会自动登记在事务中,并自动从 Windows 2000 组件服务获取事务详细信息。
  • Oracle:由System.Data.OracleClient提供支持,但用户的电脑必须安装Oracle Client 8.1.7或更新版本才行(.NET Framework 1.1开始支持)。以Oracle为前缀的类别群。必须同时引用 System.Data和 System.Data.OracleClient。
  • ODBC:补OLE DB Provider for ODBC的支持,由System.Data.Odbc提供支持(.NET Framework 1.1开始支持)。以Odbc为前缀的类别群
  • EntityClient实体数据模型(EDM)应用程序的数据访问。使用 System.Data.EntityClient 命名空间。

其他厂商亦为不同的数据库提供数据来源:

对每种Data Provider,ADO.NET要实现下述对象结构:

  • Connection 对象提供与数据源的连接。
  • Command对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。
  • DataReader 对象从数据源中提供快速的,只读的数据流。
  • DataAdapter 对象提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。
  • Parameter 对象用于参数化查询。

例如,对于SQL Server数据源:

strSQL = "SELECT * FROM users WHERE Name = @Name and Password = @Password";
SqlParamter[] paras = new SqlParamter[]{//参数数组
     new SqlParamter("@Name",SqlDBType.Varchar,50)
     new SqlParamter("@Password",SqlDBType.Varchar,50)};
paras[0].value = userName;//绑定用户名
paras[1].value = password;//绑定用户密码
  • ConnectionStringBuilder:提供一种用于创建和管理由 Connection 对象使用的连接字符串的内容的简单方法。 所有 ConnectionStringBuilder 对象的基类均为 DbConnectionStringBuilder 类。
  • CommandBuilder :自动生成 DataAdapter 的命令属性或从存储过程中派生参数信息,并填充 Command 对象的 Parameters 集合。 所有 CommandBuilder 对象的基类均为 DbCommandBuilder 类。

离线数据模型

[编辑]

离线数据模型是微软为了改良ADO在网络应用程序中的缺陷所设计的,同时它也是COM+中,IMDB技术的设计概念的实现品,但它并没有完整的IMDB功能,像是交易处理(transaction processing),但它仍不失为一个能在离线状态下处理数据的好帮手,它也可以透过连线数据来源对象,支持将离线数据存回数据库的能力[5]。离线数据模型由下列对象组成:

  • DataSet,离线型数据模型的核心之一,可将它当成一个离线型的数据库,它可以内含许多个DataTable,并且利用关系与限制方式来设置数据的完整性,它本身也提供了可以和XML交互作业的支持。
    • ReadXml()/WriteXml():以DataSet的结构读写XML。
    • ReadXmlSchema()/WriteXmlSchema():以DataSet的结构读写XML Schema
    • GetXml()/GetXmlSchema():获取DataSet内容的XML或XML Schema。
    • Merge():合并两个DataSet。
    • Load():自IDataReader加载数据到DataSet。
    • AcceptChanges():将修改过的数据列的修改旗标改为Unchanged
    • GetChanges():将修改过的数据列以DataRow数组方式传回。
    • RejectChanges():撤销所有数据的修改。
  • DataTable,离线型数据模型的核心之一,可将它当成一个离线型的数据表,是存储数据的收纳器。
    • Copy():将DataTable复制出一个副本,包含结构与数据。
    • Merge():将两个DataTable合并。
    • Select():以指定的特殊查询语法,传回符合条件的DataRow数组。
    • Compute():以指定的汇总语法,传回汇总的结果。
    • GetErrors():传回有错误的DataRow数组。
    • HasErrors:判断DataTable中的DataRow有没有含有错误的DataRow。
  • DataRow,表示表格中的数据列,与数据栏组合成数据存储的单元。
    • IsNull():判断指定的字段是否为NULL值。
    • ItemArray:将DataRow中的数据转换成数组。
  • DataColumn,表示表格中的字段。
  • DataView,展示数据的辅助组件,类似于数据库中的查看表,并可设置过滤条件与排序条件。
    • Filter:设置DataView的过滤条件。
    • Sort:设置DataView的排序条件。
    • ToTable():将应用过滤与排序后的内容转换为DataTable对象。
  • DataRelation,可在DataTable之间设置字段间的关系。
  • Constraint,设置字段的条件约束,例如ForeignKeyConstraint为外部键限制,而UniqueConstraint则确保了字段中的值都是唯一的。

DataSet和DataTable除了数据库的处理以外,也经常被用来管理应用程序中的数据,并且由于它可以存储在XML中的特性,也让它可以用来存储需要保存的应用程序信息。DataSet中可包含DataRelation对象,用于建构表之间的约束关系。

工厂方法

[编辑]

在.NET Framework 1.x的时代,ADO.NET不同的来源有不同的类别搭配(前面已述及),但是若想要在不同的数据来源间搭配,那么势必要产生很多的变量来存放不同的数据对象,因此微软在.NET Framework 2.0中提供了一个System.Data.Common命名空间,其中有各种必要对象的共享方法(例如连线是DbConnection,命令是DbCommand,读取器是DbDataReader,数据适配器是DbDataAdapter等),以及DbProviderFactory对象,用来总管数据访问的对象。

DbProviderFactories则是电脑中所有提供者的总管,开发人员可用DbProviderFactories.GetFactoryClasses()获取各个提供者的Invariant Name,再于调用DbProviderFactories.GetFactory()时传入指定提供者的Invariant Name即可获取DbProviderFactory,再利用下列方法获取共享对象:

  • DbProviderFactory.CreateConnection()
  • DbProviderFactory.CreateCommand()
  • DbProviderFactory.CreateParameter()
  • DbProviderFactory.CreateDataAdapter()
// This example assumes a reference to System.Data.Common.
static DataTable GetProviderFactoryClasses()
{
    // Retrieve the installed providers and factories.
    DataTable table = DbProviderFactories.GetFactoryClasses();

    // Display each row and column value.
    foreach(DataRow row in table.Rows)
    {
        foreach(DataColumn column in table.Columns)
        {
            Console.WriteLine(row[column]);
        }
    }
    return table;
}

XML的集成

[编辑]

XML在ADO.NET中扮演了相当重要的地位,DataSet和DataTable都可以转换成XML或和XML之间交换数据,在DataTable的内部数据的变更记录,可以被输出到一个XML的格式,用来识别变更的情形,这个格式称为DiffGram,而且它可以直接读入DataTable之中(使用DataTable.ReadXml()并用XmlReadMode.DiffGram当参数)。一个典型的DiffGram如下:

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
  <CustomerDataSet>
    <Customers diffgr:id="Customers1" msdata:rowOrder="0" diffgr:hasChanges="modified">
      <CustomerID>ALFKI</CustomerID>
      <CompanyName>New Company</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers2" msdata:rowOrder="1" diffgram:hasErrors="true">
      <CustomerID>ANATR</CustomerID>
      <CompanyName>Ana Trujillo Emparedados y Helados</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers3" msdata:rowOrder="2">
      <CustomerID>ANTON</CustomerID>
      <CompanyName>Antonio Moreno Taquera</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers4" msdata:rowOrder="3">
      <CustomerID>AROUT</CustomerID>
      <CompanyName>Around the Horn</CompanyName>
    </Customers>
  </CustomerDataSet>
  <diffgr:before>
    <Customers diffgr:id="Customers1" msdata:rowOrder="0">
      <CustomerID>ALFKI</CustomerID>
      <CompanyName>Alfreds Futterkiste</CompanyName>
    </Customers>
  </diffgr:before>
  <diffgr:errors>
    <Customers diffgr:id="Customers2" diffgr:Error="An optimistic concurrency violation has occurred for this row."/>
  </diffgr:errors>
</diffgr:diffgram>

DataSet与DataTable也支持直接读入XML Schema创建结构的能力,以及自行依XML的内容推断(inference)其结构的能力,下列代码为由XML推断结构的程序:

DataSet dataSet = new DataSet();
dataSet.InferXmlSchema9("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");

DataSet和DataTable可以使用XmlDataDocument类别和XML DOM集成在一起,XmlDataDocument的角色就像一个桥接接口,并且作为DataSet和DataTable可使用XPath与XML DOM方式访问的方法。下列代码即为使用XmlDataDocument和数据库中数据转换为XSLT输出的示例:

// Assumes connection is a valid SqlConnection.
connection.Open();

DataSet custDS = new DataSet("CustomerDataSet");

SqlDataAdapter customerAdapter = new SqlDataAdapter(
  "SELECT * FROM Customers", connection);
customerAdapter.Fill(custDS, "Customers");

SqlDataAdapter orderAdapter = new SqlDataAdapter(
  "SELECT * FROM Orders", connection);
orderAdapter.Fill(custDS, "Orders");

connection.Close();

custDS.Relations.Add("CustOrders",
  custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]).Nested = true;

XmlDataDocument xmlDoc = new XmlDataDocument(custDS); 

XslTransform xslTran = new XslTransform();
xslTran.Load("transform.xsl");

XmlTextWriter writer = new XmlTextWriter("xslt_output.html", 
  System.Text.Encoding.UTF8);

xslTran.Transform(xmlDoc, null, writer);
writer.Close();

在.NET Framework中,DataSet被分为两类,一种是不会强制使用特别类型的DataSet,称为Untyped DataSet,使用上较方便,但没有强制的类型限制,另一种则是Typed DataSet,会强制类型,并且是由自定义的XML Schema所产生,Untyped DataSet则没有XML Schema,由创建时的结构来决定,Typed DataSet可以用Visual Studio,或者是SDK工具中的xsd.exe来产生。

xsd.exe /d /l:CS XSDSchemaFileName.xsd /eld /n:XSDSchema.Namespace

产生出来的Typed DataSet会自动将字段设置成属性,让开发人员的访问更方便(这个功能在TableAdapter相当常见)。

CustomerDataSet customers = new CustomerDataSet();
SqlDataAdapter adapter = new SqlDataAdapter(
  "SELECT * FROM dbo.Customers;",
  "Data Source=(local);Integrated " +
  "Security=SSPI;Initial Catalog=Northwind");

adapter.Fill(customers, "Customers");

foreach(CustomerDataSet.CustomersRow customerRow in customers.Customers)
  Console.WriteLine(customerRow.CustomerID);

指令产生器

[编辑]

ADO.NET中有专门用来产生数据处理指令的指令产生器(Command Builder),它可以利用开发人员所指定的SELECT指令,自动产生对应的INSERTUPDATEDELETE指令,但一开始它并不会自动产生,而是要靠调用方法来获取:

  • DbCommandBuilder.GetInsertCommand()
  • DbCommandBuilder.GetUpdateCommand()
  • DbCommandBuilder.GetDeleteCommand()

最常使用到的地方是和DataAdapter并用时,但它要求传入的SELECT语句所选择的列集合中必须要有主键或者唯一键[6],否则无法产生,同时自动产生的指令因为判断条件很多,对性能可能会有些影响。

Visual Studio的支持

[编辑]

ADO.NET和Visual Studio开发工具几乎已经是无缝的集成了,开发人员可以利用Visual Studio来创建强类型(strong-typed)的DataSet,到了Visual Studio 2005时更能够在Windows Forms应用程序中使用TableAdapter(Typed DataSet和DataAdapter集成的产物)来开发应用程序(不会再看到DataAdapter,但使用上差不多)[7]。Visual Studio在创建Typed DataSet时有提供可视化接口的支持,以及数据库配置向导(Database Configuration Wizard)来让开发人员以简单的设置方式来创建DataSet,部分开发人员也将TableAdapter和ASP.NET应用程序的ObjectDataSource控件并用,亦得到不错的效果。

在.NET Framework 3.5中,微软特别为了DataSet和DataTable创建了LINQ Provider(称为LINQ to DataSet或LINQ to ADO.NET),让LINQ可以在DataSet或DataTable上使用,可以让原本在DataSet上的投资(代码)得以继续使用并享有LINQ的便利性。

ADO.NET和ADO的差异

[编辑]

对于ADO的开发人员来说,最明显的变化在于以往ADO中的Recordset消失了,并且明确的分开为连线型的DataReader以及离线型的DataSet与DataTable,并且发展支持离线型数据来源的浏览工具DataView[8],这样的改变,让习惯使用ADO的VB/ASP开发人员会有某种程度的不习惯,同时让ADO.NET的学习会较ADO有较些许的复杂性,因此有部分新入门或是VB 6.0/ASP开发人员会在学习.NET Framework或是使用VB.NET开发应用程序时,在.NET Framework中使用ADO来连接数据来源。但在.NET Framework应用程序使用ADO的话,.NET Framework会因为要多一层ADO的COM与VB.NET使用的.NET之间的数据转换,会让应用程序性能有少部分的损耗[9]

下述示例,用ADO读取一个数据库中的表格,然后转为ADO.Net的数据,最后绑定到DataGridView控件中去显示:

        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        cn = New ADODB.Connection
        rs = New ADODB.Recordset
        cn.Provider = "Microsoft.ACE.OLEDB.12.0;"
        cn.ConnectionString = "D:\\budget2016.accdb;"
        cn.Open()

        'check whether the serial num exists in table cutter
        Dim sSQL As String = "SELECT * FROM tPassword" 
        rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs.Open(sSQL, cn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockReadOnly,_ 
                 ADODB.CommandTypeEnum.adCmdText)

        Dim da As New System.Data.OleDb.OleDbDataAdapter()
        Dim ds As New DataSet()
        da.Fill(ds, rs, "tPassword")

        'rs.Close()  'Cannot close 
        rs.ActiveConnection = Nothing
        cn.Close()
        rs = Nothing
        cn = Nothing

        DataGridView1.DataSource = (ds.Tables("tPassword"))

ADO的RecordSet,相当于在客户机或服务器的一个逻辑上的数据表格,用户可以通过cursor来定位/读写当前行,但不能重新对这些行重新排序,也不能对客户机上的多个RecordSet数据执行跨表的连接(join)查询。ADO.Net针对上述缺点,在客户机上实现了DataTable与DataSet,这是客户机内存中的一套(多个)数据表格,可以对其执行各种单表或多表的查询、修改、删除操作,既可以使用SQL语句,也可以使用LINQ子语言。

ADO与ADO.Net的共同点,在其内部都是使用SQL语句来对后台数据库操作。

内在实现上,ADO是基于COM技术,因此变体类型(Variant)无处不在,这是一种通用、万能类型;而ADO.Net是强类型的,并很好地支持数据库元数据与XML功能。

ADO.NET的进化

[编辑]

随着网络应用程序的进化,ADO.NET也随之做了许多的改变,但不变的是,ADO.NET的基础提供了强固的发展支持,这些进化的技术都是植基于ADO.NET的核心组件而来。

长久以来,程序员和数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的组件,这让程序员一定要为了连接与访问数据库而去学习SQL指令,因此在信息业中有很多人都在研究如何将程序设计模型和数据库集成在一起,对象关系对应(Object-Relational Mapping)的技术就是由此而生,像Hibernate或NHibernate都是这个技术下的产物,而微软虽然有了ADO.NET这个数据访问的利器,但却没有像NHibernate这样的对象对应工具,因此微软在.NET Framework 2.0发展时期,就提出了一个ObjectSpace的概念,ObjectSpace可以让应用程序可以用完全对象化的方法连接与访问数据库,其技术概念与NHibernate相当类似,然而ObjectSpace项目相当大,在.NET Framework 2.0完成时仍无法全部完成[10],因此微软将ObjectSpace纳入下一版本的.NET Framework中,并且再加上一个设计的工具(Designer),构成了现在的ADO.NET Entity Framework。

Entity Framework利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象(entity),而数据字段都转换为属性(property),关系则转换为结合属性(association),让数据库的E/R模型完全的转成对象模型,如此让程序员能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和存储层,以及支持Entity Framework的数据提供者(provider),让数据访问的工作得以顺利与完整的进行。

以往在发展像是AJAX应用程序时,服务端总是需要设计一个HTTP接口端口(end point),通常都会使用Web Service来实现,但是随着Mashup应用程序的成长,若每次都要为一份(或一组)数据撰写Web Service或HTTP end point的话,对开发人员也是不小的负担,而且Web Service只支持XML/SOAP的数据格式,无法兼容于Mashup应用程序常用的JSON数据格式,微软也发现未来的Silverlight应用程序也是会面临到相同问题。

当时刚好微软的ADO.NET Entity Framework也正在开发中,它的EDM能力刚好可以提供给WCF数据访问的能力,因此微软特别以ADO.NET Entity Framework为基础,开发一个专门提供HTTP端点数据服务的数据供应层,即为WCF Data Services。

注释

[编辑]
  1. ^ 此概念的原型为In-Memory Database,又称IMDB,可在存储器中运行的数据库,然而以当时的环境(2000年初,存储器尚未跌到目前的价格水准),以及技术不成熟的情况下,这项技术在Windows 2000 RC2时被抽离。
  2. ^ 有相同遭遇的还有ASP+(改名为ASP.NET)。

参考文献

[编辑]
  1. ^ COM+, A Windows 2000 technology showcase. [2025-08-08]. (原始内容存档于2025-08-08). 
  2. ^ ADO+. [2025-08-08]. (原始内容存档于2025-08-08). 
  3. ^ ADO.NET架構. [2025-08-08]. (原始内容存档于2025-08-08). 
  4. ^ 擷取和修改ADO.NET中的資料. [2025-08-08]. (原始内容存档于2025-08-08). 
  5. ^ DataSet、DataTable及DataView(ADO.NET). [2025-08-08]. (原始内容存档于2025-08-08). 
  6. ^ .NET Framework开发人员指南 - 使用CommandBuilder生成命令(ADO.NET). [2025-08-08]. (原始内容存档于2025-08-08). 
  7. ^ TableAdapter. [2025-08-08]. (原始内容存档于2025-08-08). 
  8. ^ ADO.NET ─ ADO開發人員指引. [2025-08-08]. (原始内容存档于2025-08-08). 
  9. ^ Revisiting the Use of ADO in .NET Applications. [2025-08-08]. (原始内容存档于2025-08-08). 
  10. ^ A First Look at ObjectSpaces in Visual Studio 2005. [2025-08-08]. (原始内容存档于2025-08-08). 

参见

[编辑]
黄毛是什么意思 早早孕什么时候测最准 什么补血补气最好最快 水准仪是测量什么的 宫颈纳氏囊肿是什么意思
清汤寡水是什么意思 用盐水泡脚有什么好处 下连是什么意思 a型rhd阳性是什么意思 什么是素质教育
洁字五行属什么 胃热吃什么食物好 鸡蛋吃多了有什么坏处 慢性萎缩性胃炎伴糜烂吃什么药 荔枝不能和什么一起吃
大仙为什么知道你的事 牙痛上火吃什么药 贼头贼脑是什么生肖 胃痉挛吃什么药最有效 寻麻疹不能吃什么
4月29是什么星座hcv9jop7ns3r.cn mg是什么元素xianpinbao.com 什么叫批次线hcv8jop9ns6r.cn 光膀子什么意思hcv8jop7ns3r.cn 徐五行属什么hcv8jop9ns6r.cn
吃什么可以降尿酸hcv8jop2ns5r.cn 槟榔肝是由什么引起的hcv9jop5ns4r.cn amh是什么意思hcv9jop7ns2r.cn 刑妻克子是什么意思hcv7jop6ns4r.cn 黄色衣服配什么颜色裤子好看hcv9jop8ns0r.cn
吃软不吃硬是什么生肖huizhijixie.com 眼睑是什么意思hkuteam.com 百日咳是什么意思hcv8jop4ns1r.cn 为什么叫关东军hcv8jop0ns9r.cn 谷丙转氨酶偏高说明什么原因jinxinzhichuang.com
梦见死去的姥姥是什么意思hcv9jop4ns7r.cn edv是什么意思beikeqingting.com 自己开店做什么赚钱hcv9jop8ns0r.cn 发烧喝什么汤hcv8jop8ns6r.cn 肝火旺吃什么好hcv8jop6ns0r.cn
百度