- 在线时间
- 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文件有相似之处。
( O! F; y D) {! s/ c; \: X
4 A5 v# N1 N# O+ i7 f# Y
; N& Y) R6 u$ p通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。* m/ l, o A" n* v4 c
+ p' ^' {5 W' R$ L5 N+ Q
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:4 k- h z3 F/ Q; I, W
, z/ ]2 u: a) L! j6 ^- c. | 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;
1 `, \0 A1 _' O v" s7 [4 |' f. H' y! R7 I6 j, w
2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;
* u* w9 ~# b. R8 `, k( ~% Z
8 j* z5 Y0 m x' W% | 3、 在"身份验证"下,选择"SQL Server和 Windows "。
% R9 A) H/ Y' \- a2 V
. k3 D1 N1 i; f+ \! L 4、 重新启动SQL Server服务。
6 d7 w$ |' ?0 L7 [( }; H' w, u4 ^; [1 u
在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:- @$ x+ K% a. }4 {* X
+ b! z |+ P) J& [ 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;
6 g: v6 _- E" K5 Q8 E% l+ F8 j3 @" g! j$ `) V
2、依次展开注册表项,浏览到以下注册表键:
' k& A C! s+ S/ s$ K ]4 t8 k. l7 i- I8 s# n% f
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]: n5 V, D' g. n) B6 C! S; d. h0 s
9 G1 [3 @( a! p8 } 3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;
$ x4 }4 D' H0 R+ D3 o/ _! ]/ B% [+ l& y
4、将原值从1改为2,点击"确定";
, M! [, C5 Y% g! o7 c, m8 I9 L' h; R- w1 @; B
5、关闭注册表编辑器;0 l! c% v' p, g: E$ a3 }
* Z/ r/ D6 d4 l& i3 n( N% V. n$ Y 6、重新启动SQL Server服务。
& I! J( {9 U) Y" U6 r. d( {2 F7 l3 z0 o
3 R* K1 N! @9 m* w; A9 k. g9 e 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:2 V$ f) R+ P. f$ C
( P8 q: o' ?, s$ v. U
1、打开企业管理器,展开服务器组,然后展开服务器;0 p; i3 L- @3 o; p3 D3 @
# l5 p5 P- x6 G! R
2、展开"安全性",右击"登录",然后单击"新建登录";
! O. O, ]9 [. f# k M3 U
6 `0 L! ?; f0 _9 _- d; z, O# J 3、在"名称"框中,输入 BUILTIN\Administrators;
) J, W I5 ?. Z5 b& b) c, `# t1 t( }% K' W3 p
4、在"服务器角色"选项卡中,选择"System Administrators" ;. r6 E3 m$ w+ R. f" o9 y0 m# Z
q# V+ o, `- I5 p; u& h4 w
5、点击"确定"退出;$ ?) A+ e, u! w
" t1 E$ y; N" ^! ]# u
6、使用同样方法添加 <机器名>\Administrator 登录。! E. N/ \3 t( ~1 ^8 h0 o9 t+ W; T
% D6 h9 `1 M& E+ l2 D' F
以下注册表键
( t6 r [! q- t0 z/ P% O% s3 }, h( f- w/ d* y$ w. E
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode- M* k" d- \0 n& l% E: x3 m6 B; W% ?8 n
3 u2 g* y% ?4 O* t1 E, z1 n 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。
9 ~% K+ r) T; u# x E
+ e( P; `" ?- {: M6 h$ B P6 m 看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。
, P5 [. x t ~, d8 p8 `4 y8 _ J2 Q" ?+ f
如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。0 n+ j4 {: F) p- U! S' p( b" v
# h0 ^% [# A$ L 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:& U3 n% Y" Q/ K4 e2 H2 q
8 ]. U) r$ h7 x" v l0 [1 Y 1、在企业管理器中,选择菜单上的"工具",再选择"选项";+ m8 s! {- x l6 V% T; {
2 f+ l6 J6 W3 {0 ]) S9 H 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;
9 h4 ?5 @& }- E* F: y0 w, N$ |5 g2 B1 R, \ w9 l) F- c
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。0 Y. E$ b# E( b' p
4 b! v. f2 q1 _ 查询分析器中也可以在同样位置进行设置。 < >' A4 z3 M9 R) G4 J8 f
二、应用程序连接失败
; |. k a, D5 j2 W* N1 m) D; D) k, w `! }# {* Q% A
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:& [6 |" o) v# p" @- g6 K
! m+ ~2 l2 l8 }5 S$ _0 H
Microsoft OLE DB Provider for SQL Server (0x80004005)
5 a4 P/ w1 e6 [5 _[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
) B$ P' s! T, k! A6 A2 A5 E5 H" A6 T
Microsoft OLE DB Provider for SQL Server (0x80004005)5 _1 u- q1 S: N- M
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。+ X* A1 k* Y1 ^' E. g6 {
& A4 b1 a2 w) ?% w, q( f8 B: V
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'." |1 ]! G! v' l1 X# w
[Microsoft][ODBC SQL Server Driver]超时已过期.1 g K' G2 V7 Y' P; `" J! G; V6 n
2 Q( F W* Y7 ^8 ~
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。7 Q; j6 s; g% |4 v" M
2 H" X, @6 Z' ~& O
) Q; G" A6 p* V& l2 _' C9 x
5 K; i4 ^5 D7 v4 G# v% i6 |% }3 P* W5 N7 X# _6 o' v' w3 _5 @# a
从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:& k- K( s7 M6 ^3 t
8 U' _; w4 H$ |* `) A 1、使用用于 SQL Server 的 OLE DB 提供者:
3 B5 G( z- W: u6 K6 Z
7 d9 r0 t7 ]5 g. s) I- I' r/ S 使用 SQL Server 身份验证:* r" m% l5 E \( [. D/ Z. o
& X& V% U2 `% ^" q' s9 ^9 RoConn.Open " rovider=sqloledb;" & _
* V. k/ C- \& V- l) J"Data Source=myServerName;" & _
6 O" s& ~4 _; n( v9 C! W"Initial Catalog=myDatabaseName;" & _
9 W. n! {) V0 S) T% l9 D( U"User Id=myUsername;" & _
0 }) M$ i, n: ~7 L$ J+ W" assword=myPassword") m- w: p a2 V: C1 ^, S
/ V$ m9 v% o9 X7 [( G; V3 L' y 使用 Windows 身份验证(信任连接):
& R' P- X/ g8 j9 E; Z1 w+ x6 I: S2 Z7 Q: w: s/ Z* j1 d+ b
oConn.Open " rovider=sqloledb;" & _3 r. O2 A! ?( z# A
"Data Source=myServerName;" & _
- j% n" R `, ]1 \4 t. X- x$ b"Initial Catalog=myDatabaseName;" & _( Q p6 h6 X7 _ @/ D
"Integrated Security=SSPI"1 c6 y: ~6 G8 @) W7 L+ V
( Z; ~' _, R+ s) K 2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):* o! D3 R4 Y' [$ |0 @# O
) o9 w+ ?6 q% J% } 使用 SQL Server 身份验证:
+ }' H* r0 {7 a0 H* @* [# n; Y+ X _3 w( V4 L! B, w3 [
oConn.Open "Driver={SQL Server};" & _
5 y/ C5 g. y* G* N4 h( e2 q8 B! K"Server=MyServerName;" & _
6 [0 \/ B, X& S7 x# W* D* d# n"Database=myDatabaseName;" & _, |) V$ P% K* ?: n: s- o% c4 x
"Uid=myUsername;" & _
) P9 T+ H: Y7 Q% t" wd=myPassword"
% l% e+ }5 O; e- N0 H _
+ K8 | Y3 `6 _( y2 g0 O/ B3 ~ 使用 Windows 身份验证(信任连接):# f4 N3 `3 q* c, z
2 {/ L: J/ Z) F/ D E- CoConn.Open "Driver={SQL Server};" & _
9 {5 F# C+ i: R"Server=MyServerName;" & _
4 A. |/ E+ o: d$ l/ ["Database=myDatabaseName;" & _
) a3 O! o+ O& p# f, N( ~ w+ b"Trusted_Connection=yes"
! h2 l8 x8 {- X. }
% E# G' w% n4 g) p l( j 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
- E, S- o* r$ S& t- @
. h) }/ l$ n+ S% q A; t6 N- O" ?0 HoConn.Open "DSN=mySystemDSN;" & _ ' J& h- O/ L6 A5 J" U& ]4 @+ H
"Uid=myUsername;" & _ " X$ b9 d. i }! f2 A& p: G( N3 Z
" wd=myPassword"7 [% R/ A& a9 j7 `4 o1 t( e
6 v; _7 o2 L( @& k 如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
: o: a1 Q5 P' {0 O( G* [& ~4 C4 |6 O# Q$ d
1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:3 W2 n* |2 |9 T8 r1 g4 x7 q
5 Y3 b9 W L% h; u: }# R7 r- Q
5 T% J {/ }* v5 w7 [+ t
8 M# }2 e% Y8 Y0 D! f7 l6 b
6 a: e' ]! }; B+ s/ m$ y
. X- \% l5 d3 A3 ~% O, A; q/ R
2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如: 4 g3 L& e0 ^( ` }" X0 r
A- @% H( {# y8 D' ~9 k</P>< ><%
U4 W! h2 V' e; j- ?, jSet Conn = Server.CreateObject("ADODB.Connection")
4 w( p' t; V$ HDSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"
" H+ Q8 x- A: I1 ], I% l4 {7 bConn. Properties("Connect Timeout") = 15 '以秒为单位2 `2 K3 [5 }% f H$ k7 p
Conn.open DSNtest: ^6 G3 _3 w* q: t H
%></P>< >
. p5 a! m! ]$ r9 o$ l2 l) C1 w 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:
- s* [( ]8 \6 z4 F9 W8 e6 |2 I# P% \* D
, D$ x$ j" C+ z0 L- z8 m% F</P>< >Dim cn As New ADODB.Connection
% a: L0 I$ I: @Dim rs As ADODB.Recordset
( B, V; g# S7 k) S& | M/ L5 _( I. . . 3 `/ Z" g) G0 G6 X6 q# d
cmd1 = txtQuery.Text2 L# c0 j/ J8 t1 b, v: k9 F% O
Set rs = New ADODB.Recordset
4 e4 I) i3 s( C) ~6 ~rs.Properties("Command Time Out") = 3008 i& @' M: z- ^6 K3 ?; @" X
'同样以秒为单位,如果设置为 0 表示无限制
7 |8 ^' d4 L G* }. g( @rs.Open cmd1, cn& E+ l9 Q' ~6 Q
rs.MoveFirst
9 t& a( Y k. {$ T7 Q. . . </P>< >! r/ S0 `1 Z2 y2 J5 O" G1 V
<B>三、小结</B>, Q; X2 g7 ~' U3 X6 f( k/ i, H
3 W" c9 p2 X* y4 C" g
本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|