- 在线时间
- 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文件有相似之处。
' c) e6 [7 _7 L6 e# |+ l% ^
4 T, ^+ y, [. U' J* s! q @
$ w+ g8 {' c8 R' ]8 f& c通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
% ^$ }" t. L7 D& |, Q- X' g" Z9 C0 O6 |& O8 P7 `
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:
5 A1 k% ^2 c S3 J
& i8 _ D/ G9 Q* X$ G) r1 g 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;
) y0 k) k& b: O6 F: |. U/ t- e; y9 M! a7 f, Q5 `# B8 E0 C r, v* N& |
2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;- ?, R S9 v3 y) d% _! |2 N5 b6 L
$ j4 J; J G# Q! | 3、 在"身份验证"下,选择"SQL Server和 Windows "。
1 }2 ~* J' W( c& o+ u
% A/ D% V. K# X4 ^; N" y. N 4、 重新启动SQL Server服务。
9 Q& ?4 O$ r; e0 h+ n. T+ n' v0 q" n6 R
在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:. u/ Y( q1 k9 q. g9 e8 t
$ c6 E! I/ {- H9 u% g 1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;
8 K, _' g6 V/ M. J+ }' E: K
+ X' a+ b- b' p6 ^+ ` 2、依次展开注册表项,浏览到以下注册表键:9 r0 g& }, H/ f0 {7 H3 M
# `0 P( u0 o- m* N
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]6 W8 j0 r, ], e" ]) M S# J
8 n! ?1 d. _7 F% v- U" \ t3 n
3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;
1 Q3 `# M* I9 g6 |) Y6 Z$ i# H+ S4 g; B" o! d) S% u& v* k
4、将原值从1改为2,点击"确定";
1 W% n, L* Q* ]# V. F; P G4 ~9 H' D9 D
5、关闭注册表编辑器;5 C3 \ g, q' ^' K' b5 p
: D. X! l5 o% N! p 6、重新启动SQL Server服务。6 g+ E' s0 L& \' ]6 m* P8 T- z
6 c0 s* j0 j4 ]. w* l5 B4 E
此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:
1 p+ B3 z- Q# ]- T0 `: S- r4 ?6 [' V0 O: M
1、打开企业管理器,展开服务器组,然后展开服务器;
6 x& h7 E% X9 q
* y5 E" q" K& ^/ k5 F 2、展开"安全性",右击"登录",然后单击"新建登录";. k* l+ S0 [0 o, G F2 Q [/ m6 @
3 M& I, L A; M+ R 3、在"名称"框中,输入 BUILTIN\Administrators;0 O, W7 t2 b) J) H6 c% \9 r
' C- x- `: F$ d6 K
4、在"服务器角色"选项卡中,选择"System Administrators" ;8 g9 b; M# B3 X! Y1 ~' C
( ^& v9 ^9 J( ?
5、点击"确定"退出;) q$ g+ ]* {/ X" i
1 }& p$ m$ T6 b! [5 q; M1 E0 f) m 6、使用同样方法添加 <机器名>\Administrator 登录。0 J+ T; X4 @* y9 x6 N+ x' `
4 a2 z w$ ?7 y7 q& z 以下注册表键
' q7 y0 m5 i' ^5 H$ N3 b
5 y: r. H' `: r$ {7 B6 kHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode
1 v2 Z) O- {- y2 L7 s" l6 Q# t
- o( G3 b$ s. l4 t7 p 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。) o6 g# F4 W: J U
: [$ w# m. ]8 W& M. R8 n 看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。
6 `: Z+ J8 {% s( r4 l" b8 m# `: B' U) V% G& n8 C o( r
如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。6 L: M! c% K' Y/ E; o& q% O! Q0 J
$ }# H z$ V0 V 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:5 j; r. I/ C9 r! [, ^2 q. K! n) L, r
6 g9 \; {( x2 ~* S( C
1、在企业管理器中,选择菜单上的"工具",再选择"选项";
; z; p4 A ^1 [: A4 X# k2 q* y) @" P( n7 s/ w- z3 l! H8 B4 Y/ V. }, Q. L
2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;
4 ]8 `3 I% @ K1 |. O4 @ Q' V n( l+ {4 _
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。
5 R' B* ^5 [8 f* l7 _: |: i% C3 o+ p- O3 h
查询分析器中也可以在同样位置进行设置。 < >( U) J+ ]4 B4 R! {- M2 k @
二、应用程序连接失败
* X( Q: Q4 H% h: n' @4 F# Z$ k) ]3 m9 v1 W+ C' U
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:
& F% B4 w( ]) p+ U
+ k% Z9 Q$ x2 n7 a9 u0 h1 cMicrosoft OLE DB Provider for SQL Server (0x80004005)
3 n R3 l4 W" }; s[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.$ s9 t. m7 M% \% W, s* t
6 b% @! d+ `6 _
Microsoft OLE DB Provider for SQL Server (0x80004005)( w6 S O9 q, l& Q$ l' o
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
O1 X) q: V$ V7 K$ j+ y9 |4 h6 R& G& o h. r+ i
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'.5 v. x! D5 s4 f+ _
[Microsoft][ODBC SQL Server Driver]超时已过期.% w* t- U+ M5 H: U/ D
. E: y: M- q1 L$ ]+ F3 m 首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。, [2 ?4 d1 S R% e* U" X$ r
; D# a, C' o6 d. Q7 W' ]" {& C
/ x8 {+ u3 _4 K: W5 _* i3 {
& n9 x. T* t, `* X+ ` H
' f. _, }( y$ G 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:
# J3 ~& J1 U0 N% P; C' |% p: \
( @+ F$ F* g. ^, r6 i# ~ 1、使用用于 SQL Server 的 OLE DB 提供者:
5 o1 q! `& |) B" e9 F7 B9 S( ]) |
! @! i$ {' m- n+ ]4 d2 p 使用 SQL Server 身份验证:1 m4 O1 w. e, ^
, m. z$ |1 g6 b! ]; Z/ hoConn.Open " rovider=sqloledb;" & _
5 J2 z" Z; W: U2 S; v"Data Source=myServerName;" & _0 O5 [9 x; a. Q5 ] z5 R/ m2 P! G
"Initial Catalog=myDatabaseName;" & _
5 I2 m6 V! n2 z" P9 T! L"User Id=myUsername;" & _$ U' j6 A6 G2 g
" assword=myPassword"8 Z( I. R& K. W: s6 J1 I; p( t; W
, b3 e& y# O9 o 使用 Windows 身份验证(信任连接):! V7 D5 _' K: g: V
6 B5 ?' V& g. Q" h+ ?oConn.Open " rovider=sqloledb;" & _
) G5 \) ~, R9 e( D# P4 a2 @8 Q"Data Source=myServerName;" & _* V/ ?9 E( D8 y% d
"Initial Catalog=myDatabaseName;" & _
0 U1 J, k" I4 z% q3 M/ V"Integrated Security=SSPI"7 M8 N; _/ g$ S- e
: t% m) ?. o/ H; N# V
2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):8 c, o. R) ~- _6 L! u) R
2 c( p0 r3 U% P/ n
使用 SQL Server 身份验证:. A' ^2 r+ ^, o9 K" U5 z8 B
- L3 `, r d+ roConn.Open "Driver={SQL Server};" & _
7 A( d9 |0 z2 _/ U( d"Server=MyServerName;" & _% p% X' u9 u( _* ]- I1 {: v
"Database=myDatabaseName;" & _& T9 i! z U; t& d
"Uid=myUsername;" & _, T$ l$ y, v( G) p( f8 k
" wd=myPassword"
$ ~* H2 t' H2 w- d
# g7 t. y, T& S7 [9 U2 q# X 使用 Windows 身份验证(信任连接):# G$ ~: k# L- y5 X6 y g
' @8 e' w$ Y7 m AoConn.Open "Driver={SQL Server};" & _ ! ?3 \5 ~& H4 J, o+ V
"Server=MyServerName;" & _! y- O2 l2 V; j- H$ N' v( ]3 n# }
"Database=myDatabaseName;" & _
4 u& y8 [1 I: {: n"Trusted_Connection=yes"
2 g4 H* D& B6 k. [1 E( x6 Q% I
, Y& t/ I/ t8 f$ C 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):/ B: h7 i2 f2 m# T& F- t" Z
- O# Z% T8 r# d
oConn.Open "DSN=mySystemDSN;" & _ , {9 u8 W) V4 _+ E w1 j5 j( L, j
"Uid=myUsername;" & _ * D% W8 T8 i. L9 e7 ?
" wd=myPassword"& v; C) Z4 ^# }& g2 L
" ^! `" p8 ]/ }, a/ G3 [3 v 如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:4 W0 a) `; B& N
; p, z* Z3 o$ O# f4 B' K! j# t 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:- l& c5 \9 }% r
! q. a/ M X- a2 ]3 U9 }
6 f2 y0 q4 f7 a) Y; y2 f' f3 h6 I
8 O' `) F1 K: t! h i1 ^& O( s
8 l; d6 Y6 d" I$ B, m: c6 D" ^, n* q$ k. N" L
2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:
% [1 s- v& A6 X+ \% G. x1 U+ S k" x2 p" v( X2 C# U
</P>< ><%
0 Y$ Y3 O2 z+ ZSet Conn = Server.CreateObject("ADODB.Connection")
& s: I! M% _- J9 x: R/ wDSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"
' y1 N) r( ]7 {+ A: Y1 \& D! |4 n8 G& cConn. Properties("Connect Timeout") = 15 '以秒为单位: L: r! V! S; Z; i. j
Conn.open DSNtest
- G7 J5 B3 r7 y' L%></P>< >5 U: ^' }! V% d
3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:
: n* l1 X/ q0 b% e- M! ^4 N+ U1 _! S4 }
</P>< >Dim cn As New ADODB.Connection
% [5 }* K3 V* v" w: l$ ?- b' eDim rs As ADODB.Recordset' B: m1 w% }; X& @& n8 a- ]% o
. . . 6 {$ Q W+ P+ X6 |) T
cmd1 = txtQuery.Text
) }0 R: ?: l4 W v) uSet rs = New ADODB.Recordset
% S- B$ E* e7 Krs.Properties("Command Time Out") = 300
9 U5 d/ W& _: A+ Z+ ^ N# q6 \'同样以秒为单位,如果设置为 0 表示无限制, y# M( ~$ D9 S
rs.Open cmd1, cn! c5 r5 o. W( O# C( C6 ^
rs.MoveFirst7 }; V. P a& n* E; C* m0 N# L5 P/ B. @
. . . </P>< >" F0 L5 |' k4 a+ K! ~
<B>三、小结</B>
( B8 y" d2 `/ J) |
$ J: L; Q" b" f; u 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|