- 在线时间
- 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文件有相似之处。
1 N+ p) q6 d9 O' T5 E0 {9 x8 Z) w$ ~$ R5 b/ ^
) O$ G y" b' m+ a" S+ [6 Y
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
' K/ i! h) i0 U& h" ~7 v0 ?) C' [( E. z8 `7 x
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:- h; Z. O, p# T- l) [7 w
: r7 V! {/ T, H, M( V 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;' d5 T0 v+ L, r4 r
; E8 k) j4 r, i: B 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;
$ h$ O) ?- s" y0 e% u, [' n$ x6 n% |; V7 ~ l* u
3、 在"身份验证"下,选择"SQL Server和 Windows "。3 f/ l6 ?# l1 i' _) i& J
$ y- L6 E, u/ J6 E+ V3 m4 E. z; w 4、 重新启动SQL Server服务。& t( Q- A, q# \9 N- U/ S9 z
) G2 W; F" ]; @. i 在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:
1 A o* }+ C1 d+ y, W% @7 K# D4 N' O
1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;
0 {2 r: [! T& G
5 |, m7 e U! ?) x4 J 2、依次展开注册表项,浏览到以下注册表键:
1 \ @8 q+ [7 H; |! n% ?! u; f2 C) Y; I; _% i2 A1 t
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]
r1 b- s6 |# A; }+ n( }% b$ O) u/ K, j0 H' H6 P
3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;. C1 V7 R/ J+ k4 v0 O h6 J- U. L, r
8 t' S2 o# L. s4 ]: i
4、将原值从1改为2,点击"确定";2 T0 j; S# r: n3 w
9 L. e. s& k, \" p' B5 B
5、关闭注册表编辑器;7 h) o ?4 N* Z. {& l
/ e& [1 ^0 m" B- o& p# ]& i7 Z
6、重新启动SQL Server服务。+ P8 x u- K* d) s$ l9 w' L( D
% c0 [1 C: m+ j# J- u' \ 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法: R: L$ x/ y) `- K: a
8 s; @! j, J. N- Q2 Z9 Y: M 1、打开企业管理器,展开服务器组,然后展开服务器;8 u0 n6 B4 Q, w
* \* I8 B+ X' f% a& p) {
2、展开"安全性",右击"登录",然后单击"新建登录";
, X; X+ _& s: j+ j% ?% @ w( U7 A0 Z& L5 h
3、在"名称"框中,输入 BUILTIN\Administrators;
p7 @, t0 I( ?; k4 U W4 z0 F" p# B5 i4 |4 z9 K) S* Y
4、在"服务器角色"选项卡中,选择"System Administrators" ;
# [' _2 u) [- F6 K
6 [* T( D! a% z7 O' p 5、点击"确定"退出;
4 h5 k6 a) t/ K" J! x- w) Y
( o% {- ]) d( B* l7 c# ]* G 6、使用同样方法添加 <机器名>\Administrator 登录。
$ Z/ ?0 `* D6 [* p* Q$ w" y
( G, ~- r( c* d# m3 C9 X% T! h 以下注册表键
: h4 N# V9 d* ~; Y
: W: y7 z# [4 c6 a0 E" LHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode' @9 o; N7 ~$ U, F3 [
# W& g9 ]/ O: o$ M5 C6 F- _& @' E 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。# p8 i' w1 f( `
( \7 w7 Q# h$ y5 g+ f8 k9 c9 g 看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。2 b: s! H& T d3 R; m
7 ?' p1 V" i# K8 R& t
如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。
) v) u c+ g& [# D' y5 U
z0 S; I" V* l5 a* Z; S* V 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:+ Y) |# F9 Y- ~: ?$ g2 N8 O. s# ?
s" ~) D _% d9 V) @ t, l( f
1、在企业管理器中,选择菜单上的"工具",再选择"选项";
) l+ A7 W1 n8 H2 y, N* R
! @9 {! I* X. B) }- S 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;' L4 E- U& i G( D7 x) R
: ]! Q; }" \, M 3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。8 l. F- K% v9 b2 e$ e
' x* y. n3 C! C' X
查询分析器中也可以在同样位置进行设置。 < >; s, k; _* M# [8 u! X( _
二、应用程序连接失败9 V8 C. I- q3 l3 F7 T
; _9 r: i7 m2 h8 B# o 以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
9 T* p/ O4 F7 j' p. o; l( ^9 c1 U, k9 {' }4 \1 U
Microsoft OLE DB Provider for SQL Server (0x80004005)# a5 w" e, k/ U; ^ ]+ K% C
[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
- f& h4 r5 @: d3 Z# ]& ?5 l* {4 U' U+ D4 m9 a
Microsoft OLE DB Provider for SQL Server (0x80004005)
8 L/ Z+ |- N& Y& ~; q* L0 u用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。: [- e, f; @" E1 _
8 V8 t" J8 M% iMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.
2 L3 B1 q' {4 Z# @. M' w[Microsoft][ODBC SQL Server Driver]超时已过期.
Z$ c4 X( j3 w8 {! O6 {/ a6 j
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。
8 p; h9 U) }+ T" V' O
5 q# X5 H2 R/ I6 T6 z2 z& \2 \ ) O0 P g# w4 l1 Y. O, f
! {7 P5 n A4 n# L& {; J6 ?2 e8 G+ s: L7 J
从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:8 v' E3 B$ U& E9 `0 N3 G2 z& X
; z7 U: w2 L8 Z3 M
1、使用用于 SQL Server 的 OLE DB 提供者:
) S6 c' ], ~5 w$ Z
- b3 \2 }2 M* F5 T 使用 SQL Server 身份验证:* o/ _4 Y; b, @1 `( _' V0 C% d
9 m" B( X# @* [! z* voConn.Open " rovider=sqloledb;" & _
2 U& m/ z1 K7 n: y# N0 M"Data Source=myServerName;" & _3 b" }5 v; U$ g/ V1 a9 z: F$ a
"Initial Catalog=myDatabaseName;" & _
$ c/ E3 B; U( C! U"User Id=myUsername;" & _' o' e w6 d l3 O# s# q
" assword=myPassword"
+ z: N% \6 `6 l: d- Q; D% J
8 |7 `9 L* m% o4 T. F3 x$ C 使用 Windows 身份验证(信任连接):8 M. T; \ S! ~. i9 E
3 X5 `& H7 Z5 d$ B' Q, L7 Z$ X
oConn.Open " rovider=sqloledb;" & _$ F% f# W% n$ q5 D/ {
"Data Source=myServerName;" & _
( K3 R2 w, |% J) }3 L! F7 }0 m"Initial Catalog=myDatabaseName;" & _ \! S0 N* p W. q. Z' R
"Integrated Security=SSPI"9 V: V0 q( m; a( v8 O/ h
* Z$ L$ R" y! Q/ D9 N- P
2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):, k- H6 w Q; r# ]4 j% o; ^
( x+ M" L8 ^* e0 m: q: W2 ?* q
使用 SQL Server 身份验证:5 J: n9 L5 X1 p- G' I# f2 [
4 |, p5 C. G: a9 T$ L" m6 eoConn.Open "Driver={SQL Server};" & _ 9 K1 C8 h4 y! |3 H: S
"Server=MyServerName;" & _0 j3 E! t* x2 ?! ~" h
"Database=myDatabaseName;" & _
& I# X5 J4 I& i$ E8 E8 ^1 W- H"Uid=myUsername;" & _
( Z$ T+ K3 K/ G: Y- D" wd=myPassword": k5 B2 v) B, Z; s- d3 C
& @ m, K" H0 {
使用 Windows 身份验证(信任连接):
8 }0 q# D; g, d! h: G, H: S" d/ F2 D5 Q$ w# r: \: t) z- Y6 x$ ?
oConn.Open "Driver={SQL Server};" & _ - s! ?- m l" c4 _1 C. d3 Y' i
"Server=MyServerName;" & _8 F! V6 y; d8 ^7 S% {/ r6 V; G1 n
"Database=myDatabaseName;" & _6 p/ S Y8 a/ }
"Trusted_Connection=yes"
8 |) ?4 ]4 f0 u) Y) I0 o
% }- X* v! g6 v# Q6 G; ] 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):: [* _ e' ?% C8 v$ w, F9 m9 A
3 j! |5 f' u8 ~+ l, ?
oConn.Open "DSN=mySystemDSN;" & _
" d- T, w7 z, A7 ^"Uid=myUsername;" & _
) Z7 k6 j9 ]" j1 }! J. }7 C" wd=myPassword"7 [ t. f# K* ^+ M6 @) w% A4 @& A
0 Y5 ~1 z( C) I% T
如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
2 _% A' ~& v! R8 j+ C$ ^0 k: b9 a2 D" t: z4 _9 ~
1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:# M1 a- o9 c5 l0 F7 J. j6 T+ C
- R0 T4 F0 H5 {& Q+ d9 B% D) C
1 {# ]2 x; Z9 f! S7 G) B4 x
. S8 v! ^) S6 ]) P5 m& H1 r6 V" X1 r% N) W) p s
% f+ ~% j) c& i# ` 2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
$ m* _5 Z( l% O; u4 h5 ^/ _, G4 @) [9 A" c3 V2 y3 H2 Z! k
</P>< ><%( e( k) [" i1 u( ]- J& Y" [
Set Conn = Server.CreateObject("ADODB.Connection")0 l. ?" e2 h! z& H6 S3 Y
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"
" v5 P( W4 t- J* L$ L+ BConn. Properties("Connect Timeout") = 15 '以秒为单位
1 }* m; N" A. p; vConn.open DSNtest. K1 V, }3 S4 I$ Y
%></P>< >; q+ ]) O# J0 Z/ m+ M
3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:8 r2 H3 D. c" ?% a+ Y3 x6 ]
3 O; ?3 T1 q" e5 t+ h8 v</P>< >Dim cn As New ADODB.Connection3 q. X' l: \; W [. y
Dim rs As ADODB.Recordset
* e7 p2 W1 t' C+ e8 G9 j+ [9 v. . . . N# w4 M0 y* t! N0 F
cmd1 = txtQuery.Text
% t, \( o8 P) tSet rs = New ADODB.Recordset
; J. ]! O# |+ k$ P" U8 ~rs.Properties("Command Time Out") = 300) E% ~" y# D2 t; m7 j3 H
'同样以秒为单位,如果设置为 0 表示无限制* @3 B4 [& S5 W( j6 p! a
rs.Open cmd1, cn/ m1 b( e5 H/ J7 x7 V) Q( \
rs.MoveFirst
- G2 d/ U& T- \: D* \. D. . . </P>< >4 y. f- ^- N( u( b; b* b( z
<B>三、小结</B>! E! S& @' j$ ]0 C4 J0 Y
2 Q) L+ S6 H# k- Z Z4 W, x, V 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|