Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

在UMV企业版平台中如何使用存储过程

韩志  发表于:2008-04-26 14:46:34  
复制

众所周知,SQL SERVER的"存储过程"就是编译和优化好了的SQL语句

与普通的查询相比,可以省去数据库编译和优化SQL代码的过程,执行速度快,还可以降低客户端对服务器访问时由于SQL语句过长造成的网络资源消耗。

我们的企业版由于使用了SQL SERVER做后台数据库,所以自然也可以使用储存过程。下面用一个小例子演示一下如何在企业版UMV平台里使用存储过程

 

首先 在平台里用UMV教程的方法创建子窗体和子窗体数据源查询

 

其次  在SQL SERVER数据库上建立一个存储过程

如;下面这个名为 sd_ggtz的存储过程创建过程

use fulltrysale

go

create procedure sd_ggtz
as
SELECT tblcode_ggtz.tzid AS 调整编号, tblcode_cp.cpmc AS 调减产品, tblcode_cp_1.cpmc AS 调增产品,
tblcode_ggtz.tzsl AS 调整数量, tblcode_ggtz.tzsj AS 调整时间, sys_tblUser.userName AS 操作员,
tblcode_ggtz.czsj AS 操作时间, tblcode_ggtz.bz AS 备注
FROM tblcode_ggtz
INNER JOIN tblcode_cp ON tblcode_ggtz.cpidj = tblcode_cp.cpid
INNER JOIN sys_tblUser ON tblcode_ggtz.czyid = sys_tblUser.userNumber
INNER JOIN tblcode_cp AS tblcode_cp_1 ON tblcode_ggtz.cpidz = tblcode_cp_1.cpid;

go

呵呵 看起来语句很长,其实不用怕,您完全可以用下面这种方式去做

 

use 数据库名

create procedure 存储过程名
as

sql语句  (在ACCESS里用 SQL视图 查看我们已经创建的“子窗体数据源查询”,把里面的SQL语句,直接复制到这里来)

 

运行这个创建存储过程的代码(可以在查询分析器里选中这部分代码按F5,显示“命令创建成功”就OK)

这样我们的后台数据库里就创建了这个存储过程

 

最后 在前台用代码去执行这个存储过程,并将它返回的记录集作为子窗体的数据源

例如,我们可以在子窗体的load事件中完成上述操作

Private Sub Form_Load()
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim connstr As String
connstr = Forms!usysfrmlogin!LabConn.Caption 'Forms!usysfrmlogin!LabConn.Caption 这个是我们平台里存放连接字符串的地方,用企业版的用户可模仿使用即可。

conn.Open connstr '打开连接
Set rst = conn.Execute("sd_ggtz") '执行存储过程,并把它返回的记录集赋予ADO的记录集
Set Me.Recordset = rst '把ADO的记录集作为窗体的记录源
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing
End Sub

这样您打开窗体时,窗体显示的数据和用教程的方法显示的数据是一样的,但是执行速度会快很多。因为前台不用编译和发送SQL语句,后台不用再重复执行编译优化SQL语句的工作。但第一次打开存储过程时后台数据库需要执行编译和优化,执行一次以后,存储过程就被保存在服务器的内存中,这样下次其他用户或您自己再访问的时候,就可以直接使用了。速度当然也快很多咯

 

关于存储过程的知识大家可以参考相关的书籍和教程,在此不再赘述。只是告诉大家我们的平台是可以使用存储过程的。

 

 

另外在平台里同样可以执行 “事务” 操作,即把一连串的动作作为一个“原子”提交给数据库,防止由于一部分动作执行完成,另一部分动作执行出错或由于停电系统故障等原因造成数据结构完整性丢失。把一连串的动作作为一个 “事务”处理,结果只能有二:要么全部提交,要么某个地方出现错误后全部回滚到事务执行前的状态。

 

在UMV平台里使用事务的方法以后再发帖阐述。(9月份考试结束了再发,呵呵)

 

Top
麥田 发表于:2008-04-26 15:08:59
好东西  掌声鼓励下!  ^_~

韩志 发表于:2008-04-26 18:02:54

为了配合子窗体数据源从后台数据库的存储过程种调用,我们在做查找功能时,需要把相应的代码修改一下

Public Sub FindEnd()

    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim connstr As String
    connstr = Forms!usysfrmlogin!LabConn.Caption
    conn.Open connstr
    Set rst = conn.Execute("sd_ggtz")
    Set Me.Recordset = rst
    rst.Filter = Replace(Forms!usysfrmFind!txtSQL, "where", "", , 1)'用替换掉 where的字符串过滤记录集
    Set Forms!usysfrmmain!frmChild.Form.Recordset = rst
    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
End Sub



韩志 发表于:2008-04-27 09:48:23

修正一下,这一句不要的

 

public Sub FindEnd()

    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim connstr As String
    connstr = Forms!usysfrmlogin!LabConn.Caption
    conn.Open connstr
    Set rst = conn.Execute("sd_ggtz")
    Set Me.Recordset = rst '这一句不用的
    rst.Filter = Replace(Forms!usysfrmFind!txtSQL, "where", "", , 1)'用替换掉 where的字符串过滤记录集
    Set Forms!usysfrmmain!frmChild.Form.Recordset = rst
    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
End Sub



竹笛 发表于:2008-09-16 15:46:15

经俺用笔记本电脑测试,返回65万条记录时,打开正常,但我将记录数指定到最后一条时,内存不存!

不过还是蛮好的,哈。



芊芊 发表于:2008-09-25 16:40:30
不错!学习!

总记录:5篇  页次:1/1 9 1 :