- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
|
单击"别名"选项卡,还可以为服务器配置别名。服务器的别名是用来连接的名称,连接参数中的服务器是真正的服务器名称,两者可以相同或不同。如下图中,我们可以使用myserver来代替真正的服务器名称sql2kcn-02,并且使用网络库 Named Pipes。别名的设置与使用HOSTS文件有相似之处。
) X$ C; B, e" s; `0 [, J+ {5 O& t) H+ I+ T. B
# y3 B: r4 A* R) K- L通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
; Q, L0 k4 J! V3 u9 c, @+ `3 d) d% _. A
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:
\- v! z" B5 G, Y
5 s: b6 t$ Z- `; D* V3 d 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;
: I2 B. {8 e7 ~. P
% g7 C) r" b1 B7 L 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;: E1 A# r% G% d/ ^, V( a0 P$ m8 g
* H5 e/ H* [" m5 p# B. J. X6 a 3、 在"身份验证"下,选择"SQL Server和 Windows "。, J. V1 V6 A' t( _6 E
( A) T! K8 u# k
4、 重新启动SQL Server服务。7 N' Z9 S6 ?7 o
% b1 _- w" Y7 S8 o$ }1 J+ x* e# [9 q: n 在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:
( n! L8 l4 t/ l& e
+ w$ u! p$ z) n) L* ? 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;
: f; n6 K4 k3 |
" p) G* t6 g% c, G3 m% }$ \ 2、依次展开注册表项,浏览到以下注册表键:% w# K$ D# c& m4 Q7 C. J3 C
% _, V. }7 K' ~' Z, @; O' j& a[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]; d8 a$ G+ E+ D. `+ o7 B0 v
' M9 l1 c% v4 T2 e' N9 }1 }' { 3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;
6 T6 v# ^1 { X7 Y5 ?
' l3 ?% p* h& t 4、将原值从1改为2,点击"确定";
# @8 C; [' \# o3 j# M& ?
6 i" J% x% z, j. q& t: N4 k8 Q$ L 5、关闭注册表编辑器;
) L V* n1 @# H# ~
2 y0 h6 w1 L/ S6 ~* W1 b, n 6、重新启动SQL Server服务。
4 x! q$ O9 D6 W
" P5 c+ X% t6 ] 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:
6 M, L9 C( \* u' |5 H2 L2 E T3 ?. q4 ]. U# {( `
1、打开企业管理器,展开服务器组,然后展开服务器;, `5 `. X+ l( G0 G( N- q( P0 w' P
; i3 @* E Z) x8 `
2、展开"安全性",右击"登录",然后单击"新建登录";
5 R, f8 z5 e2 g9 @/ x8 S+ T. _
, q3 a# H, C! G' l4 g* Y2 p 3、在"名称"框中,输入 BUILTIN\Administrators;
' m) m2 n1 S6 F: X
9 C3 |: [: q3 U% ?$ _8 j, o1 ^ 4、在"服务器角色"选项卡中,选择"System Administrators" ;, v( ]$ H6 Y' m
7 c# ^0 Z/ P* N& J# O( S' D- b 5、点击"确定"退出;0 @1 S' U0 v: j4 E* A/ W4 y
$ [4 R4 m0 `/ I6 f' c5 K
6、使用同样方法添加 <机器名>\Administrator 登录。3 j1 e+ U! m4 L [
* C( a5 s( y* l# g8 U. M6 o) P
以下注册表键3 c; |, F' D5 t6 H# R* V. P
0 u0 G. B" E- A/ ZHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode
, {' P, e1 V% S% Z% V9 G M* x8 E
, \& Z+ t8 E6 j8 g" B: ^; V 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。- W" D% e% |) v
/ B3 m2 o$ ?9 Z+ L 看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。- q: i9 i7 a+ r
/ u: g( @, v: l: t6 ^ 如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。
2 {. p+ @+ C4 G& D* G
& x' S$ t" G* M% B( ]: y2 X 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:
: S. ?0 Z) O# V7 R% I' Y, l+ k: R5 C* R7 {* i1 ?; f0 t
1、在企业管理器中,选择菜单上的"工具",再选择"选项";2 }+ \1 n- V1 R. I) \9 h2 A' M3 x& e
c2 F0 R. [( K' p j) G
2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;* R6 @4 P! g, C/ I
, Y7 v6 ^1 q5 i6 t
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。
. e' E$ d+ N6 o
" O7 k( [7 f/ s" G' W/ }0 t 查询分析器中也可以在同样位置进行设置。 < >
( p; r: Y5 M8 D7 W+ X- X二、应用程序连接失败/ ?8 e" f6 k, |) y# r
# l5 T8 E# O7 D" e# T6 n* Y0 {
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
' o: C }3 ~( F/ }9 n1 G |3 V, B- Q
) B9 ^& t# \6 `9 j2 J; EMicrosoft OLE DB Provider for SQL Server (0x80004005)9 r6 o K8 H4 r7 K, Z q$ \+ i' B- d
[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
0 Z8 A! E- B6 j$ ^" G' e
* v) ^8 W6 J: _% L) j1 pMicrosoft OLE DB Provider for SQL Server (0x80004005)3 w* N/ l0 a" R/ {" Z8 A( z
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
) X7 |8 s: |' ^4 E: W
, w# Z" r& Y8 e; bMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.
! b7 [! l' T9 @- ~% E$ ^[Microsoft][ODBC SQL Server Driver]超时已过期.
* ~* ]% M% D! C
! Z) U/ ?3 A v W8 | 首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。% w1 }, w( o$ y0 d o+ q
6 h" }1 d: S: h- ?* v5 X
' q+ l" A$ ?, o/ Z$ C3 z }: O/ i
- e6 A$ K" b% W' k/ [2 M7 S; p* k
: f, |1 H( W' | 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示: F6 k0 }7 O) Z+ ^' I& W0 `
2 ?5 a! x& k, Z& z
1、使用用于 SQL Server 的 OLE DB 提供者:
6 G& o" \( V% `- w7 C3 M0 r
& R# _2 A7 a3 o* I: k/ C 使用 SQL Server 身份验证:6 g( R- c* |: n o$ O
; U! Y: D5 ~ w3 p: D( z0 r8 v! K
oConn.Open " rovider=sqloledb;" & _
# ~- ~# }! K: b/ X$ ]7 C/ ?"Data Source=myServerName;" & _
; j6 ^5 K8 u, w3 ] ~9 ^8 g"Initial Catalog=myDatabaseName;" & _
o3 k8 t* j1 Z4 t- C, g"User Id=myUsername;" & _
& n J4 M$ M. W7 m# h7 |" assword=myPassword": x) b6 Q4 v3 t. D7 ^" l) _
6 ]$ p' V" N. u# S* I' }
使用 Windows 身份验证(信任连接):) T0 H2 J% `/ k) V6 N/ ^
0 k5 G* ]/ t9 f/ P" `' JoConn.Open " rovider=sqloledb;" & _3 N' r& k3 Q" O; e
"Data Source=myServerName;" & _8 S( v$ D8 _; {, u8 M* b, ~5 g1 T$ Y
"Initial Catalog=myDatabaseName;" & _6 |7 d( p0 ^' ^% t7 c T- M) S6 c
"Integrated Security=SSPI"4 W9 J% }0 a9 b: \: h% b( \! M
& a- i" p- d; h
2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):
2 _$ W# [+ h" `9 ?% A' n5 T5 y7 [% q% @8 `' G# ^6 p/ @$ ~- o% n
使用 SQL Server 身份验证:
* Y; s# m2 Y( t% p) _
( Q& `/ p* O5 D% uoConn.Open "Driver={SQL Server};" & _
$ c) H, u# o7 j"Server=MyServerName;" & _
8 q: q5 W' X: P& E) Y( ^# z- F"Database=myDatabaseName;" & _
' a7 u% D$ }, g4 S" D" z. j"Uid=myUsername;" & _
; m; W5 S3 G0 m) p" wd=myPassword"
: b. `# E) | ]0 h: e
: i9 T* |0 A# i 使用 Windows 身份验证(信任连接):
" E8 v7 l% s5 O: u) N
& r* C- }$ `0 i( joConn.Open "Driver={SQL Server};" & _ 6 P8 U. L9 w6 r4 {
"Server=MyServerName;" & _
; r0 }; ]) h4 P p) o"Database=myDatabaseName;" & _
+ ^( u, b& r# A. p"Trusted_Connection=yes"
: [ \3 u4 ]6 {* Q! D" @9 T
% B3 j/ E- W9 [$ ?, e) x 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):) {- U; F9 Y' w0 H1 ~
2 u/ H* `, F$ D3 OoConn.Open "DSN=mySystemDSN;" & _
' @0 }4 E( n/ x; X"Uid=myUsername;" & _ E; S; [8 Z- Q! _2 x$ \" `
" wd=myPassword" T- {2 `6 ~0 ~6 H
/ a1 q: M) I5 _3 u! V0 _8 } 如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
* e# q3 k2 N! l
2 u( K& _: F8 O 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:+ H& \/ [2 i$ j0 p" k/ w+ r$ ?
$ C( S+ v: o4 k2 B5 \
9 z r) |, `% i. p" @$ y" h
# k7 W0 A2 [+ u, S& U
8 {. G- W" n; c0 j/ k6 H8 t
# a8 U% o6 C/ s( e5 V 2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
( [0 w0 s+ V; D: a* H2 \5 e$ n5 D% m3 V6 V0 G& `
</P>< ><%7 E( T5 l+ c9 M
Set Conn = Server.CreateObject("ADODB.Connection")
& ?8 ]: B$ E) E6 Q% N/ J+ n8 EDSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"% I1 I) Y; a# k( w l. M, E: B
Conn. Properties("Connect Timeout") = 15 '以秒为单位$ Z3 G/ t% ~1 d* b0 Q9 C0 s) Z
Conn.open DSNtest
; V' }0 _! O2 }3 I%></P>< >
( D) }: b5 c, V3 Z$ G7 v 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:: h( X. x: _% l
% D! e, _% o& k
</P>< >Dim cn As New ADODB.Connection
- \. h* d |/ U0 wDim rs As ADODB.Recordset
; t" V1 N' V' I! E/ ^ O. . .
/ ^8 }$ ~- ?) Scmd1 = txtQuery.Text6 C$ X8 T7 `2 r7 v1 [! L' G
Set rs = New ADODB.Recordset1 b" a' ]4 _- j+ O) ^% [! D
rs.Properties("Command Time Out") = 300
, k1 Z, d+ @) b1 r'同样以秒为单位,如果设置为 0 表示无限制0 j* I Y9 o8 h" i, {
rs.Open cmd1, cn$ J* I6 N$ M- Z- Y- w% v1 u! L& |
rs.MoveFirst
4 |9 F7 j) d8 }7 s+ l; d/ R( a. . . </P>< >7 c( Z3 s% A5 F' U- p0 k6 S
<B>三、小结</B>9 N3 q- t) U( G# f D! V
3 R% s% ]2 V- U 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|