分享
 
 
 

使用ADO.NET轻松操纵数据库(二)

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

首先,ADO.NET中使用了DataAdapter 来处理与数据库的联机与脱机。当时开发人员设计了DataAdapter是为了能够处理脱机数据,方便操作,关于这一点,只要调用其Fill()方法即可,这时会在DataSet中创建一个新的名为“Table“的DataTable.要重新指定名可用DataAdapter.Fill(DataSet,“Tabelname“)。此时connection也关闭了。DataAdapter既可以用来提交查询,并将结果存储到DataSet中,也可以用来向数据库传递更改。仅仅使用其Update方法即可达到向数据库提交存储地DatSet中的更改。

DataAdapter将查询的结果存储在DataSet或DataTable对象中,当执行这一过程的时候,DataAdapter使用了一个Command来与数据库通讯,并在内部使用了DataReader来获取查询结果,最后才将结果复制到DataSet新行中去。这也是Fill的过程。如果有两个DataAdapter对象,都使用相同的Connection对象,在创建的时候就会创建两个Connection对象,而不是同一个,这种情况的解决方案是:

SqlConnection con=new SqlConnection("server=localhost;database=Northwind;Trusted_Connection=Yes;")

SqlDataAdapter da=new SqlDataAdapter("select CategoryID,Description from Categories",con);

SqlDataAdapter da=new SqlDataAdapter("select CategoryID,Description from Customers",con);

而不是将查询字符串,单独写成一行。

有时候可能并不希望DataSet中的架构与数据库中的架构相同,这种情况的解决方案之一是可以采用别名的方法,即select id as Product ID,amount as Product Amount from product;另外一种解决方案就是使用DataAdapter提供的TableMappings集合机制,通过它就可以将查询结果映射到DataSet结构中,这种方法更方便,更灵活。TableMappings属性返回一个DataTableMappingsCollection对象,其中包含了一组DataTableMappings,只要DataSet中相应的表名称与数据库中的表名相同,即可以使用它来创建一个映射(DataSet中可以有多个表)。TableMappings里还有一个ColumnMappings属性,其用法与TableMappings相似。其原理是DataAdapter从数据库读取数据后,利用DataReader从结果集中获取列名称,有一点特别要注意,即只能获取列名称而无法获取表名称,DataAdapter事先假定表名称为Table,接着遇到映射语句则进行表映射。不说了,看代码:

DataColumnMapping colMap;

SqlConnection con=new SqlConnection("server=localhost;database=Northwind;Trusted_Connection=Yes;");

SqlDataAdapter da=new SqlDataAdapter("select CategoryID,Description from Categories",con);

DataSet ds=new DataSet();

DataTableMapping tblMap=da.TableMappings.Add("Table","Ca"); //这里Table为关键,映射表名为Ca

colMap=tblMap.ColumnMappings.Add("CategoryID","ID"); //映射列表

colMap=tblMap.ColumnMappings.Add("Description","描述");

// Response.Write(tblMap.DataSetTable.ToString());

da.Fill(ds);

DataTable dt=ds.Tables["Ca"]; //这里是映射后的表名,如果仍为数据库的表名,则无效,特别注意

this.DataGrid1.DataSource=dt;

this.DataGrid1.DataBind();

运行代码后就会发现DataGrid1上的列名为ID和描述 (^_^)

(注:使用DataTableMapping 之前要前导入名空间System.Data.Common;)

还可以使用AddRange方法来简化表和列的映射:(一些代码同上面)

.......

DataTableMapping tblMap=da.TableMappings.Add("Table","Ca"); DataColumnMapping[] colMapArray=new DataColumnMapping[]{new DataColumnMapping("CategoryID","产 品号"),new DataColumnMapping("Description","描述")}; tblMap.ColumnMappings.AddRange(colMapArray);

......

这种映射关系只能从数据库中读取展示给用户,如果要将映射后的Table的更改提交给数据库,这时库发现其中列与库中列不同,便会发生异常,DataAdapter 同时也提供了MissingMappingAction属性来处理。

DataAdapter1.MissingMappingAction=MissingMappingAction.Passthrough/Ignore/Error

它接受MissingMappingAction的枚举值,Passthrough这个值表示如果在库中找不到与DataSet中相同列的话,就将此列映射到库中,Ignore枚举值表示忽略示出现的列,Error表示找不到相应的列则抛出异常。

分页:

分页在应用中是常有的事,而DataAdapter本身也提供了分页的简单功能,如:DataAdapter1.Fill(dataset,startrow,rownum,“tablename“)这种功能用于数据量较小的查询就可以,但当有大量数据的时候,就会发现这种分页的问题的存在。它的原理是假如有一百行数据,分成十页,每页十行,当获取每一页的时候,返回前10行,再接着,第二页,删除了前10行而获取接下的10行,在这一次中,只是为了获取10行数据,但数据库却返回了20行,依此类推,第10页的时候就会返回100行,而DataAdapter本身就帮我们删除了90行,因为我们看上去返回的还是10行,这种性能太低。因此本篇继续介绍另外一种性能较高的分页方法。实际上这种分页方法是将上一页最后一行的键值存储下来,直接在SQL语句中就过滤掉了,不象前面那种到DataAdapter这边才过滤掉。例:

con=new SqlConnection("server=localhost;database=Northwind;Trusted_Connection=Yes;");

da=new SqlDataAdapter("select top 50 CustomerID,CompanyName from Customers whereCustomerID>'BOTTM'",con);

ds=new DataSet();

da.Fill(ds,"Categories");

this.DataGrid1.DataSource=ds.Tables["Categories"]; this.DataGrid1.DataBind();

con.Close();

这里假如上一页最后一个键值为”BOTTM”,可以将它用参数替代掉,这样就查出了在'BOTTM'之后的50行。这种方法实现简单效率也高。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有