- 在线时间
- 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文件有相似之处。
! A1 C+ }6 Q; _
5 T6 B2 ^4 y1 c0 ?% `, Y + j% t# V& g Q; d% L9 l
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
5 ?; K0 @8 j! Q, F: @4 h3 |( P: {1 h" D' R' ^- a
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:
4 ?: T' o, C4 Q5 P
* z* T+ A' k7 k' s; T 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;* G8 _" e% ]# ^
2 I/ y& b3 t, H: ^4 l* i+ e- ~ 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;; D0 W. R }8 z7 t
5 Z+ B- G G2 Y+ R% i 3、 在"身份验证"下,选择"SQL Server和 Windows "。7 f* x# b" I5 W4 c
1 E% e' S8 j; {8 ~$ Y
4、 重新启动SQL Server服务。
; J1 S& l3 g9 M- J" n
7 @) ^2 t: ~4 T& r9 S 在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:% G, y* e: R& s; A+ K
( W8 \" e1 a. Y7 C7 w* O
1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;4 e; w6 c" k: v) c" c" o& l
# f, S! w, A1 ~# V: n4 w 2、依次展开注册表项,浏览到以下注册表键: I- g6 s# d+ K) q' n
2 c% I' q, G# l5 Q1 v' w& x
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]1 A! B: u- l- T* F9 e3 E
, M3 C! Z) Y" o; ?+ _0 Q( M
3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;
1 C$ s8 j$ q# v5 A0 f2 H! G0 f4 M
7 D+ M H' q; P- a) a" R 4、将原值从1改为2,点击"确定";
# X" h/ p# M% w7 q1 z* s$ m8 q7 b7 l- U2 W; ]# m% Z
5、关闭注册表编辑器;
Y( l6 ~, m+ u# X D1 {# L- n( `; W4 V, k$ g
6、重新启动SQL Server服务。$ ~7 T0 [$ S. a/ b2 ?8 b1 [
7 r8 d+ D" w6 ^# C4 Y* M5 p4 f8 _ 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:- A& ?0 T+ I! `
0 ], Q" f2 z- _/ r; s! ^
1、打开企业管理器,展开服务器组,然后展开服务器;7 @8 n1 M2 U- ~' y- j
, \3 |; l. ]6 w) f, @: y
2、展开"安全性",右击"登录",然后单击"新建登录";. B3 h* I; a" L7 _) E
/ Q: F* ~0 W( E9 U
3、在"名称"框中,输入 BUILTIN\Administrators; S1 l2 X" f$ z: y
/ S& R* E7 P. T# m/ D. ?; c
4、在"服务器角色"选项卡中,选择"System Administrators" ;
- [- z0 x9 Q! s2 a: y) \9 X5 p n% U) A# F- C
5、点击"确定"退出;5 j* a& |0 b& _$ K! r" ^
. G9 h. f b0 X* X
6、使用同样方法添加 <机器名>\Administrator 登录。8 x: {4 ?' C" G# B. ^& x
$ h H, r k, f/ g' y& {1 k 以下注册表键
- V7 r# i8 s. n4 @5 u) K8 ]) R" N% @8 V
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode' h8 o9 x+ h: l0 e
2 m/ K# @! y$ k, r2 M 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。2 C$ D9 i/ I1 P4 ^: n+ B+ p* g
6 H- C6 f2 W% j& G, y0 }, \, k
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。6 I) r( E# [, [
y+ s9 c/ I) @& e0 ~6 ~+ j
如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。/ `+ [1 m* j# P& T; }1 y0 s0 T
' ]# J+ n1 @& t' N" y3 h" y% M 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:
$ h$ p$ z/ u7 ?" V' z9 H0 H
/ Y# }$ p6 B+ _- J1 T 1、在企业管理器中,选择菜单上的"工具",再选择"选项";' y5 q" \5 f, Y5 m3 j
) x5 c( K3 i+ { 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;
7 L/ z3 W- u. k3 d8 [; o* i# O! \6 j* p3 |9 z
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。 t4 c3 }1 ?+ I" P3 D
$ m% p4 S. m% m5 O6 S1 f3 ~ 查询分析器中也可以在同样位置进行设置。 < >$ u& _2 Y8 x; h! J) b/ C; H* ^# s
二、应用程序连接失败, D, q' Z4 }7 C* ?( ~) f$ k
2 r8 }$ j2 Y; n0 D2 j 以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:1 L# o! A" q; f. _' a2 P5 K& Q
. j/ e' C# \# a5 ] P& v, i/ P
Microsoft OLE DB Provider for SQL Server (0x80004005)
9 q; c2 r$ f+ L- _[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
+ X& l7 S1 G8 F* O6 a7 C7 t, [7 g" M- P4 k$ h' |* p2 \/ K
Microsoft OLE DB Provider for SQL Server (0x80004005)' h: [2 G1 B* u. v' M+ d8 V
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。 s# E' y2 |1 k$ l; c
w* j9 ]* e) ?; [$ e( f) Q* t# aMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.
( U' A4 V" G: }9 i" b4 d6 \6 @; Y) }[Microsoft][ODBC SQL Server Driver]超时已过期.7 Q: u: F* [) l- S0 C
& ?+ N6 R4 d) ^" E" q
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。1 s, [6 s% d/ K5 t
/ I8 q7 [, N# F! F6 G6 `" H, J# G
& M0 U1 z3 Q( \' ]5 }1 ]5 o. S$ W9 V+ u/ D: g" ~$ P6 Q: ~
9 a+ ~9 N+ u6 O1 N) {$ t" f 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:& n" j) i/ T% m$ ]" y" f7 `
# S N) W: e3 i. J* S) p
1、使用用于 SQL Server 的 OLE DB 提供者:
# z( c+ {2 D" @& t/ p) R0 {. Y2 a# M3 o( T0 J
使用 SQL Server 身份验证:
, q F! V, s/ a' V9 K! U& M' t, H, H. g) X9 x
oConn.Open " rovider=sqloledb;" & _ ) J1 L& T" a ]0 m. ^% i
"Data Source=myServerName;" & _# G v+ Z# S4 R3 }6 Q4 H/ `$ u7 r+ R
"Initial Catalog=myDatabaseName;" & _* p* j, {! S6 U
"User Id=myUsername;" & _
* S- t- R$ \4 l/ m: w" assword=myPassword"
7 n l5 G: i4 T, q8 A# |% C" e9 f3 L2 C7 Q! I5 T+ L
使用 Windows 身份验证(信任连接):' q# p7 u$ b/ H% |5 i y; D
?! ?# q# D; `
oConn.Open " rovider=sqloledb;" & _
# T: s5 ?" t% Q3 \5 C0 {3 k9 \"Data Source=myServerName;" & _
4 g' p9 x- T' U% Q* E"Initial Catalog=myDatabaseName;" & _
" }8 a$ d' j! |$ s' N"Integrated Security=SSPI"
0 v' m$ h9 \2 g; N% y0 s$ Q# }( j1 r. }& K4 t
2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):( i& `& t! w) H' }9 J
" g2 I3 P% V8 }& F! A. R
使用 SQL Server 身份验证:! J( T3 b' m; j) h) x
$ o) X3 L- r0 @4 G/ v- joConn.Open "Driver={SQL Server};" & _
4 y2 |* m& R& f/ b5 }: Q"Server=MyServerName;" & _
7 M* N, n* x4 I- h j) ^"Database=myDatabaseName;" & _
+ H& p# g+ h- h) j. L7 ["Uid=myUsername;" & _
% E- q9 k& B, h3 a" wd=myPassword". K7 c" A7 U6 m0 E4 b# _8 v
5 o |# S4 d) {9 Q# o% U
使用 Windows 身份验证(信任连接):
5 D0 ^( g% e1 _; K2 i7 M3 T
/ ]5 K, z3 y( g9 G. NoConn.Open "Driver={SQL Server};" & _ ( n; U5 v& ~8 L' h% w0 A5 o
"Server=MyServerName;" & _8 g. `6 |: ^. k2 E" r7 i
"Database=myDatabaseName;" & _/ x, V7 p0 {( s: H" ^ B
"Trusted_Connection=yes"
+ w; s' q8 ?6 u# q2 t1 ~6 m: Q" g4 Z% b. l$ n3 M) \% m- V
3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
% B/ p, ?" |1 Q/ V l9 Y( t- i1 a# m; [2 w" W
oConn.Open "DSN=mySystemDSN;" & _
1 D$ B- h# e( D; i/ t0 S) K"Uid=myUsername;" & _ g% C$ s! B6 ?' x6 w# w" q
" wd=myPassword"0 y; n O3 Q. y: A; g( B) Z0 B
! e+ G$ \/ C) c+ J; z, u# N0 ?- C 如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
- \' Z& z0 M n, n. Q4 u
1 |% m1 R: G3 f 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:# a# h& e; r9 v- ?! ^
; ~& i$ d. d4 h% }! u% N
$ a/ O; {. }/ F0 K' ?; N( U, H4 o& z/ k7 X: j
7 m3 V4 E7 ?. c6 L- ?
% \) c( z. |4 T. k2 x 2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
X W' ]! v( |
; v. I5 v! o% L3 T</P>< ><%
& ~, p( g( v6 B* w! c. JSet Conn = Server.CreateObject("ADODB.Connection")
( i/ O6 R7 T _8 |# C4 M pDSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"
' | r) P M0 R# s: R6 n! vConn. Properties("Connect Timeout") = 15 '以秒为单位
3 r; l/ m3 p, T) I* O# AConn.open DSNtest) u! D8 y) t8 @8 H' [
%></P>< >* c; a, @+ |/ D* x
3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:
3 w% H8 T: J7 }2 P5 e
& K4 I% l0 ~8 R+ w2 w4 x9 Q7 ~</P>< >Dim cn As New ADODB.Connection& R# k- i- N9 j# L+ B
Dim rs As ADODB.Recordset6 I( s K: W ^
. . .
2 E) D3 b% y' v# Jcmd1 = txtQuery.Text- `/ S5 W8 k( z
Set rs = New ADODB.Recordset
0 k0 D7 ]) B1 Q2 T- z9 \$ h0 t+ I4 B4 frs.Properties("Command Time Out") = 300
: l. ]( a. a- S# M! }' ?'同样以秒为单位,如果设置为 0 表示无限制
2 P) `) O# ~/ }5 w, \0 irs.Open cmd1, cn
2 d- W2 [6 _4 W2 P" q6 E+ Urs.MoveFirst
9 i! v: v. k, @0 d% `$ b. . . </P>< >; ^6 M# @3 C/ I
<B>三、小结</B>
3 \1 z/ }4 N: C
$ R- W% j; g$ U/ b) P 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|