我现在要写一个调用存储过程的共通方法,根据方法传入的参数中取得存储过程名称和参数及值,调用存储过程,存储过程参数类型全用varchar,现在的问题就是不清楚每个存储过程中参数的长度是多少,如果在VBA中调用,应该如何解决?
如:cmd.CreateParameter( param,adVarChar, adParamInput, 20, value) 后面的20是长度,因为每个参数的长度不一定一样,所以不好写个固定值。param和value都是通过方法传进来的
如:cmd.CreateParameter( param,adVarChar, adParamInput, 20, value) 后面的20是长度,因为每个参数的长度不一定一样,所以不好写个固定值。param和value都是通过方法传进来的
解决方案 »
- 怎么在vb的datagrid控件中添加一个新行呀??在线等
- vb如何将txt文件读入text控件
- 能否通过VB修改 控制面版里的区域和语言选项
- 求:WINSOCK通信的一个例子
- 使用adodc控件如何访问远程SQL Server数据库?(在线等)
- 访问SQL数据库语句是 "Provider=SQLOLEDB.1;Password=。。。请问,访问access应为什么?
- 打包时mdac_typ.exe的问题,详情请进
- 还是Treeview的问题,再次请教大家。SOS!!!
- 怎样用 vbs 获得 windows 的特殊文件夹
- 如果用pictbox作打印预览。应该怎么做呢?
- 有一种空格,怎么也去不掉,Trim 和 Replace 都联合夹攻了
- 谁有wavecom短信猫的组件,发一个给我?
A:表示是第几个参数,或者参数名称;
B:表示参数类型,类型值参见ADODB.DataTypeEnum;
C:表示长度
D:参数值这样可以在过程中拆分这个名称得到相应的值,下面是个示例:'模块中:Public Msg as string
'通用的参数化查询函数
Public Function ParamQueryDB( _
rs As ADODB.Recordset, parStr As String, parValue() As String _
) As Long
'--------------------------------------------------------------------------
'rs: 返回的记录集
'parStr: sql语句或者存储过程名称(本例只讨论SQL语句)
'parValue(): 参数属性数组,结构:参数名称_类型_长度_值
'--------------------------------------------------------------------------On Error GoTo Err_ParQuery Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim par As ADODB.Parameter
Dim arrPar() As String
Dim i As Long
Msg = ""
If ConnectionDB(cn) = 0 Then '连接数据库函数
ParamQueryDB = -1
Else
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandType = adCmdText '本例只接受SQL参数查询
cmd.CommandText = parStr
For i = 0 To UBound(parValue)
arrPar = Split(parValue(i), "_")
Set par = New ADODB.Parameter
With par
.Name = arrPar(0)
.Type = arrPar(1)
.Direction = 1 '本例只讨论输入参数
.Size = arrPar(2)
.Value = arrPar(3)
End With
cmd.Parameters.Append par
Next
Set rs = cmd.Execute
If rs.EOF Then
ParamQueryDB = 0
Else
ParamQueryDB = rs.RecordCount
End If
End If
Exit_ParQuery:
Set cmd = Nothing
Set cn = Nothing
Exit Function
Err_ParQuery:
Set rs = Nothing
Msg = "< ParamQueryDB > " & Err.Description
ParamQueryDB = -1
Resume Exit_ParQuery
'--------------------------------------------------------------------------
'正常返回 1 或者 rs.RecordCount
'无数据返回 0
'错误返回 -1
'--------------------------------------------------------------------------
End Function'窗体中调用上面过程的测试代码:
Private Sub Command2_Click() Dim rs As ADODB.Recordset
Dim dte As ADODB.DataTypeEnum '类型枚举
Dim sql As String
Dim pValue(1) As String
Dim n As Long
'sql语句
sql = "select * from t_dlt where id like '%'+@1+'%' and f5=@2 "
'构造参数
dte = adVarChar
pValue(0) = "@1_" & dte & "_10_000" '参数名称@1_类型adVarChar_长度10_值000
dte = adInteger
pValue(1) = "@2_" & dte & "_2_30"
'调用通用的参数查询过程
n = ParamQueryDB(rs, sql, pValue)
If n > 0 Then
Debug.Print rs.GetString
ElseIf n = 0 Then
Debug.Print rs.BOF
Else
Debug.Print Msg
End If
Set rs = Nothing
End Sub
这位大哥,多谢了,你的方法过于麻烦,对我来说作用不太大,我已经想到了一个比较简单的方法。上面我也说了,是通过循环来设定参数,但可以确定每个参数都是varchar类型,所以长度就用varchar的最大长度值 8000,这样也不会和存储过程参数定的长度值相矛盾。
这位大哥,多谢了,你的方法过于麻烦,对我来说作用不太大,我已经想到了一个比较简单的方法。上面我也说了,是通过循环来设定参数,但可以确定每个参数都是varchar类型,所以长度就用varchar的最大长度值 8000,这样也不会和存储过程参数定的长度值相矛盾。