- 在线时间
- 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文件有相似之处。& d r6 H; y g- l
7 _3 Q% f5 H3 O. }% {& E2 W) b2 g6 q
3 g8 s2 q5 K+ U4 y7 t( M
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
" X: _- u9 X/ ~% v2 [
1 u5 w5 c% u+ z R$ u2 u 当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:4 j1 z6 K$ n8 s! o2 ~* }7 ~
$ u- i) ~) `) Z 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;% N6 x* l. [* F i# W, M: I: c6 K
8 k. ]* |' x! m
2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;6 q M4 \$ v: _! U) \! ~
/ }" p+ n5 o- L6 @! g; Q" e' h
3、 在"身份验证"下,选择"SQL Server和 Windows "。& k/ j* c1 x* ^) ~1 Q$ w
& Y, n2 q. h: l6 b8 D. V
4、 重新启动SQL Server服务。' N8 V/ R2 f* P' R0 O
8 k$ v! E1 H) ]! U& N7 [3 h
在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:6 T5 A: o9 S6 o
, y) ]% o$ p4 X( Y% g4 m/ i- p 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;
! x- @) o+ c' `8 {% f A: \
2 o7 ]0 e+ d, G: l% K 2、依次展开注册表项,浏览到以下注册表键:
7 Q$ ]. i& W2 Y3 |0 i4 \0 y) r d
" k0 r; x+ m8 z$ _3 ^ d[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]6 j8 Z# ^( A4 ^
5 M A! |* o) C: w( j) ]
3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;4 @( N8 h/ k( C" ]
8 X) a* K6 e1 b; ? Q+ T' e
4、将原值从1改为2,点击"确定";
8 r& `1 B d5 U4 ^. C% A r
+ m7 d7 U. m6 k" T4 r% U 5、关闭注册表编辑器;
- ^/ @6 A4 u! f! B; c- I5 P5 l1 m! C V; i( e
6、重新启动SQL Server服务。) A7 w/ G9 {% N8 a' k/ u8 ~) e
% A" ^3 y. T" u$ M0 {' c! L
此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:
: r# L* B" ] e! L
* c% e- v i1 I5 D3 ~3 ]. F 1、打开企业管理器,展开服务器组,然后展开服务器;4 u7 \( j& M# u" S4 u& x. ]
% d$ ^4 ]9 ]; r* w: I0 G( h9 w 2、展开"安全性",右击"登录",然后单击"新建登录";" ~7 T" p" y7 L! c) ^
; a% H3 a( W/ m: w6 ]# \ 3、在"名称"框中,输入 BUILTIN\Administrators;
+ {3 W% |: ?/ C; S! w; Z
$ V" D% V7 [, N1 A2 p; g 4、在"服务器角色"选项卡中,选择"System Administrators" ;2 V6 U- q$ Z" P/ G
3 ]% d0 {; d! J, C/ @
5、点击"确定"退出;
; e; |" k4 ~; Q6 O5 ~- N& k2 N+ [; i3 C; J" w& r
6、使用同样方法添加 <机器名>\Administrator 登录。
/ R$ J0 ~; \ s6 I6 i8 P
' N2 k7 i y- T! S6 n 以下注册表键
* O. [3 t0 [7 a. x$ v& M/ n8 i1 z' T3 G! C1 @
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode( [1 h5 I# k9 u0 k* c
) B6 z4 v8 U" G: @. V9 u' I 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。
3 J4 o2 d" h3 V1 S5 ^7 r$ X3 A4 ~# u
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。8 _9 m$ |( S; l, q6 Y. l
# g5 H/ {. I y
如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。% G8 [7 p3 K: {8 K6 \
* Y8 n) ~1 c& o+ E) h0 P! o
要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:5 P6 C! ?* t y" P( Y; E
* D; I* j2 Z# q. W/ D6 }& [0 C 1、在企业管理器中,选择菜单上的"工具",再选择"选项";. {$ @4 F0 ], t" O6 w
3 R v* U" C: U7 Y+ l) K 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;
5 b, W+ x' S% W
! H. x8 {$ c- v* o2 S6 F) P 3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。
' L* ?, I5 @# z! R }* ~& h N5 r- b7 I+ z2 F# N I0 B# Y/ P9 ]0 W
查询分析器中也可以在同样位置进行设置。 < >
# ?! Z3 n0 L& v9 F q二、应用程序连接失败; w$ B1 p1 ?; b9 M& ]6 j
4 d% F1 m. o: x/ |, ~( i7 l
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
2 g9 S" x x6 l# d/ z0 K9 M
0 Q! V: a. I6 J% r$ f2 m9 HMicrosoft OLE DB Provider for SQL Server (0x80004005)
1 G/ V0 |: I) J[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
3 C8 @) N& k3 C+ c; O
) o; E) @4 m& MMicrosoft OLE DB Provider for SQL Server (0x80004005). a9 s4 l% A+ S! ^4 E
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
8 H2 M2 `- o( a$ l0 Y. E2 C& E+ C( o( l) X' E
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'.) b2 U& J+ ^6 X* @4 @
[Microsoft][ODBC SQL Server Driver]超时已过期.
$ ^0 ?1 n& u" z/ B5 G" W2 p. u7 c U9 w, O
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。0 H3 g# K7 y* D' P7 y7 {
/ B% E0 B7 [) B5 F0 w# u. e
, @0 ?8 Z6 i' v6 V3 j# n' k5 S6 z
. _, H! D" }$ e2 D& l3 Y' Q6 {2 E% v1 U* a
从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:% b+ G$ }& z/ `& D+ n3 k
0 ~* B( _0 ^9 [ 1、使用用于 SQL Server 的 OLE DB 提供者:
- C @0 c4 g( c# ~( n8 Z; K! i& P2 C- J. h* C8 K0 a+ s: I
使用 SQL Server 身份验证:
9 C! s3 a/ k% s( N0 X& w
& @9 E ~ X: H& [oConn.Open " rovider=sqloledb;" & _
2 I% x `9 D* f"Data Source=myServerName;" & _
8 R' q8 w4 w6 d7 J* c"Initial Catalog=myDatabaseName;" & _6 X3 K3 }- {; O
"User Id=myUsername;" & _' L, X/ R& m4 \1 K' y* z2 p
" assword=myPassword"# ]# W9 c9 K0 N. v% b o; D9 V
# _ `9 e) q& J- [ 使用 Windows 身份验证(信任连接):
E! \" l. r# K2 c/ N* ^& b: {* S
oConn.Open " rovider=sqloledb;" & _5 Z. ]) e' Y8 P+ a) T6 M
"Data Source=myServerName;" & _
# e2 c) y; ~; z8 Y"Initial Catalog=myDatabaseName;" & _0 G# }, s. D. ~5 v
"Integrated Security=SSPI"
6 F9 G5 q- C' M `% c J. U0 s& O5 Y; x e0 [# s6 }
2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):
+ P' i8 H! b. G) F4 Z$ ~/ L* _
; Y! e: T# e/ O$ q+ @& G, X 使用 SQL Server 身份验证:" Q5 r# u! N1 E7 N
6 |$ @' r6 Z+ OoConn.Open "Driver={SQL Server};" & _
; d% y( j1 x% S: g. `: A5 V"Server=MyServerName;" & _
. X" P: v5 g$ l"Database=myDatabaseName;" & _
) Q% M; b/ `) v" m3 j m% w"Uid=myUsername;" & _
1 {2 B1 P$ I0 C5 D1 U S" wd=myPassword"0 S# N+ l4 ^: n, m) L
, @# h" x0 R- f
使用 Windows 身份验证(信任连接):
+ B! P; @) [/ A1 m5 K* s
3 O/ n% S2 O! x5 w0 P, j: N6 qoConn.Open "Driver={SQL Server};" & _
# L, U2 r+ T' P8 E" g! V"Server=MyServerName;" & _
% v/ U9 L1 d& `6 `. x5 k"Database=myDatabaseName;" & _3 G ^2 W! j, d4 c7 n2 [$ N2 X" N: j
"Trusted_Connection=yes"( j1 X% p5 U* ^: \
! X( g5 H; g1 ^
3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
8 e2 W( m7 |1 k; `. S& L' B* V
oConn.Open "DSN=mySystemDSN;" & _
3 G4 {( }1 G* S( P) h9 _"Uid=myUsername;" & _ 0 O) C* G/ H) _/ k& g j2 C
" wd=myPassword"' X' Q- i& V9 T. l$ z3 j
; F) x3 ^9 s$ h- j5 t$ J
如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
' @1 s. V+ N$ ?' e6 F K
( D( z e9 W8 _) N. i+ A 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:- ^. Q% K. ]8 f: y* ^4 k/ n0 t) Q
i; [8 {% H, ?# z# E0 Y
, y/ r2 {) p2 O/ @% j# ~0 h
% _. m# N, }+ X7 o( v6 `; ^' \% M( h/ V* O, t' X8 r
/ d9 G6 Y$ \" W8 E% U5 I
2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
: c- {( R' F4 ^/ u# _8 L9 k5 P8 s" N3 V! N$ X- b# F4 X# u
</P>< ><%
' f. s9 |0 {$ L: Q0 Q1 E: L" dSet Conn = Server.CreateObject("ADODB.Connection")
+ h' x. v2 K8 sDSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase") U5 \5 Y- f9 [% ?
Conn. Properties("Connect Timeout") = 15 '以秒为单位$ N: k+ g1 O) \7 Y- G+ _9 f, l
Conn.open DSNtest
% F4 R Q8 @* J$ p+ S%></P>< >
( }8 T) F% d* Y+ e$ h8 M9 }+ l; u 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:- b% B1 t1 A0 O& n; U
3 @0 Q; [ J" X' b7 Z
</P>< >Dim cn As New ADODB.Connection0 }/ R4 K; t- M
Dim rs As ADODB.Recordset
' P# ?( t$ f6 _% W. . . - K3 U0 P* O$ Y' j3 o" V
cmd1 = txtQuery.Text
9 k/ v$ `$ \$ u' lSet rs = New ADODB.Recordset
$ o$ F0 o- o; H. Y% I- Vrs.Properties("Command Time Out") = 300# }4 m; F3 ^* A$ ?# d- I
'同样以秒为单位,如果设置为 0 表示无限制
: Y3 r' F' w2 H+ i* n* `rs.Open cmd1, cn j9 u- k2 T$ P9 {; Z
rs.MoveFirst
7 R' y3 I5 D$ c! z6 N# y( [. . . </P>< >: c, ~7 p% y! e+ U+ ~
<B>三、小结</B>; G4 U) {, c- {1 Q6 I; q1 Z
6 }; _& |% B z$ m, j: a 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|