- 在线时间
- 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文件有相似之处。
: G4 Q5 y+ L& b. J4 o3 N* U# \
2 \0 ?5 j) r& M; O 2 m2 Q% Z) T% W- b! t( h
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
! R# q2 O* Q% {8 p5 d5 R1 I. b; }3 j7 S5 n
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:
( X2 \' H/ w/ V
$ B x; C$ V/ q o* g: R 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;: J; F$ w& X9 g' J3 |
9 w; V- O' P; C/ g, G 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;$ F3 \" I* G/ J% M4 _0 r7 y& h
- O# ?/ m# ]$ Y% Q
3、 在"身份验证"下,选择"SQL Server和 Windows "。
: h" O f5 p) G& E! B% n- T8 c# x: h8 |9 @7 a( x L
4、 重新启动SQL Server服务。
6 C Q8 c! C6 m1 E2 s0 h8 ^5 E
2 O/ x0 M; W: v w' I 在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:9 b7 F3 _, y9 H- S2 L! m3 ~- @+ v$ Y$ r
3 \: d( |* y! _/ u. s1 J2 k% _ 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;# I4 { @4 U+ w
) t1 x0 a5 {8 m8 G1 J- X 2、依次展开注册表项,浏览到以下注册表键:
" C) \( z8 \; z7 X: \0 e/ W3 o5 q/ J' G
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]5 ?/ {6 U- E4 l# P: P2 [
$ v! b& ?+ o4 K
3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;
! I* |9 C( a3 M5 G X/ `! z
. U9 S' ^6 B5 M6 n1 Q R& |* X: I" i 4、将原值从1改为2,点击"确定";
3 i. N1 j& F* J$ w$ O: W/ ^* {: v' e- U
5、关闭注册表编辑器;6 @ ^5 R3 ~; ]
7 p7 K3 @8 n Y% |( b M 6、重新启动SQL Server服务。
8 N7 X/ {! Z+ Y2 k5 r( A4 S$ I z, V, ^1 |6 l- G
此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:
0 b0 w4 d$ |% o% K9 X% z
, A x% y% `! `2 i 1、打开企业管理器,展开服务器组,然后展开服务器;
: ?2 ]% L8 g/ n" j$ r9 Y. m, n) Z: b
2、展开"安全性",右击"登录",然后单击"新建登录"; X5 [/ J& J$ d" [# K3 [) f
! Q: ^/ m }% @1 S 3、在"名称"框中,输入 BUILTIN\Administrators;* d' h: E$ `1 t& K) [
. n* x7 M1 D. y+ p- L 4、在"服务器角色"选项卡中,选择"System Administrators" ;+ p7 E/ K( Q L% Q0 F, F
7 W+ X3 ~ J" \5 t: H% N
5、点击"确定"退出;
) m' d; Z7 C' R! T& Q2 G* p s
" B& m5 c& l1 F* D 6、使用同样方法添加 <机器名>\Administrator 登录。7 T3 }- {: k0 m! B1 }/ d0 i; A
, c) z( s' T, _; G! a0 D6 r; _ 以下注册表键
/ ~ M+ _& T/ J# t0 u3 K
- H6 d. }- A0 `7 g jHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode1 z: m& r% H; ]2 n# A
" o `! A+ P0 @; f$ \4 v. f$ O 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。( ?* X7 _3 j5 P$ `
( Y% n% v" o7 {6 |: ?
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。* y7 q6 p7 P y* g& ]
# q1 D' c0 Q1 @! D3 Z1 J/ q 如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。
% V2 ~0 ] [- l, y/ R
% ?0 b+ g! I) n; W6 G( @ 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:5 o. F6 N9 g) [( o4 G4 y) T& |
$ m# l; ^* {' j2 ~# Q
1、在企业管理器中,选择菜单上的"工具",再选择"选项";
6 _8 K1 S* f$ b* N2 U
4 F4 V+ z0 B' c/ X 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;3 v6 f, b$ c1 B( y i7 _
# i7 E& d% Q0 y
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。% w5 m' [0 b7 [! H
* j% j, `/ Y6 K, B' E; K: s6 ~ 查询分析器中也可以在同样位置进行设置。 < >+ K1 A) s& \ N0 p* G0 T
二、应用程序连接失败/ e# G$ o8 G# u. Z1 c3 l+ M: D
) W7 h' `6 D* |
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
. Q, E9 @( k* s. X) O% a
1 {+ `* u4 q% ~Microsoft OLE DB Provider for SQL Server (0x80004005)
+ P3 o) X7 f6 k: r" U- M" i[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
7 \8 j) ~) a! A- a/ [# d8 R
6 I7 p/ I1 r+ g# u, N! _Microsoft OLE DB Provider for SQL Server (0x80004005)' ]* ~' n7 E# h1 g: M0 b9 u# P
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。" p. h1 S9 G% M" P
" ?$ U! D% B X# S
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'.
0 K* K) r; T: a: N% A[Microsoft][ODBC SQL Server Driver]超时已过期.
% X7 D; M. V; i3 J' p4 O; _4 _
6 r5 `- y2 S" b# r 首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。2 p% p3 [/ v& Q- R+ W* x
5 O, o' s a% M: e
3 _) X0 w/ A! G c- u( d4 \
- p, q, w/ Y4 i0 X& y- Z
7 m: c- c# p" t& `0 A; g9 v 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:
! m8 [4 d5 o. t" b; [/ D6 \
; {; s8 K: ?1 W" y+ |+ s 1、使用用于 SQL Server 的 OLE DB 提供者:8 Y! w/ }5 |. b- K6 ~/ g- S! V, s* i) f- f
; ^# z/ U- m+ z- c' ?" k% {
使用 SQL Server 身份验证:
/ m# ]! J! |5 i. {! A1 X9 Z& F$ R) c" C
oConn.Open " rovider=sqloledb;" & _
' ~: G& b* x. s! x"Data Source=myServerName;" & _
, W9 [7 ^- X# e. k( y# e( s1 G"Initial Catalog=myDatabaseName;" & _; M& ~" r" B5 S( P6 I. R; ]
"User Id=myUsername;" & _
$ q- ~0 A6 D# k: C+ e1 r2 a" assword=myPassword"
2 D! G. Q4 e; n# R
" j5 x' W: b9 Y' Z 使用 Windows 身份验证(信任连接):$ g" `- A- X- k+ y. S0 {' ]3 v
6 x; L r, T& W5 T/ m' roConn.Open " rovider=sqloledb;" & _9 `( M8 h: s, E
"Data Source=myServerName;" & _8 M; o; ?0 O; N# U; B
"Initial Catalog=myDatabaseName;" & _: z3 g# |& `. Z
"Integrated Security=SSPI"
) |2 v7 V8 f' j+ w9 F
1 q, q+ p+ C9 P3 H) k3 \+ e+ u. _ 2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):
0 X: V. _' v1 g# P! @ `
( s9 z I; _- s5 x 使用 SQL Server 身份验证:7 V$ m) H3 M* {3 R# E# T
. L) X: q- q, ]4 ~' g& l+ AoConn.Open "Driver={SQL Server};" & _ " }& u) R$ i( R+ e, i
"Server=MyServerName;" & _& T l- Q/ p1 x W
"Database=myDatabaseName;" & _. F% V: B( W0 O v
"Uid=myUsername;" & _
2 p/ h5 K+ i5 X% X" wd=myPassword"0 M6 |% q! S5 S5 w0 V: [& O- |: P- j
3 \* X$ K. z5 t' W
使用 Windows 身份验证(信任连接):
8 w* `% m, \, e G7 X$ y" S- m0 Q; H" x" J j1 Q' j& i9 Y
oConn.Open "Driver={SQL Server};" & _ ' d* f4 F% S. E# Y" r4 `* n
"Server=MyServerName;" & _
0 p& W) K) T9 i4 l% g"Database=myDatabaseName;" & _
7 _5 J( T" r5 k0 v: i9 B"Trusted_Connection=yes"% Y8 z9 t: ~$ k! _' h
6 X; o+ O# \/ M: N2 L
3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):/ H# X& E' J B1 v6 V
0 k& o% {* F" ^/ h
oConn.Open "DSN=mySystemDSN;" & _ ( g: V5 M1 K0 }/ f x( q2 ]& Q# Z
"Uid=myUsername;" & _
' s; c! U! h9 z: u$ G" wd=myPassword"' g+ j+ i' B& R& C4 m
: ]3 \1 f$ Q' |2 k) D2 l) w
如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
, P; K* ]+ R1 _8 d- b9 t4 x
0 ?3 K6 U: `* H3 n9 m4 o' m 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:' D; P' c9 B& U5 I, V: J
* P Q2 |- L, x6 {9 b' H
% F8 n. C$ ?+ D* ^! }2 A
: y W5 c# F/ W" n9 X6 b
( R) S( u- n5 ?! J" Z" x. c
" _. H7 ]. t+ v) } 2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
# G# _! u; u+ f# y5 O$ y$ `* _( S0 k: d# F2 A8 a$ w
</P>< ><%
+ r& v5 V3 I; LSet Conn = Server.CreateObject("ADODB.Connection")- V" I' y- U) f- m
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase" d" }! _; C9 Y/ ~$ \
Conn. Properties("Connect Timeout") = 15 '以秒为单位8 o( P; d6 a2 T5 T- J
Conn.open DSNtest; x$ d8 l6 \: _6 D1 j# u" m
%></P>< >, w; h [$ ]3 c/ u' ?' ?
3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:* v- U H# b" y! a
) U6 ]2 e; g* l' o
</P>< >Dim cn As New ADODB.Connection: h# B; H) n- S, y
Dim rs As ADODB.Recordset
9 |/ ]- ]5 Q# R1 G. . . 2 C& \ w# Z8 P5 I
cmd1 = txtQuery.Text
, E" D% X2 d: X( HSet rs = New ADODB.Recordset; V( X; e2 q) T* G- {
rs.Properties("Command Time Out") = 3005 S2 s u* m# l& o1 e2 n
'同样以秒为单位,如果设置为 0 表示无限制
1 s# H! Z% Q s, {rs.Open cmd1, cn- Q3 M0 j* F( I7 N" S
rs.MoveFirst
1 W6 `7 J* }* N% A. . . </P>< >! W$ I3 P$ r4 O, W6 m- m2 k' b
<B>三、小结</B>) ~1 a& g& _9 D C, Y
: d/ o/ [& o- i/ b9 X( m; g% O 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|