哪种方法连接服务器端 sql server7.0 速度快??
数据库在本机速度很快,可放在服务器端就慢了!
服务器和客户机是用10M HUB连的是不是HUB速度太慢了,还是我程序代码有问题?
唉,真难处理。怎么样才能使访问数据库的速度变快呢?
对了我现在是用DSN连接的,DSN连接速度快吗?如果不快,哪种方式快!!!!!
问题点数:100、回复次数:17Top
1 楼vicsue(victor)回复于 2001-11-01 22:37:29 得分 0
我也有同样的问题, 关注!Top
2 楼yuanxy(梦想鸭)回复于 2001-11-02 06:52:57 得分 0
topTop
3 楼yuanxy(梦想鸭)回复于 2001-11-02 07:36:59 得分 0
这里人怎么了,你们的热情哪里去了,不去不要劲top一下不行吗?Top
4 楼rachel_liwei(牙牙)回复于 2001-11-02 08:05:25 得分 10
我现在用的是本机的数据库用ado2.5方式oledb引导连接,速度也不快,我也很关注这个问题。有结果欢迎email沟通联系,addr:wwlee@263.net.Top
5 楼palmkey(原水)回复于 2001-11-02 08:38:56 得分 10
rdo,ado,dao中,使用rdo速度较快,但它还没有直接使用ODBC API快,别的,使用sql server 自带的db library也能获得较好的性能。Top
6 楼yuanxy(梦想鸭)回复于 2001-11-02 10:04:57 得分 0
topTop
7 楼yuanxy(梦想鸭)回复于 2001-11-02 10:12:08 得分 0
谁有存储过程的资料啊听说这个技术可以加速Top
8 楼baoxiang(包香)回复于 2001-11-02 10:16:08 得分 50
存储过程并不是对所有的都能加速。
在有些情况下procedure的速度不一定快。Top
9 楼zcflion(吃大白菜的鸟--菜鸟)回复于 2001-11-02 10:16:49 得分 0
最快是用OLE DB啦
关于存储过程只是优化查询的速度,但并不能加快链接的速度Top
10 楼baoxiang(包香)回复于 2001-11-02 10:17:52 得分 0
ADO Stored Procedure的呼叫
来源:cww
Informix的Stored Procedure之呼叫
假设有两个Stored Procedure如下:
CREATE PROCEDURE GETQPPFA (PCASENO CHAR(8),PSEQ INTEGER)
RETURNING CHAR(1), CHAR(9), CHAR(12), DECIMAL(9,2);
DEFINE psys_kind CHAR(1);
DEFINE pnckm_code CHAR(9);
DEFINE phel_code CHAR(12);
DEFINE PUNIT_PRICE DECIMAL(9,2);
--CASE_NO + SEQ 是UNIQUE的KEY值
SELECT sys_kind, nckm_code, hel_code, unit_price
into psys_kind, pnckm_code, phel_code, punit_price
from qppfa
Where case_no = PCASENO and seq = PSEQ;
RETURN psys_kind, pnckm_code, phel_code, punit_price;
END PROCEDURE;
CREATE PROCEDURE GETQPPFA2 (PCASENO CHAR(8))
RETURNING CHAR(1), CHAR(9), CHAR(12), DECIMAL(9,2);
DEFINE psys_kind CHAR(1);
DEFINE pnckm_code CHAR(9);
DEFINE phel_code CHAR(12);
DEFINE PUNIT_PRICE DECIMAL(9,2);
FOREACH
SELECT sys_kind, nckm_code, hel_code, unit_price
into psys_kind, pnckm_code, phel_code, punit_price
from qppfa
Where case_no = PCASENO
RETURN psys_kind, pnckm_code, phel_code, punit_price WITH RESUME;
END FOREACH;
END PROCEDURE;
如果是传回值的Stored Procedure,那使用方式如下:
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
Private cmd3 As ADODB.Command
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Dim param As ADODB.Parameter
Set cn = New ADODB.Connection
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.ConnectionString = connstr
cn.Open
Set cmd3 = New ADODB.Command
cmd3.CommandText = "Execute procedure getqppfa (?, ?)"
cmd3.CommandType = adCmdText
cmd3.Name = "GetQppfa"
'设定传入的叁数
Set param = cmd3.CreateParameter("CaseNo", adBSTR, adParamInput)
cmd3.Parameters.Append param
Set param = cmd3.CreateParameter("seq", adInteger, adParamInput)
cmd3.Parameters.Append param
cmd3.Parameters("CaseNo").Value = "E8701761"
cmd3.Parameters("seq").Value = 5
Set cmd3.ActiveConnection = cn
Dim ss As Long, i As Long
Set rs = cmd3.Execute '要以这种方式来开启,传回Recordset物件,只有一笔资料
rs.MoveFirst
rs.Close
cn.Close
相对的如果是传回一个Resultset,主要有两种作法,第一种是使用Command物件的Execute
来产生Recordset物件,但是使用这种方式最大的缺点在於我们无法设定它的CursorTye,
似乎会以Scroll Cursor的方式产生(而非Forwardonly),所以要设为Client端的Cursor
才不会有问题(OpenLink ODBC Driver for Informix 在Server端的Cursor只能用ForwardOnly)
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
Private cmd3 As ADODB.Command
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Dim param As ADODB.Parameter
Set cn = New ADODB.Connection
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.ConnectionString = connstr
cn.CursorLocation = adUseClient '设为Client端的Cursor
cn.Open
Set cmd3 = New ADODB.Command
cmd3.CommandText = "Execute procedure getqppfa2 (?)"
cmd3.CommandType = adCmdText
cmd3.Name = "GetQppfa2"
Set param = cmd3.CreateParameter("CaseNo", adBSTR, adParamInput)
cmd3.Parameters.Append param
cmd3.Parameters("CaseNo").Value = "E8701761"
Set cmd3.ActiveConnection = cn
Set rs = cmd3.Execute
rs.MoveFirst
rs.Close
cn.Close
Set cn = Nothing
另外一种可以设定CursorType的方式就不能使用叁数查询了,方式如下:
Set cn = New ADODB.Connection
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.ConnectionString = connstr
cn.CursorLocation = adUseServer
cn.Open
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorType = adOpenForwardOnly
rs.LockType = adLockReadOnly 'Stored Procedure的Recordset不能修改
rs.Open "Execute procedure getqppfa2 ('E8701761')"
rs.MoveNext
rs.Close
cn.Close
Set cn = Nothing
SQL Server6.5呢,它使用Stored Procedure的方式也有一些问题,就是使用OLEDB 的方
式时,没有办法成功,要使用ODBC Provider的方式,另外 CommandType也要设定成
AdCmdText 才没有问题,不能设成AdCmdStoredProc,很奇怪。
而SQL7.0呢,是可以用oledb的方式,但是CommandType也要设定成AdCmdText 才没有问题
,不能设成AdCmdStoredProc。而BStr的叁数也要设定其长度,不然传不回资料
假设有个Stored Procedure如下
CREATE PROCEDURE getqppfa
@pcaseno CHAR(8), @pseq INT,
@OUTVAL INT OUTPUT
AS
SELECT @OUTVAL = (Select Count(*) from qppfa where case_no = @pcaseno)
IF @OUTVAL > 0
RETURN 1
ELSE
RETURN 0
GO
CREATE PROCEDURE getqppfa2
@pcaseno CHAR(8)
AS
SELECT sys_kind, nckm_code, hel_code unit_price
FROM QPPFA
WHERE case_no = @pcaseno
GO
相对应的STORED PROCEDURE呼叫如下:(传回值的呼叫方式)
传回值的呼叫方式
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
Private cmd3 As ADODB.Command
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Dim param As ADODB.Parameter
Set cn = New ADODB.Connection
'Sql 6.5要用以下两行
'connstr = "Driver={SQL Server};UID=cww;PWD=jjh5612;Server=OPEN_VIEW;Database=cwwtest"
'cn.ConnectionString = connstr
'Sql 7.0用以下两行
connstr = "Data Source=ACCOUNT;UID=sa;PWD=;Initial Catalog=NKIUAcc"
cn.Provider = "SQLOLEDB"
cn.Open
Set cmd3 = New ADODB.Command
cmd3.CommandText = "{ ? = call GETQPPFA (?, ?, ?) }"
cmd3.CommandType = adCmdText
cmd3.Name = "GetQppfa"
'设定Return的叁数
Set param = cmd3.CreateParameter("RetValue", adInteger, adParamReturnValue)
cmd3.Parameters.Append param
'设定Input的叁数
'Set param = cmd3.CreateParameter("CaseNo", adBSTR, adParamInput)
'SQL7.0连字串叁数长度亦要设
Set param = cmd3.CreateParameter("CaseNo", adBSTR, adParamInput, 8)
cmd3.Parameters.Append param
'设定Input的叁数
Set param = cmd3.CreateParameter("seq", adInteger, adParamInput)
cmd3.Parameters.Append param
'设定OutPut的叁数
Set param = cmd3.CreateParameter("RecCount", adInteger, adParamOutput)
cmd3.Parameters.Append param
cmd3.Parameters("CaseNo").Value = "E8701761"
cmd3.Parameters("seq").Value = 5
Set cmd3.ActiveConnection = cn
cmd3.Execute
Debug.Print cmd3.Parameters(0), cmd3.Parameters(3)
'也可以使用这种方式呼叫,结果和上面相同
Dim ss As Long, i As Long
i = cn.GetQppfa("E8701761", 5, ss)
Debug.Print i, ss
SQL Server传回Resultset的作法
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
Private cmd3 As ADODB.Command
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Dim param As ADODB.Parameter
'Sql 6.5要用以下两行
'connstr = "Driver={SQL Server};UID=cww;PWD=jjh5612;Server=OPEN_VIEW;Database=cwwtest"
'cn.ConnectionString = connstr
'Sql 7.0用以下两行
connstr = "Data Source=ACCOUNT;UID=sa;PWD=;Initial Catalog=NKIUAcc"
cn.Provider = "SQLOLEDB"
cn.ConnectionString = connstr
cn.Open
Set cmd3 = New ADODB.Command
cmd3.CommandText = "{ call GETQPPFA2 (?) }"
cmd3.CommandType = adCmdText
cmd3.Name = "GetQppfa2"
'Set param = cmd3.CreateParameter("CaseNo", adBSTR, adParamInput)
'SQL7.0连字串叁数长度亦要设
Set param = cmd3.CreateParameter("CaseNo", adBSTR, adParamInput, 8)
cmd3.Parameters.Append param
cmd3.Parameters("CaseNo").Value = "E8701761"
Set cmd3.ActiveConnection = cn
Set rs = cmd3.Execute
rs.MoveFirst
.
.
rs.Close
cn.Close
这是我在别的地方看到的。先转贴到这里。
大家看看吧。
这是Procedure的一种用法。
Top
11 楼yuanxy(梦想鸭)回复于 2001-11-02 10:18:41 得分 0
那在单机下运行很快啊,到局域网怎么就慢了呢?
to zcflion
ole db怎么用Top
12 楼yuanxy(梦想鸭)回复于 2001-11-02 16:35:28 得分 0
好长Top
13 楼huxianwei(飞狐)回复于 2001-11-02 16:41:26 得分 10
有几个原因:
一、网络速度,可以此时一下,例如靠一个大文件;
二、不同的操作系统,例如在win98和winnt之间的网络通讯会很慢.Top
14 楼yuanxy(梦想鸭)回复于 2001-11-02 16:54:28 得分 0
楼上的我就是用win98和winnt通讯的。有什么办法解决吗?Top
15 楼Ganzl(甘逐浪)回复于 2001-11-02 21:43:45 得分 20
我想不会是数据访问方法造成的性能问题,是客户端与服务器的网络通讯问题,将服务器和工作站只使用TCP/IP通讯协议Top
16 楼fangoxyz(小虫)回复于 2001-11-02 21:58:55 得分 0
数据库是使用什么?Top
17 楼yuanxy(梦想鸭)回复于 2001-11-02 22:03:58 得分 0
sql server 7.0Top




