MYSQL存储过程调用参数的问题

zuoxingyu 2009-10-19 11:22:51
直接上代码吧

Option Explicit

Private Sub Command1_Click()

Dim MyComm As New ADODB.Command
Dim Rs_GetList As New ADODB.Recordset

With MyComm
.ActiveConnection = Cn 'MarketConn是数据库连接字串
.CommandText = "pp(3)" '" 'SP_Ping_Dialtest" '指定存储过程名
.CommandType = adCmdStoredProc '表明这是一个存储过程
.Prepared = True '要求将SQL命令先行编译
' .Parameters(1) = "1"
Set Rs_GetList = .Execute

End With
'Set Rs_GetList = Cn.Execute("call pp()")
While Not Rs_GetList.EOF
Debug.Print Rs_GetList.Fields(0).Value
Rs_GetList.MoveNext
Wend
End Sub

上面是VB的代码。CN通过数据源和MYSQL联系起来

下面是存储过程的代码
[code=SQL]


create procedure PP(a int)
begin
select * from t where s1>a;
end
[/code]

t表的记录(1,2,3,4)

======================================================
问题:
调用方法1:CommandText = "pp(3)" 参数带到这里,既然这样,那和STRSQL直接传SQL命令进去有什么不同
调用方法2:' .Parameters(1) = 1 参数传递进去后,在最后 Set Rs_GetList = .Execute的时候就报错了。

对于VB调用MYSQL的存储过程,是不是只能用命令,把参数全部写到命令字符串里面??
...全文
516 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
感谢马克思。。
第一个问题赞同。。第二个问题,可以指出来,我这样的调用为什么出错吗??我编码哪里有问题。详细请看我贴出来的代码、
getemail 2009-10-19
  • 打赏
  • 举报
回复
对于VB调用MYSQL的存储过程,是不是只能用命令,把参数全部写到命令字符串里面??
不是,调用的是一个可带参数的子程序,也可不带,子程序在服务器里,只是让它执行起来
getemail 2009-10-19
  • 打赏
  • 举报
回复
调用方法1:CommandText = "pp(3)" 参数带到这里,既然这样,那和STRSQL直接传SQL命令进去有什么不同

前者在服务器运行,如果有100条语句要运行就知道有什么不同了吧?
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
沙发自己坐。。在线等、
getemail 2009-10-19
  • 打赏
  • 举报
回复
我觉得LZ可以借机学学PHP
因为PHP+mysql是比较完美的
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
还是感谢你的顶。。。
明天再没结果,我先结贴给你分吧。。
vbman2003 2009-10-19
  • 打赏
  • 举报
回复
mssql可以在系统表里查询一个存储过程是否存在....我想mysql应该一样道理吧...
vbman2003 2009-10-19
  • 打赏
  • 举报
回复
不好意思,帮不上你了,mySQL没用过,一点不了解....

帮顶
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
补充一个问题:
MYSQL的存储过程,可以进行加密发布吗?
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
参考创建表的SQL命令

DROP TABLE IF EXISTS `sys_dictionary`;
CREATE TABLE `sys_dictionary` (
`SYS_DICTIONARY_ID` int(8) NOT NULL,
`NAME` varchar(50) default NULL,
`REMARKS` varchar(1000) default NULL,
`PARENT_ID` int(8) default NULL,
`SORT` int(8) default NULL,
`ISFLAG` char(1) default NULL,
`SIGN` varchar(50) default NULL,
`SYS_VALUE` varchar(50) default '',
PRIMARY KEY (`SYS_DICTIONARY_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;


这里咋可以啊。

VBMAN,帮忙看下。。
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
新问题,借老帖子发吧。省点分;
直接贴代码;

drop procedure IF EXISTS `pp`;

create procedure PP(a int)
begin
DECLARE v int;
set v=(select SUM(case when s1 >2 then 1 else 0 end )from t);
select * from t where s1>v;
end



我想做一个SQL文件,导入后,直接执行,就创建一个存储过程,这个里面需要判断是否已经存在此过程

现在的问题是。第一行的判断语句和下面的,不能一次执行。贴出来的代码就是我这个SQL文件的全部,执行错误,单独执行,先执行检查重复的,再执行创建代码,可以执行。。

怎么样做到一起呀??
vbman2003 2009-10-19
  • 打赏
  • 举报
回复
虽然SQL存储过程我用的比较少。不过我对数据库数据的处理,一般习惯尽量用参数化的方式,即使是ACCESS也是如此。参数化将变量作为对象来处理,一是安全,二是更加可靠....只是代码量可能会多一点,不过我自己感受是代码不容易出错,好写,好查...断断续续的想过,要是能写一个高效的通用过程就好了,一直没有好思路...
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
做了一些简单注释。代码如下。

Private Sub Command1_Click()

Dim MyComm As New ADODB.Command '定义一个命令对象
Dim Rs_GetList As New ADODB.Recordset '定义一个记录集对象
Dim param As ADODB.Parameter '定义一个参数对象

With MyComm
.ActiveConnection = Cn '数据连接
.CommandText = "pp" '存储过程名称
.CommandType = adCmdStoredProc '表明这是一个存储过程
.Prepared = True '要求将SQL命令先行编译
Set param = .CreateParameter("@a", adInteger, adParamInput, 4, 3) '申明一个参数
.Parameters.Append param '把参数添加到参数列表里
Set Rs_GetList = .Execute '执行此存储过程,返回记录集
End With

While Not Rs_GetList.EOF '循环打印记录集的字段
Debug.Print Rs_GetList.Fields(0).Value
Rs_GetList.MoveNext
Wend

End Sub


抛砖引玉。
zuoxingyu 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vbman2003 的回复:]
这样传递参数是不正确的,添加参数方法如下: 
VB codeDim paramAs ADODB.ParameterSet param= cmd.CreateParameter("@a", adInteger, adParamInput,4,1)
cmd.Parameters.Append param
[/Quote]

感谢VBMAN2003,搞定了。。

我整理下,做一个通用的模板出来。。
vbman2003 2009-10-19
  • 打赏
  • 举报
回复
这样传递参数是不正确的,添加参数方法如下: 

Dim param As ADODB.Parameter
Set param = cmd.CreateParameter("@a", adInteger, adParamInput, 4, 1)
cmd.Parameters.Append param

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧