- 在线时间
- 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. E5 m! t$ @1 D* Z/ b& Y
, S% }0 M5 e+ k/ m# g- J; Z
2 K- d. `( o4 m8 R9 }
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。. x$ v) h' y& K4 ^$ o
$ Y/ v9 X( v4 R' H+ S
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:
* {0 ~9 k& h! H5 W
8 o( U U* m/ r* E9 Y 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;' {, Z0 g4 {* [6 G( Y; W4 ]- ?6 ~
$ H K' e( y+ S. [% J 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;
- D" w5 |' a" J* H# }
9 l% h% |6 E* P- g5 T1 z, _ 3、 在"身份验证"下,选择"SQL Server和 Windows "。
. Q7 E) c$ ^* i; l$ b) u: J2 }2 h( I7 ^9 D1 C* e9 v2 B
4、 重新启动SQL Server服务。
& o# A/ c# g9 M% {8 U" h7 g
6 \2 J) w5 q0 U) U: l$ g4 X9 ~6 J# L1 ] 在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:8 L* Z8 ~7 {1 @3 Y/ p8 o
7 `+ M1 x2 w- S0 |; q U* g, T 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;
$ E+ E; v" \9 o$ Q2 Z4 h" ^
2 j% y" P; p) X3 v( n5 ?( @ 2、依次展开注册表项,浏览到以下注册表键:
& v2 U0 j6 A, a" `+ N) U" G! `! Y9 F) v0 C; X4 @7 g
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]& z) n* R* M- D- E$ ~. H
0 g. [8 Q' ~' ?* ~ 3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;2 ^0 l6 c. z+ M9 |
6 p/ }6 |2 O9 I 4、将原值从1改为2,点击"确定";4 z* h; I3 M4 S
8 p6 s# ]9 W! m. J1 c
5、关闭注册表编辑器;
2 H0 o/ ]! K% E3 |' {# s7 v; D P5 x1 ]* M+ w
6、重新启动SQL Server服务。
1 a. Z: S' n5 |' P
2 {1 j9 @3 R3 J, D% w; S% ` 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:3 ~$ k0 E1 o, }- p
9 q, c& {5 e9 J0 U# i5 s5 [ 1、打开企业管理器,展开服务器组,然后展开服务器;( D4 s3 g1 L7 @1 G% d
# ?9 K! L% \" B' Z# t% T 2、展开"安全性",右击"登录",然后单击"新建登录"; g. z3 z; h" H0 W+ k$ O8 Y
( y& r$ p$ b: y8 _, d 3、在"名称"框中,输入 BUILTIN\Administrators;( t7 D$ u( O8 p' F- o
! ]0 j2 A, c# C! \
4、在"服务器角色"选项卡中,选择"System Administrators" ;9 {3 h# e; s1 w" q% ?( t
0 }) [4 a# b: f1 j6 B# D6 N
5、点击"确定"退出;+ J4 K* E9 v4 t+ f6 u* P
B' q0 p6 D2 `; p) n @+ [9 g
6、使用同样方法添加 <机器名>\Administrator 登录。
# ?. N, c# D. @# x% q g# R
( y- D$ w8 J" s. k# s) G' i/ T" y 以下注册表键( { N$ O* a" [, y
: g+ @5 i+ ~' N4 T- C) M" t: xHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode
' Z) ~3 `1 j9 I9 N) ]7 q
2 B0 L" V. q% ~. F% h6 k+ B 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。6 \1 m* Z$ P! r9 t4 Y) n
! H: S8 v/ l6 d& a2 ~' p5 H7 W4 ^
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。3 _5 E5 A8 q& O3 ^( z
: ?) [' ^, t. o* x 如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。
! z( J: x1 J2 S, q2 h8 C. s c1 X6 d! R( c/ B; `
要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:
$ Y9 Q% O+ B) z9 [# y7 `, N: N" z4 D* z
1、在企业管理器中,选择菜单上的"工具",再选择"选项";, w1 U, w. U9 T; x' U8 J6 b
7 W" @9 N9 Z) {6 b% E 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;: j8 S, Y* P9 P9 e
. [, T6 m- g1 U2 }7 q/ C* \
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。
, @6 i& s; ], ]& M4 e2 v) t
8 i8 @5 a S! Q( x# P K 查询分析器中也可以在同样位置进行设置。 < >) R, v$ ~" \' d! [6 T6 Y5 r0 \6 `: o
二、应用程序连接失败* K7 P3 Q5 F# a- N9 A; U
[: m$ x* e& L H2 \; I! b0 c6 k
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
" l- ?7 _8 n& y) K& e* Q9 [" q# e H6 a% n
Microsoft OLE DB Provider for SQL Server (0x80004005)
& a7 P3 `6 l+ N) I" e6 C[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.+ ^# A9 u# V4 }. G
! [1 a+ J- S! {; ]7 aMicrosoft OLE DB Provider for SQL Server (0x80004005)
- X' P) F6 ` k. |( x: Z, s* u用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
9 |& I% o' K; w( t# \( J
4 ]' W4 c }# [! S. D' _7 aMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.
; ^; D/ h1 U; D9 X! l" o[Microsoft][ODBC SQL Server Driver]超时已过期.
5 i$ j% v6 B4 N2 M! f$ d4 u8 B* \! p {! p0 p
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。
- G, [' _, y, l, d& ?( R! t
$ ?% `$ N/ _8 `% j9 B. ^
: v2 T7 d" b& D* \" O4 L6 @* Y* o# }7 }: g; r% K% V% [2 S
5 A- a* [) v" x* B ]3 D
从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:
. ^6 l$ U( \) i
4 x7 y. q6 \0 U6 Q3 h 1、使用用于 SQL Server 的 OLE DB 提供者:+ p4 {. i ^& P9 J' Q# q
{1 L. x: @. s2 }9 ^& A$ w 使用 SQL Server 身份验证:" S3 B M% F2 U t1 M+ \, h
; L, o# p% o% E$ J `6 a6 ]/ I( P2 soConn.Open " rovider=sqloledb;" & _
( I" r; ^% B5 Y% s. t"Data Source=myServerName;" & _7 J9 @6 C; w' M% W
"Initial Catalog=myDatabaseName;" & _6 b8 g3 x1 E3 Z9 S! s$ ~
"User Id=myUsername;" & _& p4 f- n' E- ^$ ?
" assword=myPassword"2 n6 G) h8 g6 w, ]- J4 T* P
% U0 ?8 Q* l+ l8 I. d% ]
使用 Windows 身份验证(信任连接):- `# @5 K+ q5 }: ]* G
7 f! }! S- N' P8 i0 t
oConn.Open " rovider=sqloledb;" & _
9 m, N" {& }" X% P1 g"Data Source=myServerName;" & _
$ y$ _4 T2 t2 M& U2 D"Initial Catalog=myDatabaseName;" & _8 z6 \; G* N, \3 N6 G
"Integrated Security=SSPI"
+ Z9 B4 X) P& s# T. G$ B, O8 g( S
0 o2 g5 \, _! X) d 2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):; w1 [: K- a) [: g
. c0 d! ]! r. Y! `& [% P3 D W
使用 SQL Server 身份验证:; N' a) f; o7 |+ c1 s3 G$ ~
; c& U: f9 L% i' J! MoConn.Open "Driver={SQL Server};" & _
; m& K. R: u% Z2 }# e8 z7 y"Server=MyServerName;" & _
* @+ i+ k, a3 F; _! t2 B1 p"Database=myDatabaseName;" & _% h) [( P4 S+ Y2 b/ v5 F
"Uid=myUsername;" & _) @2 O2 e7 n L
" wd=myPassword"' l, @. G5 T# p" m. L% i6 B% R
' M2 ^" g1 a/ B4 j 使用 Windows 身份验证(信任连接):, y8 r% c1 L% g5 t8 p" d
3 b5 d/ {; X9 a
oConn.Open "Driver={SQL Server};" & _
8 @$ y y1 A! x3 i I0 y/ U# r7 u"Server=MyServerName;" & _
2 v2 V- j% H# W"Database=myDatabaseName;" & _
, I# F5 y0 e$ @* m8 \4 B8 P; S"Trusted_Connection=yes"
; X( p8 J0 c+ z) u( E
. J$ L- s% c6 d 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
5 m5 D3 z* r* O/ u a* M1 v
3 G1 ]$ ~9 K; VoConn.Open "DSN=mySystemDSN;" & _
" Y" g7 T/ J; P! Q$ p' o7 [% l$ q"Uid=myUsername;" & _ ' Z# d9 I4 J3 D% x
" wd=myPassword"
% k- E8 a5 r) i+ r# I: J0 W
0 R. V6 [' i! O V: Y 如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:; p1 B, h* m. P4 W
, R) S( O. R/ D2 g$ Y2 T 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:- e& e3 \& `# {, S
! z5 g2 J) g1 v9 q) u/ L( ?
0 l/ f6 `6 N4 F3 r. \3 @2 V% z a1 H2 S; _9 _( T
1 J) C& ~. }7 f* S/ F
% u) T7 W7 N" r' T 2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如: 8 ^5 s4 p s; x. ?: ^- X D
6 p* V/ \2 U1 E3 y/ G
</P>< ><%# o; _* s$ |/ J! X' C+ E9 p, L
Set Conn = Server.CreateObject("ADODB.Connection")9 }* }( W$ P2 w* A0 @/ T
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"% C5 M5 ?1 @: M9 V$ P/ X
Conn. Properties("Connect Timeout") = 15 '以秒为单位
/ j# J; x2 h; w" w; R, I( VConn.open DSNtest
B4 Q3 W. b& N9 X%></P>< >
5 t1 B4 d: j1 P; n2 ~4 Q 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:0 q" V1 `( P! r5 B& Q7 X
8 B, O/ @ B" }& p W</P>< >Dim cn As New ADODB.Connection
& A" _3 w, R5 VDim rs As ADODB.Recordset
' ?7 F5 ]% ?" P( t# b7 P. . .
, a# V% V0 R% B A8 Ucmd1 = txtQuery.Text
" E+ a$ ~0 i9 M0 m' ^3 [* I* I; jSet rs = New ADODB.Recordset
( {& Z& A& A& ^" ~# W7 s+ `: N, Vrs.Properties("Command Time Out") = 300
5 h' J% e$ h" n8 C' X'同样以秒为单位,如果设置为 0 表示无限制
3 y8 p: S# m$ X! @rs.Open cmd1, cn
& `7 G M: v" Vrs.MoveFirst& G7 A% t/ }. B# w7 {: q2 g
. . . </P>< >
0 U! A7 o, T. W; W4 q! ~; W' s" j <B>三、小结</B>4 ]- R" e% S; P0 G, Y3 `/ ?
9 b, |- S5 @; A! }& R. ~
本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|