- 在线时间
- 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文件有相似之处。0 l3 q6 P" e" G* P- k8 r
- p, V; n7 ^5 I! b& L! c2 Y# P
# S, m& Q$ |5 E; K$ @: o: _& j1 O通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
; J& [8 Y5 L' F4 N3 k$ s
/ l0 |+ j9 I: B# A$ M1 j: s 当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:/ B6 z* ~# q2 R" q
7 P8 h* q# ?" W8 s, v8 S0 C N% T 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;: V! g" T* b% a# R
9 n, _( \) } ~# o/ q
2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;# c3 k ^+ R- a
. J) J b& {& U
3、 在"身份验证"下,选择"SQL Server和 Windows "。3 C5 x- ?% V7 a# O. u) q
# M% h8 h/ K3 f/ v
4、 重新启动SQL Server服务。' X( V9 _- T* |9 j
8 h1 ~% W U+ M# d
在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:2 J1 _: N: p8 L+ \3 W8 Q/ M
+ g' Z: p% k( ~/ K5 r 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;
: r, a% w+ t7 |& U1 ~5 u
6 n' z% F* f0 c z# X 2、依次展开注册表项,浏览到以下注册表键:
' c# Q+ L+ x# t3 S% F! v3 Y/ T
: A* i( |8 m+ O* n- I[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]
% K: F' a- N/ u, n/ P" x+ [
8 u; T" R6 z& @/ B* b* n! ] 3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;6 \9 \3 j8 X/ R: p, ?' n
1 E& L' p/ j. C' o+ U2 m 4、将原值从1改为2,点击"确定";5 O `( X/ V* f& M. x7 u: k
1 A4 B7 x( M: z
5、关闭注册表编辑器;' f; E) c) \7 p0 B
( m% a+ b( ^8 a7 ^# ~
6、重新启动SQL Server服务。
. O; }: |" h# K0 p: _
1 J' ?' x+ y, b: z3 D/ u* j6 d 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:
7 }3 Z. z& |0 y/ E+ e D9 ^
( ?6 @/ w. Y1 K& I5 a+ ` 1、打开企业管理器,展开服务器组,然后展开服务器;
1 w8 q. x( ]$ D) G9 y6 k8 a- b) F: T L, S
2、展开"安全性",右击"登录",然后单击"新建登录";
% x% Y- p/ n! Y" b+ k4 [! E. Y' N" {' v. z: o# e# ]4 O- q4 ?
3、在"名称"框中,输入 BUILTIN\Administrators;
: d; Y8 A/ j2 r4 ?. X0 x6 w, |- B, Q* A
4、在"服务器角色"选项卡中,选择"System Administrators" ;& U9 o: M; C8 e* l7 e% J) z# y0 E' F' i4 @
' g4 \1 K' O3 w3 }! V7 V+ u 5、点击"确定"退出;
; `7 l. ~7 T" s, \3 X1 L4 g* K0 A6 V( z& F4 b
6、使用同样方法添加 <机器名>\Administrator 登录。
: ]1 r H8 |! a9 U- Y" _7 D
& M- R2 D+ u. K: X& i0 F% U 以下注册表键
/ s( ]; H7 M: E+ w' g5 C w
4 @; L1 o# Z8 `- L; NHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode2 T: u3 w, X+ n6 \# `/ f$ F
2 k1 G5 z3 U4 Y: z; F4 _ 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。( E( D* U- K, u
1 {$ h; `+ A) _$ F* N1 |+ M0 w5 ? 看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。
+ n$ I3 v# r; ~" u" {- v! R( G5 H$ v3 t
如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。7 v/ a3 P9 v2 c. N
- u% b) _# I# {/ `( r l
要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:
0 `1 a" ~+ x' s% a$ X
4 m) l/ K2 R$ R4 g5 ]( A4 R; U 1、在企业管理器中,选择菜单上的"工具",再选择"选项";
' Z0 O7 o" w9 q# N) z
, \1 v" b2 Z% s- w 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;" z% c. c7 \) S
' Q: C7 v4 |( c: a; B 3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。
2 }6 A' X, A- j* \( f1 x. C5 `% i3 ^; w3 k9 U0 O3 t! W
查询分析器中也可以在同样位置进行设置。 < >; k1 \; Z! l* t8 q: U- @8 }. O
二、应用程序连接失败
" g6 I8 e! ~# ^) d2 Q( h; B
0 h' Q, D& S. d 以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:' E% ]( P$ [8 S& o: _
7 L) e8 Y3 @& ^4 O0 u; K
Microsoft OLE DB Provider for SQL Server (0x80004005)
+ @+ p. a/ U% S5 h, e5 i. ?[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
- g" ]) W G4 Q4 t0 n: I+ U( L& q1 g( m, K- y; m
Microsoft OLE DB Provider for SQL Server (0x80004005)
4 l; R5 f( G: [- J- g8 x/ ?1 ^用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。: P% z! A- Z7 d! Y
/ i# p7 G$ U2 }* vMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.
% A. H( `7 \1 P( `. b) O6 r; K[Microsoft][ODBC SQL Server Driver]超时已过期., s2 B# R, e% c3 z! p L6 S1 n' F
% X/ L0 x2 P" J( U
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。
) m$ J8 w1 W# V c; {2 E
7 U% u; |! u. G! \* P6 b
0 x! ^: R0 |5 \6 j5 C+ W$ V1 f" q( }
% S% x5 r( ~5 f2 a
( `, Z3 n4 v# R6 w 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:! r/ c+ E: `* t+ F
2 L! b, a7 i. D$ F
1、使用用于 SQL Server 的 OLE DB 提供者:
2 i, S# ^5 q5 g8 h+ W! L+ A: e4 S
) I4 X" s8 |/ M6 [' t 使用 SQL Server 身份验证:6 r( M' q6 ]2 }- z0 Y
" Z7 |1 I9 o! j: G0 ~. W$ eoConn.Open " rovider=sqloledb;" & _
3 H" x2 L# i; V! q& L/ M) @"Data Source=myServerName;" & _' B+ b$ K* o" u2 F8 H* V& r
"Initial Catalog=myDatabaseName;" & _; U! J0 r5 q+ l( b+ V
"User Id=myUsername;" & _
% i+ [ x6 p- }$ ~1 |; ^" assword=myPassword"- A" ^1 O0 }/ G, E' m
1 j& M6 c# O& l' f# o 使用 Windows 身份验证(信任连接):) V: Z0 R. S; X+ ~* p+ u3 m2 s
# f( s* Y2 s [+ R9 H' [3 D2 L
oConn.Open " rovider=sqloledb;" & _
* H: p5 {! W; L"Data Source=myServerName;" & _* f. r4 d d" c: p7 x }+ f' y
"Initial Catalog=myDatabaseName;" & _
: I4 z( t+ L, q/ Y"Integrated Security=SSPI"
_. P8 T0 F3 A3 A( e( o
+ e) U c* q& }4 t 2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):) _0 W/ `; @- J- q5 q9 I8 _
! j& M' b2 o# n7 m; e3 w/ u 使用 SQL Server 身份验证:$ v, W( a6 J* a+ `* _
9 h5 }5 B. W: b: ?
oConn.Open "Driver={SQL Server};" & _
) q: w8 \, \3 x$ T"Server=MyServerName;" & _
4 N! n0 ^0 q1 c' Z9 ~% R c4 m"Database=myDatabaseName;" & _
' ]6 e3 I. i) m+ |* y" }2 `"Uid=myUsername;" & _) A& t6 U; P# U* J: U4 P" [. p( N
" wd=myPassword", p4 @( y3 W( h9 P' i# X: m1 M9 ~
: w! d( P; J4 J: n3 E6 {
使用 Windows 身份验证(信任连接):
7 w, x2 Z3 q1 H( d( p- o
* B! W9 K) v1 _. G FoConn.Open "Driver={SQL Server};" & _
8 @5 Q7 J5 M+ ^! v/ h/ l2 n"Server=MyServerName;" & _( T4 v) v8 c2 z, F3 m M
"Database=myDatabaseName;" & _8 U0 e: `7 q2 H& l$ B, X% N+ l& F
"Trusted_Connection=yes"
7 E# _3 W& y# z* ^8 L
5 [' e% X2 G$ s' ~/ M4 [ 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
( p3 c# q+ m$ b: ?+ M- M5 W: u
, c8 y5 |+ s; r7 D& U1 R3 ~oConn.Open "DSN=mySystemDSN;" & _
0 u4 ] L2 e" |5 P# A3 `( H0 P& t! d"Uid=myUsername;" & _
0 M7 a9 J" K. C, n `" wd=myPassword"/ F' i, ?0 u$ P9 b; Z1 [
7 }$ W/ x" R' t" Z/ R
如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:- Y- t/ k, j% g+ @& I( a( y
) S; i" y" o7 c! E u; A 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:- s3 `* o- a g( f H
( t9 u; [ c7 {8 a0 f, W6 p! v# n. y
6 E8 G/ h# |8 u# A; M% _, L7 a4 A; v) B- z# \6 Z' s0 Q$ K$ Q& ~
2 o1 T' S! g5 _1 {; ]: r1 c0 ?" d: p( i6 ^, d6 _
2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
+ O8 _, k: J% I* F0 o+ D: V; O/ h% H$ h% V
</P>< ><%
; z5 b0 B& w$ k' M: z; C) ZSet Conn = Server.CreateObject("ADODB.Connection")- u j1 w5 G; o/ Z& K3 ~" B
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"3 `: T; g+ |* S% F' A
Conn. Properties("Connect Timeout") = 15 '以秒为单位
8 A) l. P, \" xConn.open DSNtest& U$ \6 l6 h9 A6 i' i+ k) a( w
%></P>< >
5 j z" h' y' M6 Z; l. T 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:7 M. H! R; d! m) q# N
7 o; g. u+ i" x1 P3 Z( z) W
</P>< >Dim cn As New ADODB.Connection8 w! W, x) w' U, i/ \
Dim rs As ADODB.Recordset
+ j( ~1 ]5 @ _& h3 v. . . 2 @7 l, G5 A W: @( f4 W7 L
cmd1 = txtQuery.Text2 u7 V. c5 g! P( I* n, o S
Set rs = New ADODB.Recordset3 P) l2 ]+ h: V! } g2 s/ U
rs.Properties("Command Time Out") = 300! |+ `$ r7 z1 i( ~8 \/ m6 H
'同样以秒为单位,如果设置为 0 表示无限制
( v4 B9 r: t1 u; A4 M% o0 ]) g/ prs.Open cmd1, cn1 z8 w( Y1 O' X, s7 f) q
rs.MoveFirst! z1 I8 G- o' G$ o
. . . </P>< >/ H" u+ v; o. _" X7 T
<B>三、小结</B>
# r, @; j+ B. p; ~+ p& R0 O
* ]1 Z* @5 a. ^7 T* X) m- A% y5 v 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|