- 在线时间
- 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文件有相似之处。% n6 q6 ~) N# a# s' j
2 v- n3 V$ e R
, v+ {- w5 i! I6 p
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。
( L. f! n8 v. Z0 A5 @) c" Y8 b5 n S( M
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:/ \; b3 K2 c! v4 f. P, F; o
8 { j9 T# ~, M5 [
1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;
' }" \: X# l ?. w; U6 f( y8 R
3 D) f$ B p4 ?0 D' y8 r 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡; o; O1 y% y5 T; a8 x" f
% N, o+ S$ d3 D 3、 在"身份验证"下,选择"SQL Server和 Windows "。% |9 I5 d' T6 `# |
! W9 b( |* _! a9 B l, V D 4、 重新启动SQL Server服务。8 P( t' s$ k: W' w* X1 w
+ x% N! o! A7 g1 H9 B- _ 在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:. W& t( c/ J$ a# ~' @" ~
0 U- D! P% l( i M2 s8 o! a. q# T( _
1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;/ k' q3 c. B8 S$ ~2 W) }
( C- k5 Y7 j1 B, ?# y2 U4 Z% e 2、依次展开注册表项,浏览到以下注册表键:3 Z3 R' }% h: f( V( D$ A
& P$ b' `& j+ F' o" `% t
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]
8 @1 A3 l+ s5 q- d X; k. m* w2 ~* o5 d3 q/ O0 W
3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;# d0 G" E2 ]( ~5 H% y9 m3 b
. e& t8 S- L Q( G
4、将原值从1改为2,点击"确定";
# X- C; X6 s& t: F
; C. H; w2 Y/ t! c 5、关闭注册表编辑器;
0 t4 x# @. F2 p7 q
* n0 Z3 {9 b- A" W7 g 6、重新启动SQL Server服务。( d& N9 _+ Y: i$ z: @4 T
+ Y2 D8 m9 f$ y! C- ~8 U0 U2 F# z
此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:& H% m; K# r$ a: Q$ r2 I
: c) Z% i1 V, v( a9 ]7 o+ y0 Y
1、打开企业管理器,展开服务器组,然后展开服务器;1 i" l) Z7 ~4 b* E
7 L% k9 Z6 W- D( z 2、展开"安全性",右击"登录",然后单击"新建登录";
5 ]* e% `' w7 r+ T" i( I l6 |, ]
$ o- W2 |: l0 b" Q7 ^6 }; [ 3、在"名称"框中,输入 BUILTIN\Administrators;3 D }- B' w" W' W7 u7 _ m
1 \/ y. x" [, L" _, `
4、在"服务器角色"选项卡中,选择"System Administrators" ;
( E+ B8 b/ h. `) H5 v
$ i& M$ w3 q, H0 @* ], y/ O 5、点击"确定"退出;
* _: w2 W' r8 \2 a0 V8 D" [6 u0 l# p) f& h$ a
6、使用同样方法添加 <机器名>\Administrator 登录。
" Q! P' W# o% R# D6 j" J; I6 @& c5 I/ Y$ \( ~( P
以下注册表键$ q: T* W: ?& D9 @; N" G% }1 j# }: ]( O
7 @0 g5 d! e0 T8 VHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode
, _+ y. [( [" V3 v
( c8 W% O% i9 j7 H$ f+ y( G 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。; y% L4 v1 M- `& U1 _) _! |
, h6 t& X r+ _
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。
- f- l6 {9 K9 I% e% c! N+ |/ Z
* C0 ?" d" _9 U# k% x 如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。2 z! v% c. g0 a1 ~1 H
E$ h6 p# a1 \% {+ Z# S2 K* g 要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:1 p: w0 I# B- f) J4 P* H; ?
! P8 b7 T2 O- ?7 R( X' m& o
1、在企业管理器中,选择菜单上的"工具",再选择"选项";$ i/ _6 U) B1 t% q- C1 o: f
1 W1 K/ d9 Q- z5 ` 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;& Q8 }4 N5 ?" N+ h+ @& [% L: G
* v0 S. [$ E2 C
3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。9 } [' _! h. v! s3 l0 N; j
1 F/ M, Q6 H* z# u. p" | 查询分析器中也可以在同样位置进行设置。 < >
7 `- B8 i7 d2 o+ a二、应用程序连接失败 c; f1 i& O O$ p& K9 L
' {$ c1 a0 Z4 n Q 以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:7 [3 J5 x5 H4 b, k# Z
" i4 Z1 m, Z2 ^
Microsoft OLE DB Provider for SQL Server (0x80004005)
5 f' y3 h* x7 q1 `# _[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.% d' R. [ h3 K8 S
/ m4 b+ U! D" w% O2 E
Microsoft OLE DB Provider for SQL Server (0x80004005)
$ V$ q0 `2 ~5 ?+ ^用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。, M' }+ S7 l3 L& @7 [% X5 a
4 L2 ]/ r8 U* j6 C! n/ y
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'.% ?# W. p9 z7 w" ~
[Microsoft][ODBC SQL Server Driver]超时已过期.: j9 O: S5 o& H6 V. y6 J) M4 Q' d
1 N8 X5 ~- W4 i# _3 R8 X( F
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。
. {% {2 M7 b* L2 z P# \* Y8 s; ], E$ i
. L; X8 ]# g, o* i" n7 h
7 H4 V: ^/ |' i+ x d# B) K
! x& k7 ]9 ?8 F, r9 D$ ]1 ^4 V 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:6 h7 N# K- m7 D# Y: f; j
O: a7 ]$ N) b2 ^0 |
1、使用用于 SQL Server 的 OLE DB 提供者:
' \, @+ x; S/ [7 ~3 O1 P; j, T1 G
使用 SQL Server 身份验证:# E* u' N q6 {& u
5 |: o$ O& F& M9 d3 {) o
oConn.Open " rovider=sqloledb;" & _ 4 j/ |/ v/ i: p$ K: ^1 B8 H& Z% I
"Data Source=myServerName;" & _/ M/ Q% E# t$ H% n: h
"Initial Catalog=myDatabaseName;" & _
, m0 V m, d7 O. |"User Id=myUsername;" & _
; ^7 M/ Z$ N( `( Z" assword=myPassword"
& n; M6 q/ N7 F9 j& u3 J0 ^( @* u: \' {7 z0 r( N6 W$ n) v
使用 Windows 身份验证(信任连接):: z/ F; j! r" ]7 P. K
1 L$ s4 b' C: `9 O& q
oConn.Open " rovider=sqloledb;" & _
) y/ [# p5 D# {8 O; X; W"Data Source=myServerName;" & _+ s3 G* c- v. e- ?5 X
"Initial Catalog=myDatabaseName;" & _$ Y9 X, a, J. E O/ q
"Integrated Security=SSPI"
/ ^9 v8 d, k) F; R$ n: y& n- n+ F& [" X, U$ H7 c4 T
2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):
8 z! w* h) C! J8 r7 ]1 |6 J$ n. u, z
9 G- G% q* R$ Y" d* I" T1 i8 Y 使用 SQL Server 身份验证:
9 o7 J4 c/ b9 R3 |+ B; p2 d- ^, p4 }! w5 C. ?& v/ c: x6 M
oConn.Open "Driver={SQL Server};" & _
/ R7 P1 u3 |0 d# T9 j7 R. m"Server=MyServerName;" & _) q' [6 ]. K5 ?2 j& m7 Y$ b
"Database=myDatabaseName;" & _
8 c+ i3 P) v# D W* R) x) y"Uid=myUsername;" & _! O8 Y6 V, o0 L: i
" wd=myPassword"; k5 t9 H1 K6 @# n
1 \3 \7 ~9 E0 F# W$ J 使用 Windows 身份验证(信任连接):' Y( Z# }' N5 V8 E5 u
% q* q' H4 R( N$ j
oConn.Open "Driver={SQL Server};" & _
/ C' w5 z, m+ k"Server=MyServerName;" & _
/ m( x4 j% w7 A4 h' n" n"Database=myDatabaseName;" & _
X Y1 `9 a+ ~# l"Trusted_Connection=yes"# ^% p9 E/ o& Y! Y b2 k, G6 q
6 W5 }. i2 R" u) q 3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):; U# X8 X( r+ P! j+ b
3 C) D2 K: L- L6 }( ]. f4 DoConn.Open "DSN=mySystemDSN;" & _
: u! t, ~, I! T7 H+ Z"Uid=myUsername;" & _ ' l, n m }, V) \5 U6 D# w
" wd=myPassword"" i4 p+ Q8 F$ n9 k1 {( e' ?8 Y+ g0 D2 m
9 C: n1 ?% N: a" E! V' U8 j
如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
$ \' p; R) n& u
7 |3 Y9 K. I3 d 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:6 u* H) M! D% o. S; b. y
' Q8 U# N; t7 c0 p* R3 O; P, m
! v" \, O" p9 u2 D7 h
% t& j! K& W% R
& Z; L, l' ^+ s7 O2 u
1 v( ]" M# u" m# `# W5 C, G! K 2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如: ( h" u. `( ~9 W7 Z$ C
4 V5 a: h0 {) I7 Z$ j</P>< ><%
$ D. }3 r+ u5 H4 l1 [! qSet Conn = Server.CreateObject("ADODB.Connection")! B$ b! a5 }; N% u
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"6 V# V7 T: C; S
Conn. Properties("Connect Timeout") = 15 '以秒为单位
3 |' v0 A5 c/ G" q6 \1 ?' sConn.open DSNtest
$ b/ W2 m5 b; O% `5 V%></P>< >
; p/ s1 f- Y3 _% U8 n8 X 3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:
' \& q7 P' C3 o$ Z' O' K8 q; y) t- z3 t
</P>< >Dim cn As New ADODB.Connection% L/ J e1 O8 i, s1 C: a: h% q
Dim rs As ADODB.Recordset
5 g) H) O8 Y; u( l( E. . .
2 [, N3 P! o w+ n0 t+ r1 Fcmd1 = txtQuery.Text
+ n2 i* `$ r! `Set rs = New ADODB.Recordset
9 e3 U$ S/ S7 j# frs.Properties("Command Time Out") = 300. t+ b U2 s) a! E
'同样以秒为单位,如果设置为 0 表示无限制- F3 |* P' L! j+ h. Z# s( O N/ k
rs.Open cmd1, cn
, \+ ~" r% y6 s* b7 U9 k( O$ P- Vrs.MoveFirst) w# a$ H) T( p. B" U8 ]* _; H' t7 g6 `7 K
. . . </P>< >$ Q$ G4 M: ^+ D. |1 m6 O; u
<B>三、小结</B>" P* j; S, }- C$ Q: g# S" b
# o. X$ }/ s9 A; o* i% p% V
本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|