0 \1 Q* h! O0 ] 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。, o. q* t( G$ [% n6 V3 L s
. v/ O$ I6 l) w) W# `. e$ j 看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。 7 M( ^. \! l* q8 F6 \* J. o- J- S& x) r
如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。 3 l4 ?2 m7 m' I7 K 5 _+ @) U5 x: @* e9 w 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为: ; N1 l) P1 D. g! O # a9 ]1 a2 }9 ?- A3 n' O0 h 1、在企业管理器中,选择菜单上的"工具",再选择"选项"; " S W6 V8 W1 }" S8 w 0 U( m6 j g( N. o$ y: ? 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡; ( Q6 z7 {/ v2 t" r. R3 i4 ]. |" V7 x# A; {
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。 + \0 P. u5 S2 c* t( w' @* l: y1 J( K; r3 c2 z, f0 i
查询分析器中也可以在同样位置进行设置。 <>! ^& a( {6 l; B. [* {, Y
二、应用程序连接失败 $ D5 l+ v$ L, J! B+ f" u 1 l, N" B+ V; ] E" Q6 V4 I2 ? 以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:6 A- X1 v! | G$ Q
w% g1 c2 g& u5 E. a5 }Microsoft OLE DB Provider for SQL Server (0x80004005) ( s/ c( a$ F& \: |; ^, ^' M[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.# f$ q1 v/ A4 _2 W$ \; j
- e" W1 G8 @: T- a$ O
Microsoft OLE DB Provider for SQL Server (0x80004005) ) \( o/ ^) U# M4 i9 n5 ~用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。 % D# y& x) f5 R/ Q: Z6 z( h8 J/ `8 O) X' r; B; V2 X% U& N0 n
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'.1 C6 K6 C) {( u3 \$ p
[Microsoft][ODBC SQL Server Driver]超时已过期. 6 g. K; a4 k% y, K; m/ K( K$ P/ D1 n% @3 v O$ U3 I
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。+ N. R$ Y- E# W. z8 _9 q4 _
$ ^- P. e1 [9 y
- M( l8 S& ?+ f5 Z! h- H: b8 O" a% s$ r9 a8 t
0 _1 f5 N3 }; G; E4 N* j 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示: 0 o- p5 l1 R, x, G 5 u8 U- @. D' a 1、使用用于 SQL Server 的 OLE DB 提供者: " d- O( w3 F4 p1 x0 o% h3 ?& @9 t7 A N
使用 SQL Server 身份验证:: a9 b& R3 Q/ c( r/ v; @
& I( K+ {7 S( XoConn.Open "rovider=sqloledb;" & _ 8 T+ F& @% j4 b6 D) ?"Data Source=myServerName;" & _) C- `* a: d% n/ W% z; F2 e$ k% Q* k
"Initial Catalog=myDatabaseName;" & _ : L- N- s& t" U"User Id=myUsername;" & _, K- x! y: R* G+ d& O8 K! h
"assword=myPassword"1 z. D9 p0 ?- n) e( z3 H
6 u* L' k; l5 y: G/ ?
使用 Windows 身份验证(信任连接):/ m7 {, N5 l- f: Y. q P: @/ {
1 J$ R# b3 l/ G P1 }
oConn.Open "rovider=sqloledb;" & _ 0 u8 W; \( t7 q: Y"Data Source=myServerName;" & _ 7 m" \$ L+ Z$ b# M* g"Initial Catalog=myDatabaseName;" & _ # u3 H/ v3 |( z"Integrated Security=SSPI" , j* b0 f( A8 H" G) p7 e8 y( ]1 z $ t+ W3 n0 Q- p% `! v 2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源): 1 o [0 a( R' v2 l7 o! n, f4 A0 X9 O# Q9 b. S& j
使用 SQL Server 身份验证: ; N8 B) @$ U, k0 |/ g : ]0 B- L F& C/ o* M) T2 xoConn.Open "Driver={SQL Server};" & _ 6 y6 @9 O9 J# _# g& L- h# K
"Server=MyServerName;" & _& t. O2 N! g; x2 r! w# p- L7 ]
"Database=myDatabaseName;" & _! [6 \* A2 r4 C- V, v
"Uid=myUsername;" & _' `9 l X8 k4 ]8 k- w, u# J+ l
"wd=myPassword"% K5 p1 h8 a/ U1 _8 W
- V) }% H7 h& o 使用 Windows 身份验证(信任连接):1 S! S9 E f- i2 k. Q- ^
; \1 ^. \/ |0 S; e" s$ ~oConn.Open "Driver={SQL Server};" & _ / y7 Z7 r- p1 {6 m* q8 b3 P4 G"Server=MyServerName;" & _( p( m- ?. v! l6 A: M ^
"Database=myDatabaseName;" & _. m+ Y/ V! `! _, e6 `( M4 i4 [- z
"Trusted_Connection=yes" 0 G, W; P1 \5 s$ |' N - c: o9 p. {8 o7 } 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源): + V4 h0 Q) _. w) C( i4 ?. z3 b( {/ r9 I1 H) z8 d5 K% U: P( Z D
oConn.Open "DSN=mySystemDSN;" & _ ' M& m0 W/ U# q% A" x) S"Uid=myUsername;" & _ ' u7 ^. R: G0 o6 y$ c* o"wd=myPassword" - g: x9 D1 ^9 N8 }; q( {3 Z8 d5 L
如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方: ) n3 p1 F1 C3 i 1 |3 c% R5 N d2 F- I 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:& i1 {: R' W8 e: e- O8 H
2 G1 w' e% o$ i# O" ]' B+ G$ P8 m 7 q: [7 W5 r+ D# u
% `2 e& ]4 V2 K) I/ H, p' r3 \
- H* w: ^& e" o8 V/ c4 A! Y/ J) c 9 m0 W! |% m0 O) L* N8 v 2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如: " z% W; ]" U+ X
! \; q- I# l3 t% G; u, k7 I
</P><><%9 x/ ]: z p0 O: k* n
Set Conn = Server.CreateObject("ADODB.Connection") ) b4 T3 U$ ?2 N0 |+ ?8 I3 a" zDSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USERWD=password;DATABASE=mydatabase"( }2 ]: F J4 \, y
Conn. Properties("Connect Timeout") = 15 '以秒为单位 1 P$ j5 I. Y8 |% @0 ^$ d7 u; lConn.open DSNtest ; i- c5 ^8 J; F" N%></P><> 4 @* x" z3 u' Q7 P 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:# E# L1 s/ E/ @ V6 v" t9 t
; B7 ~& H% U9 J3 U+ g</P><>Dim cn As New ADODB.Connection' Y' D) B! ^6 j" \# X& \
Dim rs As ADODB.Recordset 3 R$ I/ H' V" Q0 W. . . 5 H6 ?& _1 o3 Z3 P. S; b& L
cmd1 = txtQuery.Text 8 x+ z) |: C) j+ D5 bSet rs = New ADODB.Recordset6 J# \9 f/ Y) m! H" S
rs.Properties("Command Time Out") = 300! s8 w7 T; |- E1 k1 r
'同样以秒为单位,如果设置为 0 表示无限制 # H$ A7 C0 s' N. c, Yrs.Open cmd1, cn9 N+ H; G$ z) V0 \" p& A3 K* G
rs.MoveFirst$ A7 X4 ~- h- b) Z& ~
. . . </P><> ; l7 Y- r$ n. L: C- n m C <B>三、小结</B>$ }/ T; }( }. t2 U; w
5 e( h' ^5 c o/ C& S6 E8 `; h
本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P>