- 在线时间
- 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 [2 ~7 G; n9 t; J( ~" q4 W+ o; J% b5 Y$ k8 _# V7 t
$ M# E2 T4 T1 Q
通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。下面我们再详细描述如何来解决错误 2。2 p" O1 r" W' t5 c% X$ m' M
; T3 @, K6 c# F& \
当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:; D: I- ]6 O+ i) W
% L* |4 d2 L/ X! V- z( g7 E) j) l 1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;
" k! {# \, Y K, ~: Z. @
9 y. s- L T+ [) ]- I 2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;5 T( f3 H. e6 C0 {* O
9 o# G: Z }8 @- [- M1 U 3、 在"身份验证"下,选择"SQL Server和 Windows "。. u8 K, {* Q# O* p- J
% }1 Y( C6 @4 W/ ?2 a5 l
4、 重新启动SQL Server服务。
' y- Q9 C# l# D! i; G* c0 l2 u3 K# }# Z/ y
在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:/ c) C4 j7 }4 r- @( \
" Z6 ?' ^ ]" c6 m( d/ d. D
1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;9 S% ^2 F( Z* s2 q% G# s
9 ^- g0 E! z) `' y- q
2、依次展开注册表项,浏览到以下注册表键:
. V! z( e2 G' c q- R
/ w n/ {: ]5 _0 s[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]1 a# Q. \' x6 i5 @/ U4 g, o
4 p3 `: h, f N6 s4 X9 x 3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;
/ ]& E) d7 Y: U0 q+ `) R( ^! H; f, q7 S( `& K$ m
4、将原值从1改为2,点击"确定"; k4 Z& o8 T' J
2 C2 r ? Y* q, u6 U 5、关闭注册表编辑器;( [6 Y% u4 b) I: u D( Y
$ ]! r' f& Q. M 6、重新启动SQL Server服务。; d$ Z a; r3 A1 l$ u" _1 Y# M
9 t3 q1 T" P2 C, V 此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:5 [! V k- f* Y8 r
! a$ \+ C! w2 e+ w$ O1 K! ` 1、打开企业管理器,展开服务器组,然后展开服务器;5 Q# F# Z! E/ Z* n* K
0 |7 N: W! I" M 2、展开"安全性",右击"登录",然后单击"新建登录";
. T/ y' K2 c3 X$ K: H1 g( q. a& J& v" R. s/ s [. M7 w, X3 t: c; X" c
3、在"名称"框中,输入 BUILTIN\Administrators;
8 O! N: h7 @# D7 W0 D8 m
7 ^1 C N9 S4 Z( F( F+ W0 { 4、在"服务器角色"选项卡中,选择"System Administrators" ;
/ e9 }( R& I3 Q7 l+ |2 H; o2 V1 T7 L
5、点击"确定"退出;
! o" _% o; W) Y8 [( l
0 t( a7 `, C1 S! Z 6、使用同样方法添加 <机器名>\Administrator 登录。
+ _* v* f7 ?" q. `0 r
0 p$ Q- O9 Q5 @ 以下注册表键2 _: ~3 E6 r+ m: [
& @# x3 w- j' VHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode4 C6 `4 ]) r) ~! h/ m
# N7 e3 F4 c4 G. i+ V1 X 的值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。* q6 d$ m$ A* C1 Q" \* \. F
$ h3 C9 a2 C4 k* X. k, u
看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。
8 t0 f% i! f( g* f* |/ b. a
8 ?2 x# F4 a+ e) p! u 如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。$ q3 O& r' r* \& X. ]( K
3 A$ x+ }8 t7 j& }# d* N8 u( Z
要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:
7 o, _3 B* g- r& J1 Z( \6 o3 w9 K( Z. r
1、在企业管理器中,选择菜单上的"工具",再选择"选项";
7 ^$ V2 S2 I/ v; e
u! I' }) s5 u' h. j& K" Z2 O6 L* s1 H1 t 2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;& W2 m' Y n( N( t4 ~* l
% H' ]5 l1 Y: u- l8 ~. X8 E* C 3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。
8 F ]) a6 r' ~ J1 U6 V4 c1 f
% g- @0 U6 q: ^' A$ J4 J u 查询分析器中也可以在同样位置进行设置。 < >9 n6 h! B4 `% y3 v* ]9 r
二、应用程序连接失败0 ]/ |, o! i, O" {0 F A" z
& t) z+ _: ~* ^( ^: V9 Q- Z; g$ s7 G
以上的三种错误信息都是发生在 SQL Server 自带的客户端工具中,在应用程序中我们也会遇到类似的错误信息,例如:* ~* R1 R+ d& F. L% |- g1 }
* w' ]0 z8 @( f2 m6 `0 w; U7 i- a
Microsoft OLE DB Provider for SQL Server (0x80004005)0 F) O2 [7 p- a$ y
[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.
+ {; ]4 f7 `: I( X& p/ Z) c# y' I3 J8 l' e: t# n$ `
Microsoft OLE DB Provider for SQL Server (0x80004005)1 d# f$ ^3 R7 G% A$ E! T" d1 D E
用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。+ L' ?1 P6 o% ]- J
: I# L o2 o+ [5 ^- GMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005'.6 \; a) { J# w5 E0 V! b* K c1 b% @
[Microsoft][ODBC SQL Server Driver]超时已过期.+ p: S3 ~5 K, x4 I# ^
) a+ l- ]3 u2 h- q
首先,让我们来详细看以下的示意图来了解一下使用 ODBC 和使用 OLE DB 连接 SQL Server 有什么不同之处。- U7 q" `5 U3 `3 n. Z; B
& b# U# }& w1 W+ m& y
1 A$ b- h* i: r3 x
/ c b, H1 C7 ^! K, [* l% d% Z' R
( k, x8 p( ^. l# ] 从上图中,我们可以看出在实际使用中,应用程序创建和使用各种 ADO 对象,ADO 对象框架调用享用的 OLE DB 提供者。为了访问 SQL Server 数据库,OLE DB 提供了两种不同的方法:用于 SQL Server 的 OLE DB 提供者以及用于 ODBC 的 OLE DB 提供者。这两种不同的方法对应于两种不同的连接字符串,标准的连接字符串写法如下所示:/ T: M `3 N9 E3 V! z
7 h. c/ ] ]" k2 i p/ J+ @ 1、使用用于 SQL Server 的 OLE DB 提供者:7 A! @2 t3 l$ v7 u
8 A; W8 J3 O7 O3 ?, N, v9 p
使用 SQL Server 身份验证:
& ]/ S# \) y' w g/ ?! G- f0 e& Q! `# R9 e; H3 K2 c( Z
oConn.Open " rovider=sqloledb;" & _
! C( Y1 ~. y5 x8 a4 M"Data Source=myServerName;" & _0 [( u! `$ Z+ h
"Initial Catalog=myDatabaseName;" & _
6 t0 `9 @5 {3 P2 n% X"User Id=myUsername;" & _1 _1 Z$ p* x1 x# Z/ i2 z/ b4 w
" assword=myPassword"
8 _. s9 Y" H) H5 I2 H
1 G' E9 z" B( r- j 使用 Windows 身份验证(信任连接):
* o' G/ }' o2 |4 n: g% X+ q5 ~; H- a9 G+ x
oConn.Open " rovider=sqloledb;" & _
' y2 U" o) Q9 k6 O: }* f$ x: }"Data Source=myServerName;" & _
" p4 W) p+ f# R; q! Z1 C- R W"Initial Catalog=myDatabaseName;" & _
0 X; ^3 T; N2 a7 u8 z"Integrated Security=SSPI"
* H' b/ g) K: [. C; l m8 M- d; o' D! l. _
2、使用用于 ODBC 的 OLE DB 提供者(不使用 ODBC 数据源):1 G4 o1 S B; F' V* c
5 l+ B N( _/ G6 O3 e
使用 SQL Server 身份验证:+ u9 C7 `6 `; e: R2 p- J* j+ c
% z b' u$ b. ^# K7 |0 a% r: [
oConn.Open "Driver={SQL Server};" & _
* [1 |2 p* d: ~, J; p"Server=MyServerName;" & _
) B, B1 h* f7 j4 ?* ?+ }2 W+ \"Database=myDatabaseName;" & _) Q* i$ x' t; q' A
"Uid=myUsername;" & _
& {( Z6 J( c8 \! `" wd=myPassword"2 @; u7 s5 ]. L' c
8 d R1 e8 Z( d" _2 J6 P# G9 L; J1 R4 i
使用 Windows 身份验证(信任连接):3 B) G: q6 L2 C% H5 d$ a& G: R5 I
5 U1 R) Z* M2 f" b# ]. YoConn.Open "Driver={SQL Server};" & _
3 I2 r, k/ J$ z- p"Server=MyServerName;" & _$ J- j5 d$ g6 n
"Database=myDatabaseName;" & _
1 g' |+ C# M5 M, L& U5 z"Trusted_Connection=yes"0 I8 ?* N* f$ j/ U9 E4 T
4 q7 i7 c' @1 Z" w" I& Z/ I
3、使用用于 ODBC 的 OLE DB 提供者(使用 ODBC 数据源):
* M9 x) k2 S1 m( T" |# w0 j V8 j
& m- \: E3 j* k+ {/ y* coConn.Open "DSN=mySystemDSN;" & _ ( z. O6 q2 D' Z+ z/ ] W$ v" u
"Uid=myUsername;" & _
- e& ~' c/ @; J" wd=myPassword"
, @- B! r/ k x% C: a0 ?/ W; _
如果遇到连接失败的情况,我们只要按照一中所示的方法,结合程序中的连接字符串进行检查,基本都能得到解决。另外,还有以下几个要注意的地方:
7 i( o; D7 g W0 }, m* M& K) f- r
, x: [! c: d7 i0 F$ T, Y2 a D 1、配置 ODBC 数据源时,点击"客户端"配置选项可以让我们指定连接使用的网络库、端口号等属性,如下图所示:0 y! E y# D l+ N! O7 Z! w
# E, ^1 c$ H: g& ~* _ 2 q& E- u: r' F0 ^' k: D1 \
5 j0 R$ D5 c, M" H8 j3 q
t9 m0 W+ I `: F: d$ x$ H0 L) Q- N, Z; N% Y
2、如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如: 5 X6 }% L, w8 L @" W
3 b1 G4 V& \$ O% A
</P>< ><%
3 X3 Q" ^: l% k' {Set Conn = Server.CreateObject("ADODB.Connection")) [5 @& T# I8 V, J' G
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER WD=password;DATABASE=mydatabase"* w7 I, e+ _3 ^; ]; V% [
Conn. Properties("Connect Timeout") = 15 '以秒为单位
3 U: i1 |9 O/ j" n1 ]$ Y% eConn.open DSNtest
4 S6 D' M h: L: s%></P>< >. F2 i' E$ R8 h J6 L! L; Q
3、如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:, Y! o$ N# G# c. n+ b6 ^* w* K8 L
' {! @) l7 |1 C& h
</P>< >Dim cn As New ADODB.Connection3 j4 @+ `' {- j- h$ |
Dim rs As ADODB.Recordset) Z Y1 K& p" `8 }& [9 f* i+ i6 G
. . . + A3 N1 c& W% T/ a/ L! y
cmd1 = txtQuery.Text* |, v$ t5 P2 y4 y
Set rs = New ADODB.Recordset' v" V0 E* U4 q2 G6 W3 W6 _
rs.Properties("Command Time Out") = 300
& X+ Q2 q7 Z1 K1 x# d2 i" A7 t$ F- p$ t'同样以秒为单位,如果设置为 0 表示无限制4 d4 H" L1 d+ V F4 P" r, C' \. w
rs.Open cmd1, cn
, k3 y Q7 @, I9 Srs.MoveFirst
) ]7 q3 Z9 h6 Q. . . </P>< >
- C2 x' m1 M4 ` <B>三、小结</B>( \0 P7 }; z' l% T
' j* [5 B8 o* i 本文针对大部分用户在使用 SQL Server 过程中常见的连接失败的错误,重点讨论了在使用 SQL Server 客户端工具以及用户开发的应用程序两种情况下,如何诊断并解决连接失败的错误。看过本文以后,相信每一个读者都会对 SQL Server 的连接工作原理、身份验证方式以及应用程序开发等有一个较为全面而深入的连接。本文中所有的测试或者示例均在 Windows 2000 Advanced Server + SQL Server 2000 企业版上通过。</P> |
|