- 在线时间
- 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文件有相似之处。. Z6 ` C& [7 E; r
, |; y: x7 {4 k9 ?6 f
4 K7 I3 W" H6 w; n
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。5 G/ X: z: p- \- p/ ?
9 i. K- t. F8 Z/ B5 I5 k: b
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:
+ f3 D( z+ Y- Y- e. r9 @$ l3 } z3 e G4 g. i" X0 {
1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;
; A; }( w6 U4 h" d2 P
7 h7 `# n4 u# C, }4 n) B1 ~; B5 ^ 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;
q& _( E7 f" Z+ ~, N! ~7 Z
% j' l: L: h1 h. ] 3、 在"身份验证"下,选择"SQL Server和 Windows "。" M" n- X7 Z7 m7 E0 W. o8 m
2 r9 P' j2 z2 _) }( Y- V9 y5 _
4、 重新启动SQL Server服务。, Y9 e+ l, o4 Z8 @9 r# ?
* \$ D4 }1 r# j
在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:0 w. U& a) ]( H6 g
' t8 o' E' u7 B% M9 v. t; N+ S w 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;( M* |1 Y9 X2 u9 t5 b7 P/ Q' h
+ {6 }! k- L( ^1 T/ ]
2、依次展开注册表项,浏览到以下注册表键:$ F% b1 F. e8 w A0 E
8 V9 K2 ?" x7 M$ ^ b1 X
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]$ Q/ P9 V# S3 e" B
6 P: ~% ^) J* P$ r 3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;+ w2 w) `$ Y7 O6 p- D
+ b: [( G" h* Q: `
4、将原值从1改为2,点击"确定";6 m W3 ?/ v, J# M$ l) L
1 b" w4 N8 c$ Y. s' \9 h 5、关闭注册表编辑器;
5 X7 y3 I8 }( F, H3 q* X
- ]5 [ g6 ? C+ u3 F# q 6、重新启动SQL Server服务。. H/ Y3 L3 @2 D/ G1 X, f
* F% h- A$ G' o8 [: M v 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:* ^8 A/ u) F5 J9 j. Z& Q+ p. f: Y& s
% `# |$ L, r- Q% c6 w
1、打开企业管理器,展开服务器组,然后展开服务器;
$ F+ a5 q' h% q1 ]1 B6 f) @# W# `& e
2、展开"安全性",右击"登录",然后单击"新建登录";
" a% ^! P" h. A$ c1 [" O" s3 c4 N/ Y, r; W
3、在"名称"框中,输入 BUILTIN\Administrators;# }2 H" [1 V: H) c0 \0 n2 G
2 N6 r! g& _" g9 @' ~; g7 c- p 4、在"服务器角色"选项卡中,选择"System Administrators" ;
- H! V5 [0 u" w- ] i" |6 }/ a6 T* Y1 `
5、点击"确定"退出;0 t& p/ ?' L3 B5 ~/ i+ ^/ l
8 m2 U8 h9 w! S* s5 x$ J
6、使用同样方法添加 <机器名>\Administrator 登录。
! m1 R1 |5 L- ~! @. M, U1 V& J4 D; D$ J" B7 }. `& ]
以下注册表键9 \8 i) }$ d4 Y; V& S8 t) S* Z
V \% Z' k' f. B5 Z1 @: ?% OHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode8 D9 D) ^# [6 a
% N3 p3 h' q9 ]0 g$ z5 f* ^ 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。- j! k% N5 C# h' r, E; b
- e/ A* ~ ~* f( `- {8 o
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。
b; p& r/ j/ E3 x2 S p2 H
4 O) a9 F+ }+ ?: n. t) ~ 如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。. Y: M, j% h9 p' f% V2 ^5 f
$ N; L8 f( M: o8 M6 Z/ g 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:/ s# q7 d$ ^% D/ J! L
% k. @; F/ S' L 1、在企业管理器中,选择菜单上的"工具",再选择"选项";! k" F9 S: B+ u2 U5 T/ l6 a: j
: I; s; M+ ]/ t! o3 u# U; F 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;1 |! }$ Y7 w w+ [. M/ C# I
* i; n' G0 r( @/ a" l. N 3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。3 O7 L% x+ A! \' J
+ @: V. ?- |1 z% ^ 查询分析器中也可以在同样位置进行设置。 < >2 ?3 Q$ y4 |; T, O' d- W
二、应用程序连接失败
, E+ ^* o1 R7 L6 u! ]5 ?( h! n- f! n: U1 [# A8 K. R6 O$ h7 P3 x
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
, b8 ^" S k: a7 A( P) W! P, r Y+ A! I Q0 i
Microsoft OLE DB Provider for SQL Server (0x80004005)
. z4 A& H+ S2 b[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
) V0 \8 E# A+ B
3 ^3 b" O) n1 h- [Microsoft OLE DB Provider for SQL Server (0x80004005)- a/ R$ g" ^, R7 i) l3 ?5 i
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。" X5 H: e2 q4 Q7 k
7 [: O9 m p: g/ F; ~; W tMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.
- p, I# w0 M% z2 T* s[Microsoft][ODBC SQL Server Driver]超时已过期.$ J* _8 R- V0 S4 F8 `' ^$ O4 v. L
- p* s I3 W6 [9 f: I4 f! l% y
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。
, d) a. q% `8 \" q$ D# t
- e/ Y$ W; [2 A
: e( X N/ n4 V1 y6 a( Q; l7 n7 ^
0 m1 M' K7 C- G4 @4 w
! m( D. z. P6 c) p. V8 g 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:
; x, W# J( o; T' k& K; o: J8 w1 z6 X0 V! v/ n0 r: y/ F
1、使用用于 SQL Server 的 OLE DB 提供者:/ d' K7 j2 z) G+ t; t1 r
: |7 L- w' Y3 ~5 e8 f! G& b% u4 S3 q8 w
使用 SQL Server 身份验证:+ ^, ~7 ]0 `- |
' u, s" a% z! V% X- l
oConn.Open " rovider=sqloledb;" & _ ( v* }: A8 ~2 N. D. n' D) ~
"Data Source=myServerName;" & _ Y# s D. a r h
"Initial Catalog=myDatabaseName;" & _
& B1 ~" s% U8 `"User Id=myUsername;" & _: `8 G5 ]- r8 q
" assword=myPassword"
7 W: r- |( n; D; z/ ?4 P+ }2 I" Z
1 d/ C5 J6 X4 J4 E6 Z8 w5 P$ C/ d 使用 Windows 身份验证(信任连接):! ]) y5 Q5 |! R& T/ {9 D: T* R
. m+ x9 _* O, z1 x) U% d/ soConn.Open " rovider=sqloledb;" & _
8 { Z: Y3 ^6 f3 y% V"Data Source=myServerName;" & _
( _* r8 z: X4 l"Initial Catalog=myDatabaseName;" & _
3 G K( c( s. a2 u"Integrated Security=SSPI"
' ^4 J2 o! x+ q7 H$ L# {
, v3 m- a1 M/ Y% @! i8 K/ i 2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):
* l3 B$ s' |7 i3 W& S' r d. q) g! j0 f7 M
使用 SQL Server 身份验证:; D+ _; T2 d9 J3 k+ X h0 _/ z! G k
1 G1 G2 C' n' W+ y5 EoConn.Open "Driver={SQL Server};" & _
: i; r5 ]. i8 b"Server=MyServerName;" & _
% d! x; L, ~, F, c"Database=myDatabaseName;" & _
; N' Y/ Z$ K9 z0 ^"Uid=myUsername;" & _/ }4 P& B, L) y. u& ?5 J
" wd=myPassword"
. @9 m0 \( E0 r- T1 w: J; m2 W5 A: ?
' b5 ^% V5 a& Z5 ^ 使用 Windows 身份验证(信任连接):" g7 h0 ?! j5 d
6 l2 f Y' Y( R8 Y' [
oConn.Open "Driver={SQL Server};" & _ 5 X+ ?: H4 p$ U2 ]
"Server=MyServerName;" & _( s$ \. X" B; M/ x! H a
"Database=myDatabaseName;" & _" n) x" U% F- V; o& }
"Trusted_Connection=yes"3 N! r2 g: M1 H) |+ ?) b$ T# }8 O B
# Y' m! P# ]# R7 E
3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
0 K, F9 h5 G# |* M5 {; B! S2 L
4 q. a! e" b# @2 @oConn.Open "DSN=mySystemDSN;" & _
% H$ C9 n7 a [+ ]* Y2 L: m+ M"Uid=myUsername;" & _ - B" s+ ]1 Y. Q
" wd=myPassword"6 g1 k: |3 [& W1 F' i
6 u, p2 a; {8 i6 \& o" W 如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:, W# `# ]- P+ Z! ?+ ?! U9 j
0 Q7 k( N2 Y7 h2 p2 p" T
1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:( t' x; `$ g+ V6 u
. n$ h4 t+ u, x x
: s' Q$ U6 v9 _
4 R, p& W0 L- O$ ?* e
' ~6 F7 D0 t N8 R( ]: L/ Z
' ~; g" M1 V3 E1 c* G; X! v
2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
+ u9 p. `7 u M' g# I- S( k* N8 \: p; U! P
</P>< ><%
) K- B7 W0 m- @7 _ `: I4 a8 RSet Conn = Server.CreateObject("ADODB.Connection")$ Q1 d$ q# {* o( z: t- D. Z7 x
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"& F" N- N; _) T. d$ a. W$ |, I
Conn. Properties("Connect Timeout") = 15 '以秒为单位
3 P' R. z% j' j& HConn.open DSNtest
! j+ w+ e% ~, `* a! O ^4 Y g%></P>< >
" e5 _& @( D3 w+ @# V. N0 y- f8 I 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:; r; `9 z: E# e3 Z5 {& j
6 }/ P6 i, ^' U</P>< >Dim cn As New ADODB.Connection
' K. h0 y5 c2 t& N) o5 g& qDim rs As ADODB.Recordset
( u* o" X" Z1 x- d$ z. . .
+ w9 r' U7 {* `+ W) Bcmd1 = txtQuery.Text7 b3 i% o; K+ n
Set rs = New ADODB.Recordset' A' Y, Y- }! `- K7 \
rs.Properties("Command Time Out") = 300
0 p3 ~: G6 C9 z \5 `9 d'同样以秒为单位,如果设置为 0 表示无限制
; I8 K" \- T' O# srs.Open cmd1, cn
6 F6 H3 h$ ~! N, A& `( Ers.MoveFirst
. T. L. I1 ?- B# c0 \6 Y. . . </P>< >
2 r! x. T- O: ?" r- N* p <B>三、小结</B>
$ a3 O+ P- |4 o5 w# J$ _8 ]' ]
/ a7 g4 r" N: m; s8 W 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|