概述
在软件编程中,数据库连接字符串是一种普通的字符串表示形式,它包含用于建立数据库和应用程序之间连接的数据库连接信息。连接字符串包括驱动程序的名称、服务器名称和数据库名称等参数,以及用户名和密码等安全信息。
ADO.NET中的连接字符串也是如此,它包含作为参数从数据提供程序传递给数据源的初始化信息。数据提供程序接收连接字符串作为DbConnection.ConnectionString
属性的值。
之后,提供程序解析连接字符串并确保语法和关键字都正确,然后DbConnection.Open()
方法将解析后的连接参数传递给数据源,数据源执行进一步的验证并建立连接。
连接字符串语法
连接字符串是一个以分号分隔的键/值参数对列表,类似于:
keyword1=value; keyword2=value;
连接字符串中的关键字不区分大小写。但是,值可能是区分大小写的,这取决于数据源。关键字和值都可以包含空格字符。在关键字和未加引号的值中,前导和尾随空格将被忽略。
如果值包含分号、特殊的Unicode字符或前导、尾随空格,则必须用单引号或双引号将其括起来。例如:
Keyword=" whitespace ";
Keyword='special;character';
包围字符不能出现在它所包围的值内。因此,包含单引号的值只能用双引号括起来,反之亦然:
Keyword='double"quotation;mark';
Keyword="single'quotation;mark";
还可以通过一起使用两个字符来转义封闭字符:
Keyword="double""quotation";
Keyword='single''quotation';
引号本身以及等号不需要转义,因此以下连接字符串是有效的:
Keyword=no "escaping" 'required';
Keyword=a=b=c
由于每个值都被读取到下一个分号或字符串的结尾,后一个例子中的值是a=b=c
,此外,参数中最后一个分号是可选的。
所有连接字符串都适用上述相同的基本语法。但是,可识别的关键字集取决于数据提供程序。用于SQL Server的.NET Framework数据提供程序(SqlClient)支持许多来自老API的关键字,并接受许多常用连接字符串关键字的同义词。
但如果键入错误的关键字将使用连接字符不可用,比如:输入Integrated Security=true
是正确的,但IntegratedSecurity=true
则会导致连接失败。
在运行时由未经验证的用户输入手工构造的连接字符串很容易受到字符串注入攻击,并危及数据源的安全性。为了解决这些问题,ADO.NET 2.0为每个.NET Framework数据提供程序引入了连接字符串生成器。这些连接字符串生成器将参数公开为强类型属性,并使其能够在发送到数据源之前验证连接字符串。
.NET框架中主要提供了以下三种数据提供程序,包括:
- Microsoft SQL Server
- OLEDB
- ODBC
以下分别演示不同数据提供程序的数据库连接字符串的格式。
Microsoft SQL Server连接字符串
var connetionString="Data Source=ServerName;Initial Catalog=Databasename;
User ID=UserName;Password=Password";
OLEDB连接字符串
var connetionString="Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=yourdatabasename.mdb;";
ODBC连接字符串
var connetionString="Driver={Microsoft Access Driver (*.mdb)};
DBQ=yourdatabasename.mdb;";
ADO.NET连接字符串关键字
下表列出了ADO.NET连接字符串中关键字值的有效名称:
关键字 | 默认 | 说明 |
---|---|---|
Addr | N/A | Data Source 的同义词。 |
Address | N/A | Data Source 的同义词。 |
App | N/A | Application Name 的同义词。 |
Application Name | N/A | 应用程序的名称,如果未提供应用程序名称,则为 “.NET SQLClient Data Provider”。 应用程序名称的长度不能超过128个字符。 |
ApplicationIntent |
ReadWrite |
连接到服务器时声明应用程序工作负荷类型。 可能值为 ReadOnly 和 ReadWrite 。 例如: ApplicationIntent=ReadOnly 有关对 Always On 可用性组的 SqlClient 支持的详细信息,请参阅对高可用性、灾难恢复的 SqlClient 支持。 |
Asynchronous Processing - 或 - Async | false | 如果为 true ,则启用异步操作支持。 已识别的值为 true 、false 、yes 和 no 。 从 .NET Framework 4.5 开始,将忽略此属性。 有关异步编程的 SqlClient 支持的详细信息,请参阅 异步编程。 |
AttachDBFilename - 或 - Extended Properties - 或 - Initial File Name | N/A | 主数据库文件的名称,包括可附加数据库的完整路径名。 只有扩展名为 .mdf 的主数据文件才支持 AttachDBFilename。 如果在连接字符串中指定了 AttachDBFileName 键的值,则附加数据库并成为连接的默认数据库。 如果未指定此键,并且以前附加了数据库,则将不会重新附加该数据库。 以前附加的数据库将用作连接的默认数据库。 如果将此密钥与 AttachDBFileName 键一起指定,则此项的值将用作别名。 但是,如果该名称已在另一附加数据库中使用,则连接将失败。 路径可以是绝对路径或相对路径,方法是使用 DataDirectory 替换字符串。 如果使用了 DataDirectory,则数据库文件必须存在于替换字符串指向的目录的子目录中。 注意: 远程服务器、HTTP 和 UNC 路径名称不受支持。 必须为数据库名称指定关键字 “database” (或其一个别名) ,如下所示:AttachDbFileName=|DataDirectory|\data\YourDB.mdf;integrated security=true;database=YourDatabase 如果日志文件和数据文件存在于同一个目录中,并且在附加主数据文件时使用“database”关键字,则将生成错误。 在这种情况下,请移除日志文件。 附加数据库后,将基于物理路径自动生成一个新日志文件。 |
Authentication | N/A | 用于 通过使用 Azure Active Directory 身份验证连接到 SQL 数据库的身份验证方法。 有效值是: Active Directory 集成,Active Directory 密码,Sql 密码。 |
Column Encryption Setting | N/A | 启用或禁用连接的 Always Encrypted 功能。 |
Connect Timeout - 或 - Connection Timeout - 或 - Timeout | 15 | (在终止尝试并生成错误之前等待连接到服务器的时间长度(以秒为单位)) 。 有效值大于或等于0且小于或等于2147483647。 打开到 Azure SQL 数据库的连接时,将连接超时值设置为30秒。 |
Connection Lifetime - 或 - Load Balance Timeout | 0 | 连接返回到池中后,创建时间将与当前时间进行比较,如果时间跨度(秒)超过 Connection Lifetime 指定的值,该连接将被破坏。 在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。 值为零 (0) 导致池连接的最大连接超时。 |
ConnectRetryCount | 1 | 控制客户端标识空闲连接失败后的重新连接尝试次数。 有效值为0至255。 默认值为 1。 0表示不尝试重新连接 (禁用连接复原) 。 若要详细了解空闲连接复原,请参阅技术文章 - 空闲连接复原。 |
ConnectRetryInterval | 10 | 指定每次连接重试尝试 (ConnectRetryCount) 之间的时间。 有效值为1到60秒 (默认值 = 10) ,在首次重新连接尝试之后应用。 检测到断开连接时,客户端会立即尝试重新连接;这是第一次重新连接尝试,并且仅当 ConnectRetryCount 大于0时才会发生。 如果第一次重新连接尝试失败并且 ConnectRetryCount 大于1,则客户端将等待 ConnectRetryInterval 尝试再次重新连接尝试。 若要详细了解空闲连接复原,请参阅技术文章 - 空闲连接复原。 |
Context Connection | false | true 如果应建立与 SQL Server 的进程内连接。 |
Current Language - 或 - Language | N/A | 设置用于数据库服务器警告或错误消息的语言。 语言名称长度不能超过128个字符。 |
Data Source - 或 - Server - 或 - Address - 或 - Addr - 或 - Network Address | N/A | 要连接到的 SQL Server 实例的名称或网络地址。 端口号可以在服务器名称之后指定: server=tcp:servername, portnumber 指定本地实例时,始终使用 (本地) 。 若要强制使用协议,请添加以下前缀之一: np:(local), tcp:(local), lpc:(local) 从 .NET Framework 4.5 开始,还可以连接到 LocalDB 数据库,如下所示: server=(localdb)\\myInstance 有关 LocalDB 的详细信息,请参阅 SqlClient 对 localdb 的支持。 数据源 必须使用 TCP 格式或命名管道格式。 TCP 格式如下所示: -tcp: |
Encrypt | false | true 如果为,则 SQL Server 在服务器安装了证书的情况下,对客户端和服务器之间发送的所有数据使用 SSL 加密。 已识别的值为 true 、false 、yes 和 no 。 有关详细信息,请参阅 连接字符串语法。 从 .NET Framework 4.5 开始,当 TrustServerCertificate 为 false 且 Encrypt 为 true 时,SQL Server SSL 证书中的服务器名称 (或 ip 地址) 必须与连接字符串中指定的服务器名称 (或 ip 地址完全匹配。 否则,连接尝试将失败。 |
Enlist | ‘true’ | true 指示 SQL Server 连接池程序将在创建线程的当前事务上下文中自动登记连接。 |
Failover Partner | N/A | 配置了数据库镜像的故障转移伙伴服务器的名称。 如果此项的值为 “”,则必须存在 初始目录 ,并且其值不能为 “”。 服务器名称的长度不能超过128个字符。 如果指定故障转移伙伴,但没有为数据库镜像配置故障转移伙伴服务器,并且 (使用 Server 关键字指定的主服务器) 不可用,则连接将失败。 如果你指定故障转移伙伴,但没有为数据库镜像配置主服务器,则在主服务器可用时,与 (使用 Server 关键字) 指定的主服务器的连接将会成功。 |
Initial Catalog - 或 - Database | N/A | 数据库的名称。 数据库名称的长度不能超过128个字符。 |
Integrated Security - 或 - Trusted_Connection | false | 如果为 false ,则在连接中指定用户 ID 和密码。 如果 true 为,则使用当前的 Windows 帐户凭据进行身份验证。 识别的值为、、、 true false yes no 和 sspi (强烈建议) ,它等效于 true 。 如果指定了用户 ID 和密码,并将 “集成安全性” 设置为 “true”,则将忽略用户 ID 和密码,并使用集成安全性。 SqlCredential 为使用 SQL Server Authentication () 的连接指定凭据的更安全方法 Integrated Security=false 。 |
Max Pool Size | 100 | 池中允许的最大连接数。 有效值大于或等于1。 小于 最小池大小 的值会生成错误。 |
Min Pool Size | 0 | 池中允许的最小连接数。 有效值大于或等于0。 在此字段中为零 (0) 表示最初没有打开最小连接。 大于 最大池大小 的值会生成错误。 |
MultipleActiveResultSets | false | 如果 true 为,则应用程序可以 (MARS) 中维护多个活动的结果集。 如果 false 为,则应用程序必须处理或取消一个批处理中的所有结果集,然后才能对该连接执行任何其他批处理。 已识别的值为 true 和 false 。 有关详细信息,请参阅多个活动结果集 (MARS)。 |
MultiSubnetFailover |
false | multiSubnetFailover=True 连接到 SQL Server 2012 (或更高版本的可用性组侦听器时,应始终指定) 可用性组或 SQL Server 2012 (或更高版本) 故障转移群集实例。 multiSubnetFailover=True 配置 SqlClient,以便更快地检测和连接当前) 活动服务器 (。 可能的值为、 Yes No 、、和 True False 1 0 。 例如: MultiSubnetFailover=True 默认值为 False 。 有关 SqlClient 对 Always On Ag 的支持的详细信息,请参阅 SqlClient 对高可用性、灾难恢复的支持。 |
Network Library - 或 - Network - 或 - Net | N/A | 用于建立与 SQL Server 实例的连接的网络库。 支持的值包括: dbnmpntw (Named Pipes) dbmsrpcn (多协议,Windows RPC) dbmsadsn (Apple 对话) 通过) dbmsgnet ( dbmslpcn (共享内存) dbmsspxn (IPX/SPX) dbmssocn (TCP/IP) Dbmsvinn (Banyan Vines) 必须在系统上安装您要连接到的相应网络 DLL。 如果未指定网络,并且使用本地服务器 (例如,”.” 或 “ (本地) “ ) ,则使用共享内存。 在此示例中,网络库是 Win32 Winsock TCP/IP (dbmssocn),1433 是使用的端口。 Network Library=dbmssocn;Data Source=000.000.000.000,1433; |
Packet Size | 8000 | 用于与 SQL Server 的实例进行通信的网络数据包的大小(以字节为单位)。 数据包大小可以大于或等于512且小于或等于32768。 |
Password - 或 - PWD | N/A | 登录 SQL Server 帐户的密码。 建议不要使用。 为了保持较高的安全级别,强烈建议您 Integrated Security Trusted_Connection 改用或关键字。 SqlCredential 为使用 SQL Server 身份验证的连接指定凭据的更安全方法。 密码长度不能超过128个字符。 |
Persist Security Info - 或 - PersistSecurityInfo | false | 如果设置为 false 或 no (强烈建议) ,则在连接处于打开状态或一直处于打开状态时,不会将安全敏感信息(例如密码)作为连接的一部分返回。 重置连接字符串将重置所有连接字符串值(包括密码)。 已识别的值为 true 、false 、yes 和 no 。 |
PoolBlockingPeriod | Auto | 设置连接池的阻塞期行为。 有关详细信息,请参阅 PoolBlockingPeriod 属性。 |
Pooling | ‘true’ | 如果此项的值设置为 true,则在应用程序关闭时,将向池中添加任何新创建的连接。 在下一次尝试打开相同的连接时,该连接将从池中提取。 如果连接具有相同的连接字符串,则将其视为相同。 不同连接具有不同的连接字符串。 此键的值可以为 “true”、”false”、”yes” 或 “no”。 |
Replication | false | true 如果使用连接支持复制。 |
Transaction Binding | Implicit Unbind | 控制与登记的事务的连接关联 System.Transactions 。 可能的值包括: Transaction Binding=Implicit Unbind; Transaction Binding=Explicit Unbind; 隐式取消连接将导致连接在结束时与事务分离。 分离后,在自动模式下对连接执行其他请求。 在事务处于活动状态的情况下,执行请求时不会检查 System.Transactions.Transaction.Current 属性。 事务结束后,会在自动模式下执行其他请求。 如果系统在使用块) 的作用域中结束事务 (在最后一个命令完成之前,将引发 InvalidOperationException 。 显式取消绑定会导致连接保持附加到事务,直到连接关闭或 SqlConnection.TransactionEnlist(null) 调用显式。 从 .NET Framework 4 开始,对隐式取消的更改会使显式解除绑定过时。 如果 InvalidOperationException 不是登记事务或者登记事务未处于活动状态,则将引发 Transaction.Current 。 |
TransparentNetworkIPResolution | 将该键的值设置为 true 时,需要应用程序检索特定 DNS 条目的所有 IP 地址并尝试连接到列表中的第一个地址。 如果未在 0.5 秒内建立连接,应用程序将尝试并行连接到所有其他地址。 第一个地址响应后,应用程序将与响应的 IP 地址建立连接。 如果 MultiSubnetFailover 该键设置为 true , TransparentNetworkIPResolution 则将被忽略。 如果 Failover Partner 设置了密钥, TransparentNetworkIPResolution 则将忽略。 此项的值必须是 true 、、 false yes 或 no 。 的值与的 yes 值相同 true 。 的值与的 no 值相同 false 。 默认值如下所示: false 即使 连接到 Azure SQL 数据库,其中的数据源结尾为: .database.chinacloudapi.cn.database.usgovcloudapi.net.database.cloudapi.de.database.windows.netAuthentication 为 “Active Directory Password” 或 “Active Directory 集成”所有其他情况均为 true 。 |
|
TrustServerCertificate | false | 如果设置为 true ,则在跳过证书链以验证信任时,使用 SSL 来加密通道。 如果将 “TrustServerCertificate” 设置为, true 并将 false “加密” 设置为,则不会加密该通道。 已识别的值为 true 、false 、yes 和 no 。 有关详细信息,请参阅 连接字符串语法。 |
Type System Version | N/A | 一个字符串值,该值指示应用程序所需的类型系统。 可用于客户端应用程序的功能取决于 SQL Server 版本和数据库的兼容性级别。 如果使用的是 SQL Server 的其他版本,则显式设置编写的客户端应用程序所针对的类型系统版本可避免导致应用程序中断的潜在问题。 注意: 无法为公共语言运行时设置类型系统版本 (CLR) 在 SQL Server 中执行进程内执行的代码。 有关详细信息,请参阅 SQL Server 公共语言运行时集成。 可能的值包括: Type System Version=SQL Server 2012; Type System Version=SQL Server 2008; Type System Version=SQL Server 2005; Type System Version=Latest; Type System Version=SQL Server 2012; 指定应用程序需要 Microsoft.SqlServer.Types.dll 版本11.0.0.0。 其他 Type System Version 设置将要求 Microsoft.SqlServer.Types.dll 10.0.0.0 版。 Latest 已过时,不应使用。 Latest 等效于 Type System Version=SQL Server 2008; 。 |
User ID - 或 - UID - 或 - | N/A | SQL Server 的登录帐户。 建议不要使用。 为了保持较高的安全级别,强烈建议您 Integrated Security Trusted_Connection 改用或关键字。 SqlCredential 为使用 SQL Server 身份验证的连接指定凭据的更安全方法。 用户 ID 不得超过128个字符。 |
User Instance | false | 一个值,该值指示是否将连接从默认 SQL Server Express 实例重定向到在调用方帐户下运行的运行时启动的实例。 |
Workstation ID - 或 - WSID | 本地计算机名称 | 连接到 SQL Server 的工作站的名称。 ID 不得超过128个字符。 |
发表评论
登录用户才能发表评论, 请 登 录 或者 注册