加入收藏
|
设为首页
|
会员中心
|
我要投稿
李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
首页
站长资讯
随写记事
云计算
大数据
运营中心
综合聚焦
数据库
5G
编程开发
创业
百科
营销
教程
站长学院
业界
运营
编程
创业
建站
电商
移动
创业之路
当前位置:
首页
>
站长学院
>
MsSql教程
> 正文
ADO.NET实用经验
发布时间:2020-12-12 15:59:01 所属栏目:MsSql教程 来源:网络整理
导读:
ADO.NET 框架数据提供程序 .NET .NET框架数据提供程序? 为了使您的应用程序获得最佳性能,请使用最适合您的数据源的.NET 框架数据提供程序。有许多数据提供程序可供您的应用程序选用。 ? ODBC.NET 数据提供程序可在 Microsoft.Data.ODBC 命名空间中找到,它
ADO.NET
框架数据提供程序
.NET
.NET框架数据提供程序?
为了使您的应用程序获得最佳性能,请使用最适合您的数据源的.NET
框架数据提供程序。有许多数据提供程序可供您的应用程序选用。
?
ODBC.NET
数据提供程序可在
Microsoft.Data.ODBC
命名空间中找到,它的体系结构与用于
SQLServer
和
OLE DB
的
.NET
数据提供程序相同。ODBC .NET数据提供程序遵循命名约定
-
以“ODBC”为前缀(例如,
OdbcConnection
),并使用标准ODBC连接字符串。
当使用
DataSet
时,经常会利用
DataAdapter
(也可能是
CommandBuilder
)与数据源进行交互。当使用
DataSet
时,也可以利用
DataView
对
DataSet
中的数据应用排序和筛选。也可以从
DataSet
继承,创建强类型
DataSet
,用于将表、行和列作为强类型对象属性公开。
下列主题包括的信息涉及:使用
DataSet
或
DataReader
的最佳时机、如何优化访问它们所包含数据、以及如何优化使用
DataAdapter
(包括
CommandBuilder
)和
DataView
的技巧。
DataSet
DataSet的好处
DataSet
的另一个好处是可被继承以创建一个强类型
DataSet
。强类型
DataSet
的好处包括设计
时类型
检查,以及Microsoft Visual Studio.NET用于强类型
DataSet
语句结束所带来的好处。修改了
DataSet
的架构或关系结构后,就可以创建一个强类型
DataSet
,将行和列作为对象的属性公开,而不是作为集合中的项公开。例如,不公开客户表中行的姓名列,而公开Customer对象的
Name
属性。类型化
DataSet
从
DataSet
类派生,因此不会牺牲
DataSet
的任何功能。也就是说,类型化
DataSet
仍能远程访问,并作为数据绑定控件(例如
DataGrid
)的数据源提供。如果架构事先不可知,仍能受益于通用
DataSet
的功能,但却不能受益于强类型
DataSet
的附加功能。
如果想用服务器上的更新值刷新
DataSet
中的值,就使用
DataAdapter.Fill
。如果有在
DataTable
上定义的主键,
DataAdapter.Fill
会根据主键进行新行匹配,并且当更改到现有行时应用服务器上的值。即使刷新之前修改了这些数据,刷新行的
RowState
仍被设置为
Unchanged
。注意,如果没有为
DataTable
定义主键,
DataAdapter.Fill
就用可能重复的主键值添加新行。
如果想用来自服务器的当前值刷新表,并同时保留对表中的行所做的任何更改,必须首先用
DataAdapter.Fill
填充表,并填充一个新的
DataTable
,然后用
preserveChanges
值
true
将
DataTable
合并到
DataSet
之中。
如果创建了
DataView
,并且修改了
Sort
、
RowFilter
或
RowStateFilter
属性,
DataView
就会为基础
DataTable
中的数据建立索引。创建
DataView
对象时,要使用
DataView
构造函数,它用
Sort
、
RowFilter
和
RowStateFilter
值作为构造函数参数(与基础
DataTable
一起)。结果是创建了一次索引。创建一个“空”
DataView
并随后设置
Sort
、
RowFilter
或
RowStateFilter
属性,会导致索引至少创建两次。
ADO.NET
startRecord
和
maxRecords
值的
DataAdapter.Fill
重载。当以这种方式填充
DataSet
时,只有
maxRecords
参数(从
startRecord
参数标识的记录开始)指定的记录数量用于填充
DataSet
,但无论如何总是返回完整的查询。这就会引起不必要的处理,用于读取“不需要的”记录;而且为了返回附加记录,会耗尽不必要的服务器资源。
2)
SQL语句,将TOP谓词和嵌入式
SELECT
语句的使用结合在一起。此技术并不依赖于存在一种可唯一标识每一行的办法。使用这项技术的第一步是将所需页的数量与
页大小
相乘。然后将结果传递给SQL Query的
TOP
谓词,该查询以升序排列。再将此查询嵌入到另一个查询中,后者从降序排列的嵌入式查询结果中选择TOP页大小。实质上,返回的是嵌入式查询的最后一页。例如,要返回查询结果的第三页(
页大小
是10),应该书写如下所示的命令: SELECT TOP 10 * FROM (SELECT TOP 30 * FROMCustomers ORDER BY Id ASC) AS Table1 ORDER BY Id DESC
1)
DataSet
当用数据填充
DataSet
时,
DataAdapter.Fill
方法使用
DataSet
的现有架构,并使用从
SelectCommand
返回的数据填充它。如果在
DataSet
中没有表名与要被填充的表名相匹配,Fill方法就会创建一个表。默认情况下,
Fill
仅定义列和列类型。
通过设置
DataAdapter
的
MissingSchemaAction
属性,可以重写
Fill
的默认行为。例如,要让Fill创建一个表架构,并且还包括主键信息、唯一约束、列属性、是否允许为空、最大列长度、只读列和自动增量的列,就要将
DataAdapter.MissingSchemaAction
指定为
MissingSchemaAction.AddWithKey
。或者,在调用
DataAdapter.Fill
前,可以调用
DataAdapter.FillSchema
来确保当填充
DataSet
时架构已到位。
对
FillSchema
的调用会产生一个到服务器的额外行程,用于检索附加架构信息。为了获得最佳性能,需要在调用Fill之前指定
DataSet
的架构,或者设置
DataAdapter
的
MissingSchemaAction
。
下面是一些使用
DataReader
获得最佳性能的技巧,同时还回答了一些关于使用
DataReader
的常见问题。
1)
在访问相关
Command
的任何输出参数之前,必须关闭
DataReader
。
2)
完成读数
据之后
总是要关闭
DataReader
。如果使用
Connection
只是用于返回
DataReader
,那么关闭
DataReader
之后立刻关闭它。
另外一个显式关闭Connection
的方法是将
CommandBehavior.CloseConnection
传递给
ExecuteReader
方法,以确保相关的连接在关闭
DataReader
时被关闭。如果从一个方法返回
DataReader
,而且不能控制
DataReader
或相关连接的关闭,则这样做特别有用。
1)
不能在层之间远程访问
DataReader
。
DataReader
是为已连接好的数据访问设计的。
2)
当访问列数据时,使用类型
化访问器
,例如,
GetString
、
GetInt32
等。这使您不用进行将
GetValue
返回的
Object
强制转换成特定类型所需的处理。
3)
一个单一连接每次只能打开一个
DataReader
。在ADO中,如果打开一个单一连接,并且请求两个使用只进、只读游标的记录集,那么
ADO
会在游标生存期内隐式打开第二个、未池化的到数据存储区的连接,然后再隐式关闭该连接。对于
ADO.NET
,“秘密”完成的动作很少。如果想在相同的数据存储区上同时打开两个
DataReaders
,就必须显
式创建
两个连接,每个
DataReader
一个。这是
ADO.NET
为池化连接的使用提供更多控制的一种方法。
4)
默认情况下,
DataReader
每次Read时都要将整行加载到内存。这允许在当前行内随机访问列。如果不需要这种随机访问,为了提高性能,就将
CommandBehavior.SequentialAccess
传递给
ExecuteReader
调用。这将
DataReader
的默认行为更改为仅在请求时将数据加载到内存。注意,
CommandBehavior.SequentialAccess
要求顺序访问返回的列。也就是说,一旦读过返回的列,就不能再读它的值了。
5)
如果已经完成读取来自
DataReader
的数据,但仍然有大量挂起的未读结果,就在调用
DataReader
的
Close
之前先调用Command的
Cancel
。调用
DataReader
的
Close
会导致在关闭游标之前检索挂起的结果并清空流。调用Command的
Cancel
会放弃服务器上的结果,这样,
DataReader
在关闭的时候就不必读这些结果。如果要从Command返回输出参数,还要调用
Cancel
放弃它们。如果需要读取任何输出参数,不要调用Command的
Cancel
,只要调用
DataReader
的
Close
即可。
<SPANSTYLE='FONT-SIZE:12.0PT;"done">大对象(BLOB)
用
DataReader
检索二进制
大对象
(BLOB)时,应该将
CommandBehavior.SequentialAccess
传递给
ExecuteReader
方法调用。因为
DataReader
的默认行为是每次
Read
都将整行加载到内存,又因为BLOB值可能非常大,所以结果可能由于单个
BLOB
而使大量内存被用光。
SequentialAccess
将
DataReader
的行为设置为只加载请求的数据。然后还可以使用
GetBytes
或
GetChars
控制每次加载多少数据。
记住,使用
SequentialAccess
时,不能不按顺序访问
DataReader
返回的不同字段。也就是说,如果查询返回三列,其中第三列是BLOB,并且想访问前两列中的数据,就必须在访问
BLOB
数据之前先访问第一列的值,然后访问第二列的值。这是因为现在数据是顺序返回的,并且
DataReader
一旦读过该数据,该数据就不再可用。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
相关内容
SQLServer 中发布与订阅
sql-server – 更换游标有哪些不同的方法?
sql-server – SQL查询性能和dropcleanbuffers
Redis 出现错误1067的解决办法
数据库 – 衍生账户余额与简单银行帐户的存储帐户余额?
SQL Server SQL 多表连接查询实现语句
sql – 行为不端的身份
sql语句错误:“列..不存在”
sql-server – 使用IIS,Firefox和SQL Server集成Windows身份
报表遇到的问题(一)
推荐文章
站长推荐
sql-server – 有没有人使用(或考虑使用)Sql Ser
Access连接数据源配置(新手必知)
SQL Server SQL学习笔记五去重,给新加字段赋值的
vs.net或sqlserver安装时提示:检测到另一个程序
sqlserver 2008安装时启动计算机失败
sqlserver 判断是否为数字的函数
sql-server-2005 – 索引性能BigInt与VarChar
win+ R下的常见命令
sql – 数据库中的原子比较和交换
sqlServer区分大小写查询
热点阅读