这个问题也许很多人问过,但一直没有答案,谁是真的英雄!(vb+oracle存储过程调用) 楼主,参数不是这样传递的你可以参考以下http://expert.csdn.net/Expert/topic/903/903782.xml?temp=.1472589 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 With cpwxSet .ActiveConnection = Cn.CommandText = "{call packperson.GETperson(?,{resultset 0, fname})}" .CommandType = adCmdText 'adCmdText Set Pram = .CreateParameter("varssn", adInteger, adParamInput, ,666223333) .Parameters.Append Pramend with 还要注明一点,你在结速FORM时,先对recordset关闲,再对Command关闲。否则不能取到记录集! fname不是游标类型,不知{resultset 0, fname}是否有错,你试试把删除,改成以下:.CommandText = "{call packperson.GETperson(?)}" 1、connection的provider应该改成Provider=MSDAORA.12、command的写法不对,而且少了一个参数设定,应该改成如下:plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"With cpwx Set .ActiveConnection = Cn .CommandText = plsql .CommandType = adCmdText .Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)End WithSet Rs.Source = cpwx.Executevarssn这个参数在包中并没有发挥作用,但是在调用的时候不能省略。以上代码在vb6/ado2.5下测试通过。 首先还是感谢各位的回答,但是,按照弱水兄的做法可以不出错的完成,但是怎么样绑定或显示记录集呢?如果不能绑定,那怎么把取回的数据写到网格之类的控件中呢?如果一行行的写岂不是效率太低!送佛送到西天,帮我帮到底吧!:)以下是我的command1_Click代码:---------------------------------On Error GoTo xxxxDim cpwx As New ADODB.CommandDim Rs As New ADODB.Recordsetplsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"With cpwx Set .ActiveConnection = Cn .CommandText = plsql .CommandType = adCmdText .Parameters.Append .CreateParameter("666223333", adNumeric, adParamInput, 9, 1)End WithSet Rs.Source = cpwx.ExecuteMsgBox (Rs.Fields.Count) '这里显示为1MsgBox (Rs.Fields("fname").Value) --这句话错误,显示为对象关闭时不能打开Set DataGrid1.DataSource = Rs.Fields("fname") '这句话更不行了!:)Set DataGrid1.DataSource = Rs '这句话也不行DataGrid1.RefreshExit Subxxxx:msgbox(error)-----------------------------------------------'唉,到底怎么样把记录集给取出来啊!又怎么样绑定到网格中呢!我用的网格是VB自带的datagrid(oledb)还有,虽然按照弱水兄的提示,没有出错,但我还是搞不清那个什么 "{call packperson.GETperson(?, {resultset 1000, fname})}"这个字符串为什么要这样写,猜了一下,是不是这样的原理;{call <包名>.<过程名>(<?这个是干什么的啊>,{resultset <返回的记录行最大数>,<记录集名>})}请各位也帮着看一看这样理解对吗?如果不对,那该怎么理解呢?深深的期待中............... 记录集的问题讨论过很多,faq里面就有。 能从FAQ里看明白我就不会到这里问了,老大! Parameters.Append .CreateParameter("666223333", adNumeric, adParamInput, 9, 1)这句话还是有错,你要熟悉command的CreateParameter方法才行,createparameter(name,direction,type,size,value)把它改成以下Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9,666223333)问题二"{call packperson.GETperson(?, {resultset 1000, fname})}"?是用在前端输入的参数而已,相当于oracle存储过程中的inprocedure getperson(varssn int,fname out Tfname);varssn默认为in plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"With cpwx Set .ActiveConnection = Cn .CommandText = plsql .CommandType = adCmdText .Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)End WithSet Rs.Source = cpwx.ExecuteMsgBox (Rs.Fields.Count) '这里显示为1'下面这句话没出错,但在网格里,看不到任何东????????????Set DataGrid1.DataSource = Rs DataGrid1.Refresh'唉,到底怎么样把记录集给取出来啊!又怎么样绑定到网格中呢!我用的网格是VB自带的datagrid(oledb) 或许不对.但你不防一试:将联接字符串驱动改成如下:Provider=MSDAORA.1; 或者你可以用一个编辑框来显示记录集,试多种方法可否显示,在属性方面有否漏,是否设错。good luck! 不行!另外,我的Provider已经是MSDAORA.1;!大家再帮忙看一看啊! if recordset.eof then没有记录集!else 有记录集!endif;试试看是否有记录集. 哎呀,终于出来了!终于出来了!谢谢你们啊!plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"With cpwx Set .ActiveConnection = Cn .CommandText = plsql .CommandType = adCmdText .Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)End With'改这句Set Rs.Source = cpwx.Execute为Set Rs = cpwx.Execute'正确的和错误的,就在一线之间!!!Set DataGrid1.DataSource = Rs DataGrid1.Refresh sorry,没有注意到你的那句解决一:Set Rs = cpwx.Execute解决二:Set Rs.Source = cpwxrs.open() 【求助】PL/SQL 出现无效标识符 Drop的视图,如何恢复啊? 求Oracle application server 的配置文档!!—— formsweb.cfg!!!! oracle用户与权限的问题 高分求最简单问题: Oracle的配置,在线等待 sqlldr求救 控制面板 中的“服务”里的 oracle服务不能自动启动!!! 大家帮帮忙。 使用PROC预编译sample1的代码为什么始终提示编译错误? 在Oracle中如何读外部文本 这个表是做什么用(菜鸟问题)?
Set .ActiveConnection = Cn
.CommandText = "{call packperson.GETperson(?,{resultset 0, fname})}"
.CommandType = adCmdText 'adCmdText
Set Pram = .CreateParameter("varssn", adInteger, adParamInput, ,666223333)
.Parameters.Append Pram
end with
.CommandText = "{call packperson.GETperson(?)}"
2、command的写法不对,而且少了一个参数设定,应该改成如下:
plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"
With cpwx
Set .ActiveConnection = Cn
.CommandText = plsql
.CommandType = adCmdText
.Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)
End With
Set Rs.Source = cpwx.Executevarssn这个参数在包中并没有发挥作用,但是在调用的时候不能省略。以上代码在vb6/ado2.5下测试通过。
如果不能绑定,那怎么把取回的数据写到网格之类的控件中呢?如果一行行的写岂不是效率太低!
送佛送到西天,帮我帮到底吧!:)
以下是我的command1_Click代码:
---------------------------------
On Error GoTo xxxx
Dim cpwx As New ADODB.Command
Dim Rs As New ADODB.Recordset
plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"
With cpwx
Set .ActiveConnection = Cn
.CommandText = plsql
.CommandType = adCmdText
.Parameters.Append .CreateParameter("666223333", adNumeric, adParamInput, 9, 1)
End With
Set Rs.Source = cpwx.Execute
MsgBox (Rs.Fields.Count) '这里显示为1
MsgBox (Rs.Fields("fname").Value) --这句话错误,显示为对象关闭时不能打开
Set DataGrid1.DataSource = Rs.Fields("fname") '这句话更不行了!:)
Set DataGrid1.DataSource = Rs '这句话也不行
DataGrid1.Refresh
Exit Sub
xxxx:
msgbox(error)
-----------------------------------------------
'唉,到底怎么样把记录集给取出来啊!又怎么样绑定到网格中呢!我用的网格是VB自带的datagrid(oledb)
还有,虽然按照弱水兄的提示,没有出错,但我还是搞不清那个什么
"{call packperson.GETperson(?, {resultset 1000, fname})}"
这个字符串为什么要这样写,猜了一下,是不是这样的原理;
{call <包名>.<过程名>(<?这个是干什么的啊>,{resultset <返回的记录行最大数>,<记录集名>})}请各位也帮着看一看这样理解对吗?
如果不对,那该怎么理解呢?深深的期待中...............
createparameter(name,direction,type,size,value)把它改成以下
Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9,666223333)问题二
"{call packperson.GETperson(?, {resultset 1000, fname})}"
?是用在前端输入的参数而已,相当于oracle存储过程中的in
procedure getperson(varssn int,fname out Tfname);varssn默认为in
With cpwx
Set .ActiveConnection = Cn
.CommandText = plsql
.CommandType = adCmdText
.Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)
End With
Set Rs.Source = cpwx.Execute
MsgBox (Rs.Fields.Count) '这里显示为1
'下面这句话没出错,但在网格里,看不到任何东????????????
Set DataGrid1.DataSource = Rs
DataGrid1.Refresh'唉,到底怎么样把记录集给取出来啊!又怎么样绑定到网格中呢!我用的网格是VB自带的datagrid(oledb)
将联接字符串驱动改成如下:Provider=MSDAORA.1;
good luck!
另外,我的Provider已经是MSDAORA.1;
!大家再帮忙看一看啊!
没有记录集!
else
有记录集!
endif;
试试看是否有记录集.
终于出来了!谢谢你们啊!
plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"
With cpwx
Set .ActiveConnection = Cn
.CommandText = plsql
.CommandType = adCmdText
.Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)
End With
'改这句Set Rs.Source = cpwx.Execute为
Set Rs = cpwx.Execute
'正确的和错误的,就在一线之间!!!
Set DataGrid1.DataSource = Rs
DataGrid1.Refresh
解决一:
Set Rs = cpwx.Execute
解决二:
Set Rs.Source = cpwx
rs.open()