- 在线时间
- 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文件有相似之处。2 h% O+ J3 C, C* k, i" ^0 D
' ~. |' K$ h2 R" @
$ X/ R& C" `; `6 n j通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
" C+ K7 J' @" E' S" N/ ~9 T
; f' I {3 u( F3 a) G 当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:& w0 j8 j* b7 @$ P- A( ~' o
; J/ B' a! `! ~ 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;8 g* h y" s8 a" {
6 v: U! E2 q0 w# l, H4 p# x6 ]- d1 C 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;* l7 j3 f& H" n, Y- ~, p9 B" Z. o
' E7 f! X* K1 m7 b* K1 ^ 3、 在"身份验证"下,选择"SQL Server和 Windows "。7 D2 w# d, K6 ^/ K, Y* g3 Y
2 N6 x9 i, ^6 g
4、 重新启动SQL Server服务。& K$ [9 |: s$ E' P
5 E; R& m$ l8 P% g* ~) V, b/ v 在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:
9 l6 g! \9 ~/ a+ W9 ]' ~' s, s& l4 W Q/ |: G
1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;! T8 g: K$ L3 Y+ {8 t6 C
) \: F9 e6 Y! x2 I; o8 ?
2、依次展开注册表项,浏览到以下注册表键:
: h; h: c. N( i2 y
9 h( M: N4 w* u$ `* [1 V: l[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]
" l" x8 p- _$ z! v) h8 u" M$ Q( f
4 y. Z+ _8 ?- b8 n" d 3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;- M/ s' ~; z: C! f3 m0 L( l
+ n+ v! O8 z* x9 I# R
4、将原值从1改为2,点击"确定";, W X& J: t2 R6 [
" M% f, j4 `. ~- {2 C, K( p/ H( c0 ] 5、关闭注册表编辑器;
3 C- @ M! T/ ]: h
& i# e/ Y" B/ I3 E& d& I 6、重新启动SQL Server服务。
) x( W" t, D/ G7 Y8 ^ f: F4 Q) q5 Z- l; F8 v
此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:
! i* Z+ j/ t7 [8 I! B k. _' v, I' ?' R; t% x; O% G
1、打开企业管理器,展开服务器组,然后展开服务器;) v, j7 S1 }( a9 |. T
8 `' ?/ n/ A5 x) ^' U: q 2、展开"安全性",右击"登录",然后单击"新建登录";
7 W% J/ P: R5 J9 l1 f
# w8 G) J8 W+ Y* Z2 u1 {. r4 e 3、在"名称"框中,输入 BUILTIN\Administrators;1 ~( ?# D% }. ^: N
2 U* H# p: H- c# f
4、在"服务器角色"选项卡中,选择"System Administrators" ;( Y) e! g/ Z/ ^2 {) ^# J
9 e9 m3 x# k6 f$ y 5、点击"确定"退出;" E6 c" v5 e1 g' b
8 T+ n$ V9 o9 U8 l1 ~" d 6、使用同样方法添加 <机器名>\Administrator 登录。
5 h& g1 ?- q" R L2 s
% u* n! D6 ~& b$ y7 f5 h 以下注册表键0 L8 D( G* M4 ~ p y! ]+ i
5 h1 y3 O+ t2 T8 i7 Z; o5 O
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode. J U. |# w/ I0 _1 r- g8 |" |
# a3 Y) G" W; i1 `& Z" h2 I3 E7 o 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。$ P8 D: v2 D% k. i% u4 D
l; _7 H2 @6 @
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。
0 O, \* O8 L* `" G
) H# v! ~" j! A 如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。/ y7 H: c) @- r) m
. G( Y& h. A" B' d! n- c/ B
要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:
- a; ]+ a F+ u {2 b7 m. g* ~# l. P) P E% _7 s' N
1、在企业管理器中,选择菜单上的"工具",再选择"选项";
4 p! b2 F0 t3 H) b! l. C/ k
# l1 e2 L W9 x9 @3 D 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;9 H6 e+ y# E& D/ y# I1 F
/ {: x7 z. o* ?
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。
* _( j; B) R5 x- e' E: Z$ @ ?0 W: ~6 ^) T6 N+ p
查询分析器中也可以在同样位置进行设置。 < >
7 u# d6 ~: c% Y( Y% `& S! P二、应用程序连接失败3 ^ k3 C: P' \2 B4 c. n: v/ \4 s
6 ?$ F) A& G: u e; _ u) l
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
# q/ c8 _" y* y$ T6 e; ^% J$ i3 H/ E% l9 ? C
Microsoft OLE DB Provider for SQL Server (0x80004005)+ Q/ b4 _# s. P- i0 r+ Z
[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
) ~% i1 {2 u. }) Z0 W* o3 M/ |' o- ^9 S
Microsoft OLE DB Provider for SQL Server (0x80004005)
4 \. o5 o/ D8 V ?用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
1 H4 A5 u) ~2 v& v9 J
( h" w, `0 [" x1 g+ L8 hMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.. e" t% }. D4 Y' P( k7 Z
[Microsoft][ODBC SQL Server Driver]超时已过期.
; p0 A5 g; _% O4 X8 c' u! @2 h# s$ `! w' N# F: Q7 i8 ]# D* B
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。, F$ w1 r, L6 x Q) E; |
( D+ v7 f3 D' {6 x* A' c+ T% C2 x' C ! j, T3 A- @2 G0 Q
' b. T `/ N: h# T2 V u* `
/ j) N, F' Q5 c3 X
从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:/ Q, s q, h! _ V/ i
6 V+ B o6 g# H0 v: W
1、使用用于 SQL Server 的 OLE DB 提供者:
! G7 h1 _% C+ b0 c: P8 }2 K
" }. H. v# z( c0 B3 E( _' r 使用 SQL Server 身份验证:
3 O5 p% f \: D! k- T3 J5 J# W5 g- T) M- D, }. G: e$ K1 @ n
oConn.Open " rovider=sqloledb;" & _
' Z6 T. v% [* H/ u$ o"Data Source=myServerName;" & _' @' j6 l* v Z8 L* S
"Initial Catalog=myDatabaseName;" & _" m! s' g# i7 D# Z
"User Id=myUsername;" & _: J# A" N1 S7 b' C7 i0 M
" assword=myPassword"" ^& f! N b9 P& \9 N( S2 r* k) Z: {
( X' u. g+ W: ?( v H3 f" C 使用 Windows 身份验证(信任连接):
8 @8 _, r+ Z4 s3 W0 q1 g
" D: ^4 S X }( i1 B! s. c% Y( VoConn.Open " rovider=sqloledb;" & _
+ s l3 N/ ?5 \ i5 K7 g"Data Source=myServerName;" & _
# O2 g1 p5 z3 c# @5 S"Initial Catalog=myDatabaseName;" & _
) K) b8 N: k* j0 S1 z# @ j6 M( l' @"Integrated Security=SSPI"
. I; d( R2 B# p4 T
1 P* Y5 F$ ]0 o: ^ D% ?5 I 2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):
. k4 Y% W/ m% w( q, v! H8 w: v8 u" B9 O: r7 U6 j, c# Q6 C
使用 SQL Server 身份验证:7 e' R% L: k0 D0 p) g4 n+ M
3 `; v P m3 T- c- h6 ioConn.Open "Driver={SQL Server};" & _
\9 ~' S4 s; J% `, i"Server=MyServerName;" & _
4 E- T Y4 b0 |% p9 H# R6 q1 M' h"Database=myDatabaseName;" & _; S0 n& L! C- N: \- }; ?
"Uid=myUsername;" & _
* S X+ S* ^& C0 s' _" ^2 M0 ^) j4 d" wd=myPassword"" ?9 }) v k- c. z/ I, x
1 f$ F I6 V+ {" J# D. Q
使用 Windows 身份验证(信任连接):
! ?8 E: a3 q' u' [
0 N' S* M1 r T: o+ @% JoConn.Open "Driver={SQL Server};" & _
* T+ s1 z$ U5 M- A% T"Server=MyServerName;" & _
& {% d2 c3 a' Q) f6 V"Database=myDatabaseName;" & _- [ ^7 M( p0 e$ b
"Trusted_Connection=yes") U3 b6 b0 X* D! m+ o
8 W& ^4 O/ ]4 V) ]4 u! v! U 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
" N- Q- W8 Y) O; j9 Q2 z5 P6 J8 R
: a2 t. T* [$ o) NoConn.Open "DSN=mySystemDSN;" & _ . ^' f' M$ [( c
"Uid=myUsername;" & _ + y5 _9 _) \: D* _( c" C9 m* k: ^
" wd=myPassword"
# ]4 Q# D4 n7 F7 n3 K
4 i+ h6 N! f E' m% X 如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:9 D/ _: l- `. }5 ^# P! t8 T
3 X" V3 s0 T/ X% K$ C/ u
1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:, r. ]) g4 \7 h4 L6 o f+ W
$ ]; `9 `* g3 T1 L/ n 6 T7 e5 H. l2 o/ n. X3 G, @0 X$ a
+ K n0 ?( _' j; a% p1 T
5 u" T9 S k, ^9 q& b; ^% f8 W( }' R5 h& F7 B) @8 z
2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
9 K( p/ v( u. y. }, t
( o7 d. X8 `! U' P$ x</P>< ><%) C- I- n0 i+ Y. }
Set Conn = Server.CreateObject("ADODB.Connection")3 p. `& Q0 Z% Q! L: \! n
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"* @9 B/ ] H" M1 D& j
Conn. Properties("Connect Timeout") = 15 '以秒为单位
5 b. M4 ?5 q2 TConn.open DSNtest
1 Q+ _, _2 _! l# ~9 }%></P>< >
! C- j+ ]2 K6 X: O5 V5 ^ M3 v. U 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:
* a* j5 g9 V' o0 R( A
1 z2 j1 d5 S+ F, j/ J$ k3 \5 o w</P>< >Dim cn As New ADODB.Connection6 s* g- Q! t( Q& M" Y: W5 f2 X5 F
Dim rs As ADODB.Recordset! h+ N: S. e6 b5 f1 `6 ^
. . .
) W& T. J$ y! Ycmd1 = txtQuery.Text
4 O* U7 L1 v' B6 v. hSet rs = New ADODB.Recordset
! T, W1 J; j# { i9 V' ^# xrs.Properties("Command Time Out") = 300/ @$ X! `0 s" g$ j
'同样以秒为单位,如果设置为 0 表示无限制% H( S6 C6 u8 B9 A- X- I" h$ O
rs.Open cmd1, cn$ m! w% S) r/ S4 u) ~* x( }
rs.MoveFirst
. k: R4 q& u0 e0 ]% e' C. . . </P>< >9 G% } `+ I0 P$ s7 Q
<B>三、小结</B>. y$ j% w% t. q+ s6 b. s9 S
2 w7 S3 i! Z8 f5 E
本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|