ADONET概述
一NET数据提供程序
Net框架提供数据提供程序SQL Client NET Data Provider和Ole DB NET Data Provider前者专为SQL Server以及以后的版本的数据库进行通信而设计后者允许通过OLE DB提供程序与各种数据存储进行通信无论使用哪种方式所编写的代码都很相似
二对象分类概述
连接的对象
ⅠConnection对象
表示与数据源之间的连接可通过Connection对象的各种不同属性指定数据源的类型位置以及其他属性可用它来与数据库建立连接或断开连接Connection对象起到渠道的作用其他对象如DataAdapter和Command对象通过它与数据库通信
ⅡCommand对象
表示对数据库的查询对存储过程的调用或要返回特定表内容的直接请求可使用Command对象对数据库执行任何一种查询操作
ⅢDataReader对象
DataReder用于以最快的数据检索并检查查询所返回的行可使用DataReader对象来检查查询结果一次查询一行当移到下一行时前一行的内容就会被放弃DataReader不支持更新操作由DataReader返回的数据是只读的由于DataReader对象支持最小特性集所以它的速度非常快而且是轻量的
ⅣTransaction对象
Connection对象有一个BeginTransaction方法可用来创建Transaction对象该对象可用来在 Transaction对象的生存期提交或取消对数据库所做的更改
ⅤParameter对象
要使用参数化的Command对象可先为查询中的每个参数创建Parameter对象并将它们添加到Command对象的Paramters集合中ADONET的Parameter对象公开一些属性和方法可用来定义参数的数据类型和值
ⅥDataAdapter对象
DataAdapter对象充当数据库和ADONET对象模型中断开连接的对象之间的桥梁DataAdapter对象会填充DataSet对象中的表而且能读取缓存的更改并将其提交给数据库
断开连接的对象
ⅠDataTable对象
DataTable对象允许您通过行和列的集合查看数据通过DataAdapter对象的Fill方法可以将查询的结果存储在DataTable中一旦从数据库中读出了数据将其存储在DataTable对象中数据与服务器之间的连接就断开拉
DataTable类包含了其他断开连接对象的集合例如DataRowDataColumnConstraints等
ⅡDataColumn对象
每个DataTable都有一个Columns集合该集合是DataColumn对象的容器DataColumn对象存储了有关列结构的信息
ⅢConstraint对象
Constraint对象存在于DataTable对象的Constraints集合中可以建立一个Constraint对象确保某一列或多个列中的值在DataTable中是惟一的
ⅣDataRow对象
想要访问存储在DataTable对象中的实际值可以使用对象的Rows集合该集合中包含了一组DataRow对象DataTable通过DataRows的集合使得所有数据行都可以访问DataRow对象也是更新的起点
ⅤDataSet对象
可以将DataSet对象视为一些DataTable对象的容器DataSet对象还有一些属性可以向文件内存地址写入或读出该对象可以只保存DataSet对象的内容或只保存DataSet对象的结构也可以两者都保存
ⅥDataRelation对象
DataSet类定义了一个Realtion属性该属性是DataRelation对象的一个集合可以使用DataRelation对象来表明DataSet中不同的DataTable对象之间的关系
DataRelation对象还引入了一些属性来强化引用的完整性
ⅦDataView对象
一旦获取了DataTable对象中查询的结果就可以使用DataView对象以不同方式来查看数据可以使用多个DataView对象在同时查看同一DataTable
强类型DataSet对象
强类型的DataSet可以帮助简化建立数据访问应用程序的过程强类型DataSet是Visual Studio中的一个类Visual Studio建立它的时候通过其属性使所有的表和列信息都有效强类型DataSet对象还为入创建新行等属性提供了一些自定义方法
Connection对象
一特点介绍
在ADONET对象模型中Connection对象代表了与数据库之间的连接可以使用Connection对象的属性来指定用户凭据以及数据源的位置
二使用介绍
基本使用
string strConn=data source =initial catalog =Northwindpersist security info=false user id=sapassword=
SqlConnection cn = new SqlConnection(strConn)
cnOpen()
……………
cnClose()
连接池
默认情况下使用连接池
当不想使用时在Ole DB连接字符串中加入OLE DB Service=
在Sql连接字符串中加入Pooling=false
与其他对象关系
Ⅰ创建Commands
string strConn=………
SqlConnection cn=new SqlConnection(strConn)
cnOpen()
SqlCommand cmd = cnCreateCommand()
Ⅱ启动事务
string strConn=………
SqlConnection cn=new SqlConnection(strConn)
cnOpen()
SqlTransaction txn = cnBeginTransaction()
三属性方法事件介绍
属性
⒈ConnectionString 连接字符串其中包含源数据库名称和建立初始连接所需的其他参数默认值为空字符串只能在Connection未与数据源连接时设置其属性当连接到数据源时属性是只读的
⒉ConnectionTimeOut 等待连接打开的时间(以秒为单位)默认值为 秒
⒊Database当前数据库的名称或连接打开后要使用的数据库的名称默认值为空字符串
⒋DataSource要连接的 SQL Server 实例的名称默认值为空字符串
⒌StateConnectionState值的按位组合默认值为Closed
成员名称说明值
Broken与数据源的连接中断只有在连接打开之后才可能发生这种情况可以关闭处于这种状态的连接然后重新打开
Closed连接处于关闭状态
Connecting连接对象正在与数据源连接
Executing连接对象正在执行命令
Fetching连接对象正在检索数据
Open连接处于打开状态
⒍ServerVersionSQL Server 实例的版本版本的格式为 ########其中前两位是主版本中间两位是次版本最后四位是发布版本该字符串的格式为 majorminorbuild其中 major 和 minor 必须为两位数build 必须为四位数
⒎PacketSize 网络数据包的大小(以字节为单位)默认值为 如果应用程序执行批量复制操作或者发送或接收大量的文本或图像数据则使用比默认大小大的数据包可提高效率因为它可减少网络的读取和写入操作如果应用程序发送或接收少量信息则可以将数据包大小设置为 字节该设置足以应付大多数数据传送操作对于大多数应用程序而言最好使用默认的数据包大小
PacketSize 可以是 和 字节范围内的一个值如果该值超出了这个范围就会产生异常
方法
⒈BeginTransaction开始数据事务
⒉ChangeDatabase在一个打开的连接上更改当前数据库
⒊Close关闭连接
⒋CreateCommand为当前连接创建一个SqlCommand
⒌Open打开连接
事件
⒈InfoMessage当 SQL Server 返回一个警告或信息性消息时发生
当 Sql Server 返回严重度等于或小于 的消息时会激发 InfoMessage 事件严重度在 和 之间的消息会引发错误而严重度超过 的消息将导致连接关闭
⒉StateChange当连接状态更改时发生只要Connection对象的State属性值发生变化该对象的StateChange事件就会被触发
SqlDataAdapter对象
一特点介绍
表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接
在SqlDataAdapter和DataSet之间没有直接连接当完成SqlDataAdpaterFill(DataSet)调用后两个对象之间就没有连接了
二使用介绍
创建SqlDataAdapter
……
string strSQL=Select * from Customers
SqlCommand cmd=new SqlCommand(strSQLcn)
SqlDataAdapter da=new SqlDataAdapter()
daSelectCommand=cmd
SqlDataAdapter构造函数
①string strConn=Provider=……
string strSQL=select * from Customers
SqlDataAdapter da=new SqlDataAdapter(strSQLstrConn)
②string strConn=Provider=……
SqlConnection cn=new SqlConnection(strConn)
SqlDataAdapter da=new SqlDataAdapter(select * from Customerscn)
③string strConn=Provider=……
string strSQL=select * from Customers
SqlConnection cn=new SqlConnection(strConn)
SqlCommand cmd=new SqlCommand(strSQLcn)
SqlDataAdapter da=new SqlDataAdapter(cmd)
从查询中获取结果
①使用Fill方法
……
SqlDataAdapter da=new SqlDataAdapter(strSQLstrConn)
DataSet ds=new DataSet()
daFill(ds) //这里ds中的表名为Table
②使用Fill方法创建DataTable对象和DataColumn对象
……
SqlDataAdapter da=new SqlDataAdapter(strSQLstrConn)
daTableMappingAdd(TableCustomers)
DataSet ds=new DataSet()
daFill(ds)
③使用重载Fill方法
SqlDataAdapterFill(DataSetCustomers)
SqlDataAdapterFill(DataTable)
SqlDataAdapterFill(DataSetintStartRecordintNumRecordsTableName)
④开放和关闭连接
如果调用了一个SqlDataAdapter对象的Fill方法而SelectCommand属性的Connection关闭了那么SqlDataAdapter就会开放一个连接然后提交查询获取结果最后关闭连接如果在调用前开放了Connection那么操作之后仍然保持开放
……
SqlDataAdapter daCustomersdaOrders
daCustomers=new SqlDataAdapter(Select * from Customerscn)
daOrders=new SqlDataAdapter(Select * from Orderscn)
DataSet ds=new DataSet()
cnOpen()
daCustomersFill(ds)
daOrdersFill(ds)
cnClose()
⑤多次调用Fill方法
刷新DataSet中的数据最简单的解决方法就是清空DataSet(或DataTable)然后再次调用DataAdapter对象的Fill方法
三属性方法事件介绍
属性
①AcceptChangeDuringFill确定由DataAdapter所获取的行的RowState(默认为True)
②DeleteCommand获取或设置一个 TransactSQL 语句或存储过程以从数据集删除记录
③InsertCommand获取或设置一个 TransactSQL 语句或存储过程以在数据源中插入新记录
④SelectCommand获取或设置一个 TransactSQL 语句或存储过程用于在数据源中选择记录
⑤UpdateCommand获取或设置一个 TransactSQL 语句或存储过程用于更新数据源中的记录
⑥TableMappingsSqlDataAdapter用来将查询的结果映射到DataSet的信息集合
⑦ContinueUpdate控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)
方法
①Fill执行存储于SelectCommand中的查询并将结果存储在DataTable中
②FillSchema为存储在SelectCommand中存储的查询获取架构信息获取查询中的各列名称和数据类型
③GetFillParameters为SelectCommand获取一个包含着参数的数组
④Update向数据库提交存储在DataSet(或DataTableDataRows)中的更改该方法会返回一个整数值其中包含着在数据存储中成功更新的行数
事件
①FillError当DataAdapter遇到填充DataSet或DataTable的一个错误时该事件被触发
②RowUpdated向数据库提交一个修改的行之后被触发
③RowUpdating向数据库提交一个修改的行之前被触发
DataSet对象
一特点介绍
处理脱机数据在多层应用程序中很有用
可以在任何时候查看DataSet中任意行的内容允许修改查询结果的方法
处理分级数据
缓存更改
XML的完整性DataSet对象和XML文档几乎是可互换的
二使用介绍
创建DataSet对象DataSet ds = new DataSet(DataSetName)
查看调用SqlDataAdapterFill创建的结构
daFill(dsOrders)
DataTable tbl = dsTable[]
foreach(DataColumn col in tblColumns)
ConsoleWriteLine(colColumnName)
查看SqlDataAdapter返回的数据
①DataRow对象
DataTable tbl = dsTable[]
DataRow row = tblRow[]
ConsoleWriteLine(ros[OrderID])
②检查存储在DataRow中的数据
DataTable tbl = rowTable
foreach(DataColumn col in tblColumns)
ConsoleWriteLine(row[col])
③检查DatTable中的DataRow对象
foreach(DataRow row in tblRows)
DisplayRow(row)
校验DataSet中的数据
①校验DataColumn的属性ReadOnlyAllowDBNullMaxLengthUnique
②DataTable对象的Constrains集合UiqueConstraintsPrimarykeyForeignkeyConstraints
通常不必刻意去创建ForeignkeyConstraints因为当在DataSet的两个DataTable对象之间创建关系时会创建一个
③用SqlDataAdapterFill模式来检索模式信息
编写代码创建DataTable对象
①创建DataTable对象DataTable tbl = new DataTable(TableName)
②将DataTable添加到DataSet对象的Table集合
DataSet ds = new DataSet()
DataTable tbl = new DataTable(Customers)
dsTablesAdd(tbl)
DataSet ds = new DataSet()
DataTable tbl = dsTablesAdd(Customers)
DataTable对象只能存在于至多一个DataSet对象中如果希望将DataTable添加到多个DataSet中就必须使用Copy方法或Clone方法Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTableClone方法创建一个与原DataTable结构相同但没有包含任何行的新DataTable
③为DataTable添加列
DataTable tbl = dsTablesAdd(Orders)
DataColumn col =tblColumnsAdd(OrderIDtypeof(int))
colAllowDBNull = false
colMaxLength =
colUnique = true
tblPrimaryKey = new DataColumn[]{tblColumns[CustomersID]}
当设置主键时AllowDBNull自动设置为False
④处理自动增量列
DataSet ds = new DataSet()
DataTable tbl = dsTablesAdd(Orders)
DataColumn col = tblColumnsAdd(OrderIDtypeof(int))
colAutoIncrement = true
colAutoIncrementSeed =
colAutoIncrementStep =
colReadOnly = true
⑤添加基于表达式的列
tblColumnsAdd(ItemTotaltypeof(Decimal)Quantity*UnitPrice)
修改DataTable内容
①添加新DataRow
DataRow row = dsTables[Customers]NewRow()
row[CustomerID] = ALFKI
dsTables[Customers]RowsAdd(row)
object[] aValues ={ALFKIAlfredsAnders}
daTables[Customers]LoadDataRow(aValuesfalse)
②修改当前行
修改行的内容逼供内不会自动修改数据库中相应的内容对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改
DataRow rowCustomer
rowCustomer = dsTables[Custoemrs]RowsFind(ANTON)
if(rowCustomer == null)
//没有查找客户
else
{
rowCustomer[CompanyName] =NewCompanyName
rowCustomer[ContactName] =NewContactName
}
//推荐使用这种方式
DataRow rowCustomer
rowCustomer = dsTables[Custoemrs]RowsFind(ANTON)
if(rowCustomer == null)
//没有查找客户
else
{
rowCustomerBeginEdit()
rowCustomer[CompanyName] =NewCompanyName
rowCustomer[ContactName] =NewContactName
rowCustomerEndEdit()
}
//null表示不修改该列的数据
obejct[] aCustomer ={nullNewCompanyNameNewContactNamenull}
DataRow rowCustomer
rowCustomer = dsTables[Customers]RowsFind(ALFKI)
rowCustomerItemArray = aCustomer
③处理DataRow的空值
//查看是否为空
DataRow rowCustomer
rowCustomer = dsTables[Customers]RowsFind(ALFKI)
if(rowCustomerIsNull(Phone))
ConsoleWriteLine(Its Null)
else
ConsoleWriteLine(Its not Null)
//赋予空值
rowCustomer[Phone] = DBNullValue
④删除DataRow
DataRow rowCustomer
rowCustomer = dsTables[Customers]RowsFind(ALFKI)
rowCustomerDelete()
⑤清除DataRow
DataRow rowCustomer = dsTables[Customers]RowsFind(ALFKI)
rowCustomerItemArray = aCustomer
daTables[Customers]Remove(rowCustomer)
或者
dsTables[Customers]RemoveAt(intIndex)
⑥使用DataRowRowState属性 UnchangedDetachedAddedModifiedDeleted
private void DemonstrateRowState()
{ // Run a function to create a DataTable with one column DataTable myTable = MakeTable()DataRow myRow
// Create a new DataRow myRow = myTableNewRow()// Detached row ConsoleWriteLine(New Row + myRowRowState)
myTableRowsAdd(myRow)// New row ConsoleWriteLine(AddRow + myRowRowState)
myTableAcceptChanges()// Unchanged row ConsoleWriteLine(AcceptChanges + myRowRowState)
myRow[FirstName] = Scott// Modified row ConsoleWriteLine(Modified + myRowRowState)
myRowDelete()// Deleted row ConsoleWriteLine(Deleted + myRowRowState)}
⑦检查DataRow中的挂起更改
DataRow rowCustomer
rowCustomer = dsTables[Customers]RowsFind(ALFKI)
rowCustomer[CompanyName] = NewCompanyName
string strNewCompanyNamestrOldCompanyName
ConsoleWriteLine(rowCustomer[CompanyNameDataRowVersionCurrent])
ConsoleWriteLine(rowCustomer[CompanyNameDataRowVersionOriginal])
三属性方法事件介绍
DataSet
①属性
CaseSensitive用于控制DataTable中的字符串比较是否区分大小写
DataSetName当前DataSet的名称如果不指定则该属性值设置为NewDataSet如果将DataSet内容写入XML文件DataSetName是XML文件的根节点名称
DesignMode如果在设计时使用组件中的DataSetDesignMode返回True否则返回False
HasErrors表示DataSet中的DataRow对象是否包含错误如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError属性设置为True则在提交更改后必须检查DataSet的HasErrors属性以确定是否有更新失败
NameSpace和Prefix指定XML命名空间和前缀
Relations返回一个DataRelationCollection对象
Tables检查现有的DataTable对象通过索引访问DataTable有更好的性能
②方法
AcceptChanges和RejectChanges接受或放弃DataSet中所有挂起更改调用AcceptChanges时RowState属性值为Added或Modified的所有行的RowState属性都将被设置为UnChanged任何标记为Deleted的DataRow对象将从DataSet中删除调用RejectChanges时任何标记为Added的DataRow对象将会被从DataSet中删除其他修改过的DatRow对象将返回前一状态
Clear清除DataSet中所有DataRow对象该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快
Clone和Copy使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet使用Clone方法会创建具有相同结构的新DataSet但不包含任何行
GetChanges返回与原DataSet对象具有相同结构的新DataSet并且还包含原DataSet中所有挂起更改的行
GetXml和GetXmlSchema使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串如果只希望返回架构信息可以使用GetXmlSchema
HasChange表示DataSet中是否包含挂起更改的DataRow对象
Merge从另一个DataSetDataTable或现有DataSet中的一组DataRow对象载入数据
ReadXml和WriteXml使用ReadXml方法从文件TextReader数据流或者XmlReader中将XML数据载入DataSet中
Reset将DataSet返回为未初始化状态如果想放弃现有DataSet并且开始处理新的DataSet使用Reset方法比创建一个DataSet的新实例好
③事件
MergeFailed在DataSet的Merge方法发生一个异常时触发
DataTable
①属性
②方法
③事件
ColumnChanged在列的内容被改变之后触发
ColumnChangding在列的内容被改变之前触发
RowChangedRowChangingRowDeletedRowDeleting
DataColumn
①属性
DataRow
①属性
HasError确定行是否包含错误
Item通过指定行的列数列的名称或DataColumn对象本身访问列的内容
ItemArray获取或设置行中所有列的值
RowError返回一个包含行错误信息的字符串
RowState返回DataRowState枚举中的值来表示行的当前状态
Table返回DataRow对象所在的DataTable
②方法
AcceptChanges和RejectChanges提交和放弃挂起更改
BeginEditCancelEditEndEdit
ClearErrors清除DataRow中所有的错误
DeleteDelete方法实际上并不从DataRow表的Row集合中删除该DataRow当调用DataRow对象的Delete方法时ADONET将该行标记为删除之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行
如果希望彻底删除DataRow可以调用Delete方法接着再调用它的AccepteChanges方法还可以使用DataRowCollection对象的Remove方法完成相同的任务