数据库-与数据库连接
与数据库连接
一. 引入必要的名字空间
二. 使用Connection对象
1 创建Connection对象
2 连接字符串
2.1 三种最常用的OLEDB提供程序(Access,SQL SERVER, Oracle)所用的连接字符串
2.1.1 SQL SERVER OLEDB提供程序
2.1.2 Oracle OLEDB提供程序
2.1.3 Access OLEDB提供程序
2.1.4 ODBC Drivers的OLEDB的提供程序
2.2 使用[数据连接属性]对话框在代码中建立连接字符串
2.2.1 在VS.NET中使用[数据链接属性]对话框,首先必须有一个对数据链接库的引用.
2.2.2 用代码来加载[数据链接属性]对话框,并获取用户输入的连接字符串
2.3 手动建立连接字符串-通过udl文件
2.4 在连接字符串中使用数据链接文件
2.4.1 在连接字符串中动态引用一个数据链接文件.
3 开放和关闭连接
3.1 调用Open方法打开连接
3.2 使用Connection对象的Close方法可以关闭连接
4 连接池
4.1 何为连接池?
4.2 如何打开连接池?
4.3 不使用连接池
4.3.1 关闭连接池
4.3.2 识别:连接——真正关闭了Or仅仅被放入池中
4.4 销毁连接
5 使用连接对象(Connection)创建其他对象
5.1 创建Command
5.2 启动事务
一. 引入必要的名字空间
l VBNET代码
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
l C#代码
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
二. 使用Connection对象
l 使用Connection对象的属性指定数据源的位置
l 用Connection对象控制与数据源连接或断开连接
l 将Connection对象作为创建Command和Transaction对象的起始点
1 创建Connection对象
Dim cn as OleDbConnection
cn=new OleDbConneciton()
你可以在什么变量的同时进行初始化,如下
Dim cn as new OleDbConnection()
2 连接字符串
Connection对象的ConnectionString属性需要一个连接字符串
连接字符串包含一系列名称/值对,并用分号进行隔离,格式如下:
strConn=”Setting1=Value1;Setting2=Value;...”
2.1 三种最常用的OLEDB提供程序(Access,SQL SERVER, Oracle)所用的连接字符串
2.1.1 SQL SERVER OLEDB提供程序
Provider=SQLOLEDB.1; Data Source=<Server>;Initial Catalog=<DataBase>;Use ID=<>;Password=<>
2.1.2 Oracle OLEDB提供程序
Provider=MSDAORA; Data Source=<>;UID=<>;PWD=<>
2.1.3 Access OLEDB提供程序
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=<>
2.1.4 ODBC Drivers的OLEDB的提供程序
ODBC提供程序经常通过其代码名称Kagera被引用.
Kagera通过将OLEDB API调用转换为ODBC API调用来实现,OLEDB .NET数据提供者与该OLEDB提供者进行会话,然后再去ODBC驱动程序进行会话.听起来就很复杂,维持提供了ODBC.NET数据提供程序.
2.2 使用[数据连接属性]对话框在代码中建立连接字符串
2.2.1 在VS.NET中使用[数据链接属性]对话框,首先必须有一个对数据链接库的引用.
具体作法是:在打开的”解决方案”中,”添加引用”,在”COM” 选项卡,选择”Microsoft ActiveX Data Object 2.7 Library”的引用和”Microsoft OLE DB Service Component 1.0 Type Library”的引用,并添加.
2.2.2 用代码来加载[数据链接属性]对话框,并获取用户输入的连接字符串
Dim objDataLink as New MSDASC.DataLink()
Dim cn As New ADODB.Connection()
objDataLink.PromptEdit(cn)
Console.WriteLine(cn.ConnectionString)
2.3 手动建立连接字符串-通过udl文件
你只需要一个扩展名.udl的文件即可
2.4 在连接字符串中使用数据链接文件
2.4.1 在连接字符串中动态引用一个数据链接文件.
这需要在连接字符串中使用如下的一个名称/值对:
File Name=MyDataLink.udl;
如果不指定文件绝对路径,那么OLEDB.NET数据提供程序会在引用程序的当前路径中查找.
你也可以使用相对的路径
3 开放和关闭连接
拥有了有效的连接字符串的OleDbConnection对象后,就是打开连接以及与数据存储进行通讯.
3.1 调用Open方法打开连接
Dim strConn as String=”Provider=SQLOLEDB;”&_
“Data Source=(local)"NetSdk;”&_
“Initial Catalog=Northwind;”&_
“Trusted_Connection=Yes;”
Dim cn As New OleDbConnection(strConn)
cn.Open()
3.2 使用Connection对象的Close方法可以关闭连接
cn.Close()
注意:如果使用了连接池,那么关闭Connection对象,不会关闭与数据源的实际连接.
4 连接池
打开和关闭数据库连接的代价是非常高昂的.
使用连接池能帮助应用程序提高性能.
4.1 何为连接池?
假设一个多层应用程序中,只要有一个客户端总是跟中间层通讯,那么服务器就需要不停的创建一个与数据库连接并查询的业务对象,通常,业务对象在清除代码中会关闭连接,这个代价就很高昂了
如果使用连接池会怎样?新的业务对象会检查池中的连接,如果有打开的连接,业务对象会使用它.
ADO.NET的连接池很简单,每个包含在ADO.NET中的.NET数据提供程序都可以实现连接池
连接池中打开的连接在特定时间(默认60秒)未被再次使用,就会关闭此连接
4.2 如何打开连接池?
连接池默认就是打开的.因此在调用Close方法时,连接实际上并未关闭,而是被传递到池中等待重用.
Dim strConn as String=”Provider=SQLOLEDB;”&_
“Data Source=(local)"NetSdk;”&_
“Initial Catalog=Northwind;”&_
“Trusted_Connection=Yes;”
Dim cn As New OleDbConnection(strConn)
Dim i as Integer
For i=0 to 5
cn.Open()
cn.Close()
Next
连接池是在一个独立线程上进行处理的.这样做的结果就是代码可能会创建另外一个与数据库的连接.
上面的代码,,Open()之后连接池例程可能还未完成将数据库连接存储到池中的操作,因此可以在Close()后面添加代码行,用来挂起当前线程,让其他线程执行: System.Threading.Thread.Sleep(0)
4.3 不使用连接池
4.3.1 关闭连接池
调用OleDbConnection类的ReleaseConnectionPool方法
这个方法与Collect方法联合起来,应用于全局垃圾收集对象上,从而达到真正关闭与数据库的物理连接的目的
还有一个更好的方法,就是将属性(OLE DB Services=-4)添加到你的OLE DB连接字符串中
使用有上述属性的连接字符串,OLE DB.NET数据提供程序会为连接做标记,这样的连接不会加入连接池,如此一来,OLEDBConnection对象的Close方法就能真正关闭连接
对于SQLConnection对象来说,需要添加的属性是(Pooling=False)
4.3.2 识别:连接——真正关闭了Or仅仅被放入池中
检查连接到SQL SERVER的连接数目,比如用:
l SQL时间探查器, 观察连接到数据库的连接数目
l 性能监视器, 观察连接到数据库的连接数目
l 企业管理器,检查重复调用系统存储过程的结果
4.4 销毁连接
调用ADONET对象模型中各个类的Dispose方法(这是个公开方法).
调用此方法可使对象在进行垃圾收集之前释放其资源
如果不显示调用Dispose,对象仅在公共语言运行库的垃圾收集程序发出指令时才释放资源
注意:通过让对象溢出或者将对象变量设置为Nothing,不会关闭与数据源的连接.
通常,如果一个对象公开了Dispose方法,那么想要是否对象的资源时,就要调用这个Dispose方法.
5 使用连接对象(Connection)创建其他对象
可以用Connection对象创建的其他对象有:Command对象以及Transaction对象等.
这种方式可以简化一些代码.
5.1 创建Command
Command对象是用来查询数据的
执行查询之前,需要为Command对象的Connection属性设置一个Connection对象.
Connection对象提供的CreateCommand方法简化了此过程,它返回一个Command对象(已经初始化了Connection属性的)
Dim strConn as String=”Provider=SQLOLEDB;”&_
“Data Source=(local)"NetSdk;”&_
“Initial Catalog=Northwind;”&_
“Trusted_Connection=Yes;”
Dim cn As New OleDbConnection(strConn)
cn.Open()
Dim cmd As New OleDbCommand()’等价代码: Dim cmd as OleDbCommand=cn.CreateCommand()
Cmd.Connection=cn
用With块简化使用一次性Command对象的过程:
With cn.CreateCommand()
.CommandText=”Create TABLe MyTable…”
.ExcuteNonQuery()
.Dispose()
End With
5.2 启动事务
用Connection对象来启动事务(创建事务对象)
Connection对象提供的BeginTransaction方法会在连接时返回一个新的打开的Transaction对象.
Dim strConn as String=”Provider=SQLOLEDB;”&_
“Data Source=(local)"NetSdk;”&_
“Initial Catalog=Northwind;”&_
“Trusted_Connection=Yes;”
Dim cn As New OleDbConnection(strConn)
cn.Open()
Dim txn As New OleDbTransaction()’等价代码:Dim txn As OleDbTransaction=cn.BeginTransaction()
txn.Connection=cn
txn.begin
5.3 获取数据库架构信息
通过调用OleDbConnection对象的GetOleDbSchemaTable方法可以获取有关数据库的架构信息.
另外提供给该方法一个OleDbSchemaGuid枚举类型的值,可以指定所需的架构信息类型,如:表/列或过程
该方法的另外一个参数Restrictions,用于过滤返回的信息.例如仅取回特定表中的列信息
Dim strConn as String=”Provider=SQLOLEDB;”&_
“Data Source=(local)"NetSdk;”&_
“Initial Catalog=Northwind;”&_
“Trusted_Connection=Yes;”
Dim cn As New OleDbConnection(strConn)
cn.Open()
Dim tbl as DataTable
tbl=cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,Nothing)
使用Restrictions参数(结构{“TABLE_CATALOG”,”TABLE_SCHEMA”,”TABLE_NAME”,”COLUMN_NAME”}),代码如下:
<打开连接过程省略>
Dim objRestrictions as Object()
objRestrictions=New Object(){Nothing,Nothing,”Customers”,Nothing}
Dim tbl as DataTable=cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,objRestrictions)
该方法返回的是一个DataTable对象,其中包含了架构信息.可以使用循环来取得架构信息
…
Tbl=cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,strRestrictions)
For each row in tbl.Rows
Console.WriteLine(vbTab & row(“COLUMN_NAME”).ToString()
Next row
另外,GetOleDbSchemaTable方法依赖于OleDbConnection所使用的Ole DB提供程序的功能.