ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4370|回复: 12

存储过程中的一个难题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2004-1-15 12:20 | 显示全部楼层 |阅读模式
我建了这样一个存储过程如下: 其中d1/d2是查询起止时间,idd是查询序号 ALTER proc db_query1 @d1 datetime ,@d2 datetime =@d1 ,@idd tinyint
as if @idd =1 /*PTV销售*/
begin
select........................ return
end
if @idd =2 /*dl光电销售*/
begin
select........................ return
end
if @idd =3 --批发退机
begin
delete wangj.dbo.db_tuiji
insert into wangj.dbo.db_tuiji select .......................
update wangj.dbo.db_tuiji set 类别='RGB' FROM .....................
update wangj.dbo.db_tuiji set 类别='DG' FROM .......................
select * from wangj.dbo.db_tuiji
return
end
以下是我在vba中使用这个存储过程的部份代码: With rst
.ActiveConnection = conn
.CursorLocation = adUseServer
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open "db_query1 '" & Ds & "','" & De & "'," & QueryIdd
If .EOF Then
MsgBox Ds & " ~ " & De & " 期间的“" & txtIDD & "”无数据...", vbOKOnly, "信息"
End
End If
End With
当queryidd=1或者2时,,程序能正常执行 ,但queryidd=3时,不正常执行 .Open "db_query1 '" & Ds & "','" & De & "'," & QueryIdd 总是没有打开记录集,导致 下一句 If .EOF Then 出错,提示"对象已关闭,不能操作" 而我在sql查询分析器中执行 db_query1 '2003-1-1','2003-1-2',3 则能得到所要的记录集,即"select * from wangj.dbo.db_tuiji" 分析以上结果,当idd=3时的操作查询语句共有四句,而1/2只有一个比较复杂的选择查询 现在的问题:如何修改以上存储过程中的if @idd =3 段的sql语句,(我要对tuiji表先删除原记录,再添加,再二次update修改,最后想得到tuiji表的结果记录) 谢谢


TA的精华主题

TA的得分主题

 楼主| 发表于 2004-1-15 14:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
To:loadhigh 但我是要将将最后一个的选择查询结果集赋于一个rst然后有其它用的的
if @idd =3 --批发退机
begin
delete wangj.dbo.db_tuiji
insert into wangj.dbo.db_tuiji select .......................
update wangj.dbo.db_tuiji set 类别='RGB' FROM .....................
update wangj.dbo.db_tuiji set 类别='DG' FROM .......................
select * from wangj.dbo.db_tuiji
return
end 我应如何调整这几句sql呢?(操作顺序不能变)

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-1-15 17:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
insert into 与insert 是等价的,应该不是这个问题 否则我在查询分析器中也不可能正确执行的. 请参考刚才csdn上一个朋友的解答,我还没时间 验证是否可行.先贴出来: 在以下两句之间加上 " set rst=rst.NextRecordset" .Open "db_query1 '" & Ds & "','" & De & "'"
If .EOF Then 改成这样 .Open "db_query1 '" & Ds & "','" & De & "'"
Set rst=rst.NextRecordset
If .EOF Then

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-1-15 22:12 | 显示全部楼层
不是权限的问题,也不关LockType的事

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-1-16 10:31 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-1-16 15:00 | 显示全部楼层
呵呵,异曲同工啊,我们俩都想到同样办法绕过了这个问题--是绕过而不是解决 : ) 我也分了二步走,第一步是修改原sp如下
if @idd =3 --批发退机
begin
delete wangj.dbo.db_tuiji
insert into wangj.dbo.db_tuiji select .......................
update wangj.dbo.db_tuiji set 类别='RGB' FROM .....................
update wangj.dbo.db_tuiji set 类别='DG' FROM .......................
/*select * from wangj.dbo.db_tuiji */ ----注销此行
return
end 以下是我在vba中使用这个存储过程的部份代码: With rst
If QueryIdd = 3 Then
conn.Execute "db_query1 '" & Ds & "','" & De & "'," & QueryIdd
.Open "select * from wangj.dbo.db_tuiji" '将原sp中注销掉的sql语句放在这里
Else
.Open "db_query1 '" & Ds & "','" & De & "'," & QueryIdd
End If

If .EOF Then
MsgBox Ds & " ~ " & De & " 期间的“" & txtIDD & "”无数据...", vbOKOnly, "信息"
End
End If
End With 跟本解决问题的办法可能象csdn上的一个朋友说的办法如下: .Open "db_query1 '" & Ds & "','" & De & "'," & QueryIdd Set rst=rst.NextRecordset ''新增此句
If .EOF Then
但时间关系我没再试了,因为我看到这个时,已按前述方法绕过去了 谢谢loadhigh的帮助

TA的精华主题

TA的得分主题

发表于 2004-1-16 18:01 | 显示全部楼层
我始终觉得sp类似一个过程(sub),而不是类似于函数(function),不需要返回结果集。需要返回结果集,那就使用cursor.我设计和实现系统中都是这样做的。

TA的精华主题

TA的得分主题

发表于 2004-1-16 11:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我建立了一个和你类似的带参数的sp。好像是insert以后在select ,用rst.open时是报错误的. 不过,我改用另一种cnn和rst结合的方式,就可以返回正确的数据.建议你也改改。 cnn.execute "db_query1 '"+cstr(Ds) +"' , '"+cstr(De)+"' ,"+cstr(QueryIdd ) if QueryIdd = 1 then rst.open "...." '这里可能打开的不是wangj.dbo.db_tuiji,所以请自己加入代码 if QueryIdd = 2 then rst.open "...." '这里可能打开的不是wangj.dbo.db_tuiji,所以请自己加入代码 if QueryIdd = 3 then rst.open "wangj.dbo.db_tuiji", cnn , adOpenForwardOnly, adLockReadOnly with rst
If .EOF Then
MsgBox Ds & " ~ " & De & " 期间的“" & txtIDD & "”无数据...", vbOKOnly, "信息"

End If
End With

TA的精华主题

TA的得分主题

发表于 2004-1-15 22:53 | 显示全部楼层
那我就建立一个类似你的情况的sql server环境,来看到底是什么地方出了问题?不过我白天是十分的忙,争取明天晚上给你答复.

TA的精华主题

TA的得分主题

发表于 2004-1-15 20:33 | 显示全部楼层
另外,你在Isql(查询分析器)里面是使用的是sa权限吗?你打开这个cnn的用户也是sa吗? 或者在isql里面的用户权限(对表wangj.dbo.db_tuiji )是否和打开cnn的用户的权限(对表wangj.dbo.db_tuiji )一致?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-14 14:55 , Processed in 0.044499 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表