C#数据库连接

2009年3月22日星期日

C#数据库连接

在 ADO.NET 中,可以使用 Connection 对象来连接到指定的数据源。若要连接到 Microsoft SQL Server 版本 7.0 或更高版本,请使用 SQL Server .NET 数据提供程序的 SqlConnection 对象。若要使用用于 SQL Server 的 OLE DB 提供程序 (SQLOLEDB) 连接到 OLE DB 数据源或者连接到 Microsoft SQL Server 版本 6.x 或较早版本,请使用 OLE DB .NET 数据提供程序的 OleDbConnection 对象。

本节内容
使用 ADO.NET 连接到 SQL Server:描述如何使用 SqlConnection 连接到 SQL Server 数据库。
SQL Server .NET 数据提供程序的连接池管理:描述 SQL Server .NET 数据提供程序如何管理数据库连接池,并说明如何控制连接池行为。
使用 ADO.NET 连接到 OLE DB 数据源:描述如何使用 OleDbConnection 连接到 OLE DB 数据源。
OLE DB .NET 数据提供程序的连接池管理:描述 OLE DB .NET 数据提供程序如何管理数据库连接池,并说明如何控制连接池行为。
使用连接事件:描述如何使用 InfoMessage 事件从数据源中检索信息性消息。
 

使用 ADO.NET 连接到 SQL Server

SQL Server .NET 数据提供程序使用 SqlConnection 对象提供了与 Microsoft SQL Server 版本 7.0 或更高版本的连接。

SQL Server .NET 数据提供程序支持类似于 OLE DB (ADO) 连接字符串格式的连接字符串格式。有关有效的字符串格式名称和值,请参阅 SqlConnection.ConnectionString 属性 。

获取或设置用于打开 SQL Server 数据库的字符串。
[Visual Basic]
Public Property ConnectionString As String Implements IDbConnection.ConnectionString[C#]
public String ConnectionString {get; set;}[C++]
public: __property String* get_ConnectionString();
public: __property void set_ConnectionString(String*);[JScript]
public function get ConnectionString() : String;
public function set ConnectionString(String);属性值
连接字符串,其中包含源数据库名称和建立初始连接所需的其他参数。默认值为空字符串。

实现
IDbConnection.ConnectionString

异常
异常类型 条件
ArgumentException 提供了无效的连接字符串参数或未提供所需的连接字符串参数。

备注
ConnectionString 类似于 OLE DB 连接字符串,但并不相同。与 OLE DB 或 ADO 不同,如果“持续安全信息”值设置为 false(默认),则返回的连接字符串与用户设置的 ConnectionString 相同但去除了安全信息。除非将“持续安全信息”设置为 true,否则 SQL Server .NET 数据提供程序不持续或返回连接字符串中的密码。

只有在连接关闭时才能设置 ConnectionString 属性。许多连接字符串值都具有相应的只读属性。当设置连接字符串时,将更新所有这些属性(除非检测到错误)。检测到错误时,不会更新任何属性。SqlConnection 属性只返回那些包含在 ConnectionString 中的设置。

若要连接到本地机器,请将服务器指定为“(local)”。(必须始终指定一个服务器。)

重置已关闭连接上的 ConnectionString 会重置包括密码在内的所有连接字符串值(和相关属性)。例如,如果设置一个包括“Database= northwind”的连接字符串,然后将该连接字符串重置为“Data Source=myserver;Integrated Security=SSPI”,则 Database 属性将不再设置为 Northwind。

在设置后会立即分析连接字符串。如果在分析时发现语法中有错误,则产生运行库异常,如 ArgumentException。只有当试图“打开”(Open) 该连接时,才会发现其他错误。

值可以用单引号或双引号分隔(例如,name='value' 或 name="value")。通过使用另一种分隔符,可以在连接字符串中使用单引号或双引号。例如,name="value's" 或 name= 'value"s',但不能这样:name= 'value's' 或 name= ""value""。将忽略所有空白字符,但放入值或引号内的空白字符除外。关键字值对必须用分号 (;) 隔开。如果分号是值的一部分,也必须用引号将其分隔。不支持任何转义序列。与值类型无关。名称不区分大小写。

如果给定的名称在连接字符串中多次出现,将使用与最后一次出现相关联的值。

下表为 ConnectionString 内的值列出了有效的名称。

注意 若要查看列出特定于连接池的值的表,请参阅主题 SQL Server .NET 数据提供程序的连接池 。
名称 默认值 说明
应用程序名称 应用程序的名称,或者“.Net SqlClient Data Provider”(如果不提供应用程序名称)。
AttachDBFilename-或-扩展属性-或-初始文件名 可连接数据库的主文件的名称,包括完整的路径名。
必须使用关键字“database”来指定数据库的名称。

连接超时设定-或-连接超时 15 在终止尝试并产生错误之前,等待与服务器的连接的时间长度(以秒为单位)。
连接生存期 0 当连接被返回到池时,将其创建时间与当前时间作比较,如果时间长度(以秒为单位)超出了连接生存期指定的值,该连接就会被销毁。在群集配置中很有用,可在正在运行的服务器和刚刚进入联机状态的服务器之间强制执行负载平衡。
连接重置 'true' 确定当数据库连接从池中移除时是否重置。设置为“false”可避免在获取连接时执行其他服务器往返过程,但程序员必须意识到此时并不重置连接状态。
当前语言 SQL Server 语言记录名称。
数据源-或-服务器-或-地址-或-Addr-或-网络地址 要连接的 SQL Server 实例的名称或网络地址。
登记 'true' 为“true”时,池程序在创建线程的当前事务上下文中自动登记连接。
初始目录-或-数据库 数据库的名称。
集成安全性-或-Trusted_Connection 'false' 该连接是否为安全的连接。
可识别的值有“true”、“false”和“sspi”,后者等效于“true”。

最大池大小 100 池中允许的最大连接数。
最小池大小 0 池中允许的最小连接数。
网络库-或-网络 'dbmssocn' 用于建立与 SQL Server 实例的连接的网络库。支持的值包括 dbnmpntw(命名管道)、dbmsrpcn(多协议)、dbmsadsn (Apple Talk)、dbmsgnet (VIA)、dbmsipcn(共享内存)和 dbmsspxn (IPX/SPX) 和 dbmssocn (TCP/IP)。
相应的网络 DLL必须安装在要连接的系统上。如果不指定网络而使用一个本地服务器(比如“.”或“(local)”),则使用共享内存。

数据包大小 8192 用来与 SQL Server 的实例进行通讯的网络数据包的大小,以字节为单位。
密码-或-Pwd SQL Server 帐户登录的密码。
持续安全信息 'false' 当设置为“false”时,如果连接是打开的或者一直处于打开 State,那么安全敏感的信息(如密码)就不会作为连接的一部分返回。重置连接字符串将重置包括密码在内的所有连接字符串值。
池 'true' 为“true”时,就从适当的池提取 SQLConnection 对象,或在必要时向适当的池创建并添加 SQLConnection 对象。
用户 ID SQL Server 登录帐户。
工作站 ID 本地计算机名称 连接到 SQL Server 的工作站的名称。

当设置布尔型属性时,可以使用“yes”来替代“true”,使用“no”来替代“false”。整数值表示为字符串。

注意 SQL Server .NET 数据提供程序使用其自身的协议与 SQL Server 通信。因此,当连接到 SQL Server 时,它不支持 ODBC 数据源名称 (DSN) 的使用,因为它不添加 ODBC 层。
警告 在此版本中,在应用程序中根据用户输入构造连接字符串时(例如,从对话框中检索用户 ID 和密码信息并将其追加到连接字符串时)应相当谨慎。应用程序应确保用户无法在这些值中嵌入额外的连接字符串参数(例如,输入“validpassword;database=somedb”作为密码,以试图连接到其他数据库)。
示例
[Visual Basic, C#] 下面的示例创建一个 SqlConnection 并设置它的一些属性。

[Visual Basic]
Public Sub CreateSqlConnection()
Dim myConnection As New SqlConnection()
myConnection.ConnectionString = "user id=sa;password=aU98rrx2;initial catalog
=northwind;data source=mySQLServer;Connect Timeout=30"
myConnection.Open()
End Sub 'CreateSqlConnection[C#]
public void CreateSqlConnection()
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = "user id=sa;password=aU98rrx2;initial catalog
=northwind;data source=mySQLServer;Connect Timeout=30";
myConnection.Open();
}[C++, JScript] 没有可用于 C++ 或 JScript 的示例。若要查看 Visual Basic 或 C# 示例,请单击页左上角的语言筛选器按钮。

要求
平台: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows .NET Server family



以下代码示例演示如何创建和打开与 SQL Server(版本 7.0 或更高版本)数据库的连接。

[Visual Basic]
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" & _
"Initial Catalog=northwind")
nwindConn.Open()[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost; Integrated Security=SSPI;" +
"Initial Catalog=northwind");
nwindConn.Open();关闭连接
每次使用完 Connection 后都必须将其关闭。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。当 Connection 对象处于范围之外或者已通过垃圾回收得到回收时,连接不会隐式释放。

SQL Server .NET 数据提供程序的连接池管理

池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET 数据提供程序提供了自动为您的 ADO.NET 客户端应用程序管理连接池的功能。您也可以提供几个连接字符串修饰符来控制连接池行为(请参阅本主题后面部分的“使用连接字符串关键字控制连接池”)。

池的创建和分配
当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如果连接字符串不精确匹配现有池,则将创建一个新池。

在以下示例中,将创建三个新的 SqlConnection 对象,但只需要使用两个连接池来管理这些对象。请注意,第一个和第二个连接字符串的差异在于为 Initial Catalog 分配的值。

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// Pool A is created.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();
// Pool B is created because the connection Strings differ.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// The connection String matches pool A.连接池一旦创建,直到活动进程终止时才会被毁坏。非活动或空池的维护只需要最少的系统开销。

连接的添加
连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最大池大小。

当请求 SqlConnection 对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效链接。

如果已达到最大池大小且不存在可用的连接,则该请求将会排队。当连接被释放回池中时,对象池管理程序将重新分配连接,以满足这些请求。如果在可获取连接对象之前超时期限已过(由 Connect Timeout 连接字符串属性来决定),则将出错。

警告 每次使用完 Connection 后都必须将其关闭。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。未显式关闭的连接将不会添加或返回到池中。
连接的移除
如果连接生存期已过或者池管理程序检测到与服务器的连接已被断开,则对象池管理程序将从池中移除该连接。请注意,只有在尝试与服务器进行通讯后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。对象池管理程序会定期扫描连接池,以查找已被释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。

如果与已消失的服务器的连接还存在,那么即使对象池管理程序未检测到断开的连接并将其标记为无效,仍有可能将此连接从池中取出。当发生这种情况时,将生成异常。但是,为了将该连接释放回池中,仍必须将其关闭。

事务支持
连接是根据事务上下文来从池中取出并进行分配的。请求线程和所分配的连接的上下文必须匹配。因此,每个连接池实际上又分为不具有关联事务上下文的连接以及 N 个各自包含与一个特定事务上下文的连接的子部分。

当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。这样,您就可以在随后提交或中止分布式事务。

使用连接字符串关键字控制连接池
SQLConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。

下表描述了可用于调整连接池行为的 ConnectionString 值。

名称 默认值 说明
Connection Lifetime 0 当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。
如果值为零 (0),则将使池连接具有最大的超时期限。

Connection Reset 'true' 确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返行程,但必须注意的是连接状态(如数据库上下文)不会被重置。
Enlist 'true' 当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。
Max Pool Size 100 池中允许的最大连接数。
Min Pool Size 0 池中维护的最小连接数。
Pooling 'true' 当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。

连接池的性能计数器
SQL Server .NET 数据提供程序添加了几个性能计数器,它们将使您能够微调连接池特性,检测与失败的连接尝试相关的间歇性问题,并检测与对 SQL Server 的超时请求相关的问题。

下表列出了可以在“.NET CLR 数据”性能对象下的“性能监视器”中访问的连接池计数器。

计数器 说明
SqlClient:当前池连接和非池连接的数目 当前池连接或非池连接的数目。
SqlClient:当前池连接的数目 当前所有池中与特定进程关联的连接的数目。
SqlClient:当前连接池的数目 当前与特定进程关联的池的数目。
SqlClient:池连接数的峰值 自特定进程开始以来所有池中的连接数峰值。请注意:此计数器只有在与特定进程实例关联时才可用。_Global 实例始终返回 0。
SqlClient:失败连接的总数 打开连接的尝试因任何原因而失败的总次数。

使用 ADO.NET 连接到 OLE DB 数据源

OLE DB .NET 数据提供程序通过 OleDbConnection 对象提供了与使用 OLE DB 公开的数据源的连接以及与 Microsoft SQL Server 版本 6.x 或较早版本(通过用于 SQL Server 的 OLE DB 提供程序 (SQLOLEDB))的连接。

对于 OLE DB .NET 数据提供程序,连接字符串格式与 ADO 中使用的连接字符串格式基本相同,但存在以下例外:

Provider 关键字是必需关键字。
不支持 URL、Remote Provider 和 Remote Server 关键字。
有关 OLE DB 连接字符串的更多信息,请参阅位于 MSDN 库的“Platform SDK 文档”中的“创建连接字符串”。

注意 使用通用数据链接 (UDL) 文件可能会降低性能。可以使用 UDL 文件向 OLE DB .NET 数据提供程序提供 OLE DB 连接信息。但是,由于可以在任何 ADO.NET 客户端程序的外部修改 UDL 文件,所以每次连接打开时,都将分析包含对 UDL 文件的引用的连接字符串。这可能会降低性能;为了获得更高的性能,建议使用不包含 UDL 文件的静态连接字符串。
以下代码示例演示如何创建和打开与 OLE DB 数据源的连接。

[Visual Basic]
Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=SQLOLEDB;
Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")
nwindConn.Open()[C#]
OleDbConnection nwindConn = new OleDbConnection("Provider=SQLOLEDB;Data Source
=localhost;Integrated Security=SSPI;Initial Catalog=northwind");
nwindConn.Open();关闭连接
每次使用完 Connection 后都必须将其关闭。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。当 Connection 对象处于范围之外或者已通过垃圾回收得到回收时,连接不会隐式释放。

OLE DB .NET 数据提供程序的连接池管理

池连接可以显著提高应用程序的性能和可缩放性。OLE DB .NET 数据提供程序使用 OLE DB 会话池来自动管理连接池。连接字符串参数可用于启用或禁用包括池在内的 OLE DB 服务。例如,以下连接字符串将禁用 OLE DB 会话池和自动事务登记。

Provider=SQLOLEDB;OLE DB Services=-4;Data Source=localhost;Integrated Security=SSPI;有关 OLE DB 会话池或资源池以及如何通过重写 OLE DB 提供程序服务默认值来禁用池的更多信息,请参阅位于 http://msdn.microsoft.com/library 的 MSDN 库中的“OLE DB 编程参考”。

警告 每次使用完 Connection 后都必须将其关闭。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。未显式关闭的连接将不会添加或返回到池中。
使用连接事件

Connection 对象有两个事件,它们可用于从数据源中检索信息性消息或确定 Connection 的状态是否已被更改。下表列出了 Connection 对象的这些事件。

事件 说明
InfoMessage 当从数据源中返回信息性消息时发生。信息性消息是数据源中不会引发异常的消息。
StateChange 当 Connection 的状态出现更改时发生。

InfoMessage
可以使用 Connection 对象的 InfoMessage 事件从数据源中检索警告和信息性消息。从数据源中返回的错误会引发异常。但是,InfoMessage 事件可用于从数据源中获取不与错误关联的消息。对于 Microsoft SQL Server,任何严重度等于或小于 10 的消息都将被视为信息性消息,它们将使用 InfoMessage 事件来捕获。

InfoMessage 事件接收 InfoMessageEventArgs 对象,该对象在其 Errors 属性中包含来自数据源的消息的集合。您可以查询此集合中的 Error 对象,以获取错误号和消息文本以及错误的来源。SQL Server .NET 数据提供程序还包含有关数据库、存储过程和消息所来自的行号的详细信息。

以下代码示例显示如何为 InfoMessage 事件添加事件处理程序。

SqlClient
[Visual Basic]
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;")

AddHandler nwindConn.InfoMessage, New SqlInfoMessageEventHandler(AddressOf OnInfoMessage)


Private Shared Sub OnInfoMessage(sender As Object, args As SqlInfoMessageEventArgs)
Dim err As SqlError
For Each err In args.Errors
Console.WriteLine("The {0} has received a severity {1}, state {2} error number {3}\n" & _
"on line {4} of procedure {5} on server {6}:\n{7}", _
err.Source, err.Class, err.State, err.Number, err.LineNumber, _
err.Procedure, err.Server, err.Message)
Next
End Sub[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;");

nwindConn.InfoMessage += new SqlInfoMessageEventHandler(OnInfoMessage);


protected static void OnInfoMessage(object sender, SqlInfoMessageEventArgs args)
{
foreach (SqlError err in args.Errors)
{
Console.WriteLine("The {0} has received a severity {1}, state {2} error number {3}\n" +
"on line {4} of procedure {5} on server {6}:\n{7}",
err.Source, err.Class, err.State, err.Number, err.LineNumber,
err.Procedure, err.Server, err.Message);
}
}OleDb
[Visual Basic]
Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;")

AddHandler nwindConn.InfoMessage, New OleDbInfoMessageEventHandler(AddressOf OnInfoMessage)


Private Shared Sub OnInfoMessage(sender As Object, args As OleDbInfoMessageEventArgs)
Dim err As OleDbError
For Each err In args.Errors
Console.WriteLine("The {0} has received a SQLState {1} error number {2}:\n{3}", _
err.Source, err.SQLState, err.NativeError, err.Message)
Next
End Sub[C#]
OleDbConnection nwindConn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;");

nwindConn.InfoMessage += new OleDbInfoMessageEventHandler(OnInfoMessage);


protected static void OnInfoMessage(object sender, OleDbInfoMessageEventArgs args)
{
foreach (OleDbError err in args.Errors)
{
Console.WriteLine("The {0} has received a SQLState {1} error number {2}:\n{3}",
err.Source, err.SQLState, err.NativeError, err.Message);
}
}StateChange
StateChange 事件在 Connection 的状态出现更改时发生。StateChange 事件接收 StateChangeEventArgs,它们使您能够使用 OriginalState 和 CurrentState 属性来确定 Connection 状态中的更改。OriginalState 属性是一个 ConnectionState 枚举,它指示 Connection 在更改前的状态。CurrentState 是一个 ConnectionState 枚举,它指示 Connection 在更改后的状态。

以下代码示例在 Connection 的状态出现更改时使用 StateChange 事件将消息写入控制台。

[Visual Basic]
AddHandler nwindConn.StateChange, New StateChangeEventHandler(AddressOf OnStateChange)


Protected Shared Sub OnStateChange(sender As Object, args As StateChangeEventArgs)

Console.WriteLine("The current Connection state has changed from {0} to {1}.", _
args.OriginalState, args.CurrentState)
End Sub[C#]
nwindConn.StateChange += new StateChangeEventHandler(OnStateChange);


protected static void OnStateChange(object sender, StateChangeEventArgs args)
{
Console.WriteLine("The current Connection state has changed from {0} to {1}.",
args.OriginalState, args.CurrentState);
} 表示 SQL Server 数据库的一个打开的连接。不能继承此类。有关此类型所有成员的列表,请参阅 SqlConnection 成员。

System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Data.SqlClient.SqlConnection

[Visual Basic]
NotInheritable Public Class SqlConnection
Inherits Component
Implements IDbConnection, ICloneable[C#]
public sealed class SqlConnection : Component, IDbConnection,
ICloneable[C++]
public __gc __sealed class SqlConnection : public Component,
IDbConnection, ICloneable[JScript]
public class SqlConnection extends Component implements
IDbConnection, ICloneable线程安全
此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的。但不保证任何实例成员是线程安全的。

备注
SqlConnection 对象表示与 SQL Server 数据源的一个唯一的会话。对于客户端/服务器数据库系统,它相当于到服务器的网络连接。SqlConnection 与 SqlDataAdapter 和 SqlCommand 一起使用,以便在连接 Microsoft SQL Server 数据库时提高性能。对于所有第三方 SQL 服务器产品以及其他支持 OLE DB 的数据源,请使用 OleDbConnection。

当创建 SqlConnection 的实例时,所有属性都设置为它们的初始值。有关这些值的列表,请参阅 SqlConnection 构造函数。

如果 SqlConnection 超出范围,则不会将其关闭。因此,必须通过调用 Close 或 Dispose 来显式关闭该连接。

Note[note] 若要部署高性能应用程序,则需要使用连接池。当使用 SQL Server .NET 数据提供程序时,不需要启用连接池,因为尽管您可以修改某些设置,但提供程序会自动管理这项操作。有关利用 SQL Server .NET 数据提供程序使用连接池的更多信息,请参阅 SQL Server .NET 数据提供程序的连接池 。

如果执行 SqlCommand 的方法生成 SqlException,那么当严重度等于或小于 19 时,SqlConnection 将仍保持打开状态。当严重度等于或大于 20 时,服务器通常会关闭 SqlConnection。但是,用户可以重新打开连接并继续操作。

创建 SqlConnection 对象的实例的应用程序可通过设置声明性或强制性安全请求,要求所有直接和间接的调用者具有足够的权限访问代码。SqlConnection 使用 SqlClientPermission 对象提出安全请求。用户可以使用 SqlClientPermissionAttribute 对象来验证他们的代码是否具有足够的权限。用户和管理员还可以使用 代码访问安全策略工具 (Caspol.exe) 来修改计算机、用户和企业级别的安全策略。有关更多信息,请参阅 保护应用程序 。

有关处理来自数据服务器的警告和信息性消息的更多信息,请参阅 处理连接事件 。

示例
[Visual Basic, C#] 下面的示例创建一个 SqlCommand 和一个 SqlConnection。SqlConnection 打开,并设置为 SqlCommand 的 Connection。然后,该示例调用 ExecuteNonQuery 并关闭该连接。为了完成此任务,将为 ExecuteNonQuery 传递一个连接字符串和一个查询字符串,后者是一个 Transact-SQL INSERT 语句。

[Visual Basic]
Public Sub InsertRow(myConnectionString As String)
' If the connection string is null, use a default.
If myConnectionString = "" Then
myConnectionString = "Initial Catalog=Northwind;Data Source=localhost;Integrated Security=SSPI;"
End If
Dim myConnection As New SqlConnection(myConnectionString)
Dim myInsertQuery As String = "INSERT INTO Customers (CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')"
Dim myCommand As New SqlCommand(myInsertQuery)
myCommand.Connection = myConnection
myConnection.Open()
myCommand.ExecuteNonQuery()
myCommand.Connection.Close()
End Sub 'SelectSqlClientSrvRows[C#]
public void InsertRow(string myConnectionString)
{
// If the connection string is null, use a default.
if(myConnectionString == "")
{
myConnectionString = "Initial Catalog=Northwind;Data Source=localhost;Integrated Security=SSPI;";
}
SqlConnection myConnection = new SqlConnection(myConnectionString);
string myInsertQuery = "INSERT INTO Customers (CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')";
SqlCommand myCommand = new SqlCommand(myInsertQuery);
myCommand.Connection = myConnection;
myConnection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
}

一个简单的 ADO.NET 应用程序,它从数据源中返回结果并将输出写至控制台或命令提示符窗口。通过 ADO.NET 访问数据中提供的示例代码的大部分都可以放入利用此示例创建的模板,以查看特定 ADO.NET 功能的工作示例。

该示例显示包含在 ADO.NET 应用程序中的典型命名空间。OLE DB 客户端的命名空间不同于 SQL Server 客户端的命名空间。对于 SQL Server .NET 数据提供程序 (System.Data.SqlClient) 和 OLE DB .NET 数据提供程序 (System.Data.OleDb) 都显示了相应的示例。如果需要,可以在单个应用程序中同时使用 SQL Server .NET 数据提供程序和 OLE DB .NET 数据提供程序。

以下示例连接到 Microsoft SQL Server 2000 上的 Northwind 数据库,并使用 DataReader(有关 DataReader 更多信息,请参阅使用 DataReader 检索数据)返回一个“类别”(Categories) 列表。

编译和运行C#与ADO.NET 示例应用程序

使用“记事本”(Notepad) 或其他文本编辑器,为 Visual Basic 示例代码创建一个名为 sample.vb 的空白文本文件或为 C# 示例代码创建一个名为 sample.cs 的空白文本文件。
复制本主题中的 Visual Basic 或 C# 示例代码并将其粘贴到空白文本文件中。保存该文件。
打开一个命令提示符窗口(先按“开始”,再按“运行”,然后输入“command”)。
在命令提示符窗口中,将目录更改为包含新文本文件的目录。例如:
cd\SampleCode\ADONETSample在命令提示符窗口中,输入以下命令之一以编译该示例(文件的路径可能会有所不同)。
对于 Visual Basic,使用 vbc.exe 并使用以下命令来引用运行 ADO.NET 应用程序所需的系统库。
vbc.exe sample.vb /r:System.dll /r:System.Data.dll /r:System.Xml.dll对于 C#,使用 csc.exe 并使用以下命令来引用运行 ADO.NET 应用程序所需的系统库。
csc.exe sample.cs /r:System.dll /r:System.Data.dll /r:System.Xml.dll编译器将创建一个名为 sample.exe 的可执行文件。在命令提示符处输入“sample.exe”以运行已编译的示例。
SqlClient
[Visual Basic]
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualBasic

Public Class Sample

Public Shared Sub Main()
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;" & _
"Integrated Security=SSPI;Initial Catalog=northwind")

Dim catCMD As SqlCommand = nwindConn.CreateCommand()
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories"

nwindConn.Open()

Dim myReader As SqlDataReader = catCMD.ExecuteReader()

Do While myReader.Read()
Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", myReader.GetInt32(0), myReader.GetString(1))
Loop

myReader.Close()
nwindConn.Close()
End Sub
End Class[C#]
using System;
using System.Data;
using System.Data.SqlClient;

class Sample
{
public static void Main()
{
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");

SqlCommand catCMD = nwindConn.CreateCommand();
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories";

nwindConn.Open();

SqlDataReader myReader = catCMD.ExecuteReader();

while (myReader.Read())
{
Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1));
}

myReader.Close();
nwindConn.Close();
}
}OleDb
[Visual Basic]
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports Microsoft.VisualBasic

Public Class Sample

Public Shared Sub Main()
Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;" & _
"Integrated Security=SSPI;Initial Catalog=northwind")

Dim catCMD As OleDbCommand = nwindConn.CreateCommand()
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories"

nwindConn.Open()

Dim myReader As OleDbDataReader = catCMD.ExecuteReader()

Do While myReader.Read()
Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", myReader.GetInt32(0), myReader.GetString(1))
Loop

myReader.Close()
nwindConn.Close()
End Sub
End Class[C#]
using System;
using System.Data;
using System.Data.OleDb;

class Sample
{
public static void Main()
{
OleDbConnection nwindConn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");

OleDbCommand catCMD = nwindConn.CreateCommand();
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories";

nwindConn.Open();

OleDbDataReader myReader = catCMD.ExecuteReader();

while (myReader.Read())
{
Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1));
}

myReader.Close();
nwindConn.Close();
}
}

0 评论:

发表评论