注册 登录
编程论坛 VB6论坛

新问题,关于VB中使用通配符传参给存储过程

zhuluoliye 发布于 2013-08-18 18:56, 1663 次点击
刚接触到VB操作SQL存储过程,已经写好了存储过程,测试了没有错误。但是VB代码部分还是不太熟悉,在使用存储过程查询时出现错误,一时找不到错误出处,还请前辈给指点一二,不甚感激。
程序已经打包,麻烦给看一下,谢谢了
只有本站会员才能查看附件,请 登录
13 回复
#2
lowxiong2013-08-19 11:33
没用过存储过程,无法测试(你的mdf我无法导入到我的sql中,弄的总是显示无数据库),就你目前代码来看,似乎是没有定义全程变量(区别全局变量,全程是指某一个类或窗体所有过程、函数可使用的变量)。你在所有代码前加如下语句试下:
Dim qcname As String, qcsex As String, qcrela As String, qcposs As String
#3
zhuluoliye2013-08-20 08:48
回复 2楼 lowxiong
不是全程变量的问题,我已经在form load中写了那几个全程变量,还是要感谢您的解答,谢谢
#4
zhuluoliye2013-08-20 08:58
原先的程序有点问题,我修正了一下,但是之前的问题还是没有解决,希望有高人能帮我解决一下,谢谢了!
只有本站会员才能查看附件,请 登录
#5
Artless2013-08-20 13:16
只有本站会员才能查看附件,请 登录

query_friends
储存过程和问题图片,没sql
#6
zhuluoliye2013-08-21 17:17
回复 5楼 Artless
上面的附件DEMO3已经修改过来了,问题还是依旧
#7
zhuluoliye2013-08-21 19:04
我说明一下这个存储过程的作用

启动form1后DataGrid1从数据表friends中加载全部数据
通过combo1、2、3、4选择需要查询的字段,可以全选,也可以全不选,全不选说明查询所有记录,我所想的是使用通配符%查询所有记录

在选定了查询字段后VB执行SQL中的存储过程query_friends,在DataGrid1显示查询的结果

现在的问题就是点击查询后无法显示结果,存储过程query_friends是没有问题的

请高人解答一下,谢谢了!
#8
lowxiong2013-08-21 23:20
算了,看来,你确实没搞清楚什么是变量定义,你把中断位置处代码用下列代码代替试下看看,要不你把你的存储过程发过来,我在本机调试下就知道。
'这几个代码代替对应的代码应该知道吧,试下
cmd.Parameters("@qcname") = "'" & Trim(Combo1.Text) & "'"
cmd.Parameters("@qcsex") = "'" & Trim(Combo2.Text) & "'"      '构造
cmd.Parameters("@qcrela") = "'" & Trim(Combo3.Text) & "'"
cmd.Parameters("@qcposs") = "'" & Trim(Combo4.Text) & "'"
#9
lowxiong2013-08-21 23:22
form_load只是窗体的一个事件,在它里面定义的变量只在form_load里有效,一碰到end sub指令后,这些变量定义都无效了。
#10
lowxiong2013-08-21 23:47
看到你的存储过程了,按我在8楼说的修改方法修改后,程序测试运行正常,无任何提示,DataGrid1表头都由中文变成了英文,说明存储过程正常调用了。

[ 本帖最后由 lowxiong 于 2013-8-21 23:58 编辑 ]
#11
zhuluoliye2013-08-22 09:10
回复 10楼 lowxiong
我之前也改了一下,也无任何提示错误,DataGrid1字段标题也变成了英文,但是为什么不能显示查询的结果
就像这几个测试的语句,首先将各参数初始化为通配符%,如果查询时选择了combo里面的内容,则查找相应的结果
exec query_friends '%','男','%','%'
exec query_friends '%','%','同事','%'
exec query_friends '%','男','朋友','%'
exec query_friends '%','%','%','%'

我的目的就是将相应的查询结果显示在DataGrid1中
修改后的程序已经上传DEMO4
只有本站会员才能查看附件,请 登录
#12
lowxiong2013-08-22 10:19
我用cmd的模式访问也不成功,等我慢慢找原因。
还是用sql模式访问存储过程吧,这个方式调试成功,代码如下:(全部覆盖Command1_Click即可)
Private Sub Command1_Click()
Dim sql As String
Set rs5 = New ADODB.Recordset
conn.CursorLocation = adUseClient
sql = "query_friends"
sql = sql & "'%" & Trim(Combo1.Text) & "%',"
sql = sql & "'%" & Trim(Combo2.Text) & "%',"      '构造
sql = sql & "'%" & Trim(Combo3.Text) & "%',"
sql = sql & "'%" & Trim(Combo4.Text) & "%'"
Set rs5 = conn.Execute(sql)
Set DataGrid1.DataSource = rs5
End Sub
#13
lowxiong2013-08-22 11:13
已找到原因,不需要单引号。
估计是存储过程里已经标注参数类型,因此在传递参数时就不需要单引号区别参数类型了,代码修改如下:
Private Sub Command1_Click()
Dim cmd As New Command
Set rs5 = New ADODB.Recordset
cmd.ActiveConnection = conn
conn.CursorLocation = adUseClient
= adCmdStoredProc
= "query_friends"
cmd.Parameters("@qcname") = "%" & Trim(Combo1.Text) & "%"
cmd.Parameters("@qcsex") = "男"                  '男为默认性别
If Trim(Combo2.Text) <> "" Then cmd.Parameters("@qcsex") = Trim(Combo2.Text)    '构造
cmd.Parameters("@qcrela") = "%" & Trim(Combo3.Text) & "%"
cmd.Parameters("@qcposs") = "%" & Trim(Combo4.Text) & "%"
Set rs5 = cmd.Execute
Set DataGrid1.DataSource = rs5
Set cmd = Nothing
Set rs5 = Nothing
End Sub

#14
zhuluoliye2013-08-22 12:35
回复 13楼 lowxiong
大师果然奏效,不过还是有点瑕疵,就是默认了性别是男,我改了一下,正好符合我的要求,已经没有问题
Private Sub Command1_Click()
Dim cmd As New Command
Set rs5 = New ADODB.Recordset
cmd.ActiveConnection = conn
conn.CursorLocation = adUseClient
= adCmdStoredProc
= "query_friends"
cmd.Parameters("@qcname") = "%" & Trim(Combo1.Text) & "%"
cmd.Parameters("@qcsex") = "%"
If Trim(Combo2.Text) <> "" Then cmd.Parameters("@qcsex") = Trim(Combo2.Text)
cmd.Parameters("@qcrela") = "%" & Trim(Combo3.Text) & "%"
cmd.Parameters("@qcposs") = "%" & Trim(Combo4.Text) & "%"
Set rs5 = cmd.Execute
Set DataGrid1.DataSource = rs5
Set cmd = Nothing
Set rs5 = Nothing
End Sub



我在form_load里加了combo的第一个值都为空,这样如果不选任何一个combo,查询的就是全部结果


感谢您耐心的解答,严重感谢了!!!
1