51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6120|回复: 7
打印 上一主题 下一主题

[原创] 请教:VBS中将function的返回值(是一个数组),赋给另外一个数组出错

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-2-5 10:50:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了一个数据库校验的function,但是要将返回值(是一个数组)赋给另外一个数组时,报“类型不匹配”。
代码如下,
  1. Dim checkVal(2),dblinename(2),returnValue(1)
  2. Dim sqlw
  3. checkVal(0)="客户名称1"
  4. checkVal(1)="2"
  5. checkVal(2)="00071"
  6. dblinename(0)="s_name"
  7. dblinename(1)="n_grade"
  8. dblinename(2)="s_gradecode"
  9. sqlw="select * from tableName where n_rdstatus=1 and s_code ='01-6001'"
  10. 'msgbox(VarType(DBCheck(sqlw,checkVal,dblinename,3)))
  11. [u][b]returnValue=DBCheck(sqlw,checkVal,dblinename,3)[/b]  '执行到此句时报“类型不匹配”[/u]
  12. 'msgbox(VarType(returnValue))
  13. reporter.ReportEvent returnValue(0),"校验数据库的值",returnValue(1)


  14. Function DBCheck( sql,checkValue(),LineName(),n )
  15.    Dim j,errorMsg,returnVal(1),str
  16.    j=0
  17.    errorMsg=""
  18.    
  19. set con=createobject("adodb.connection")
  20. 'Orocle方式:
  21. con.open "DRIVER={Microsoft ODBC for Oracle};SERVER=“your server name”;UID=protest;PWD=protest;"
  22. 'msgbox("连接数据库成功")
  23. set rs=createobject("adodb.recordset")
  24. 'sql="select * from bs_clientsetting where s_code ='"&datatable("clientCode",dtLocalSheet)&"' and n_rdstatus=1"
  25. 'msgbox(sql)
  26. rs.open sql,con
  27. If rs.eof Then
  28.      j=1
  29.      errorMsg="查询无结果!"
  30. else
  31.      While  (not rs.eof)
  32.         For  i=0 to  n-1
  33.            str=CStr(rs.Fields(LineName(i)).value)
  34.            If str<>checkValue(i) then
  35.            j=j+1
  36.            errorMsg=errorMsg&" 列"&LineName(i)&"的值为"&str&",不等于预计值:"&checkValue(i)
  37.            end if
  38.          Next
  39.         rs.movenext
  40.      Wend
  41. End If
  42. If j=0 Then
  43.         returnVal(0)=0
  44.         returnVal(1)="数据校验正确!"
  45.         elseif j>0 then
  46.         returnVal(0)=1
  47.         returnVal(1)=errorMsg
  48.         else
  49.         returnVal(0)=3
  50.         returnVal(1)="数据库校验程序发生异常"
  51. End If
  52. DBCheck=returnVal
  53. msgbox(VarType(returnVal))
  54. msgBox(VarType(DBCheck))
  55. rs.close
  56. set rs=nothing
  57. con.close
  58. set con=nothing
  59. end function
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2006-2-5 16:26:48 | 只看该作者
把dim returnValue(1),改为dim returnValue;
那么returnValue(0)=returnVal(0)
或者
把returnValue=DBCheck(sqlw,checkVal,dblinename,3)改为returnValue(1)=...
那么returnValue(1)(0)=returnVal(0)
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2006-2-5 16:59:29 | 只看该作者

多谢kai_top的帮助!

我想了很久,觉得把错误信息反馈到Action中再处理,其实是比较麻烦。所以我改了一下,用Sub过程,直接在此过程中将错误信息打印出来。这样做数据库的校验的时候,直接call这个方法就可以了,不用再对返回值做处理。不过还是要多谢kai_top的帮助。
修改后的代码是这样的:

  1. Sub DBCheck( sql,expectedValue(),LineName(),n )
  2.    '传入参数说明:sql              查询的sql语句,
  3.    '              expectedValue()  数据库校验的预计值
  4.    '              LineName()       数据库表中的列名
  5.    '              n                数组的长度,或者是想要对比的数据的个数
  6.   Dim j,str     'j是一个标识,表示校验数据库是否成功
  7.   j=0
  8.   
  9.   Set con=createobject("adodb.connection")
  10.   'con.open "Description=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_"PWD=123456;APP=Quick Test Pro;WSID=IBM;DATABASE=IBM_table"
  11.   'access方式:con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\test.mdb"
  12.   'Oracle方式:
  13.   con.open "DRIVER={Microsoft ODBC for Oracle};SERVER="your server name";UID=protest;PWD=protest;"
  14.   set rs=createobject("adodb.recordset")
  15.   rs.open sql,con

  16.   If rs.eof Then
  17.      j=1
  18.      reporter.ReportEvent 1,"校验数据库的值","查询无结果!"
  19.   Else
  20.          While  (not rs.eof)
  21.          For  i=0 to  n-1
  22.             str=CStr(rs.Fields(LineName(i)).value)
  23.                          If str<>expectedValue(i) then
  24.                 j=j+1
  25.                              reporter.ReportEvent 1,"校验数据库的值"," 列"&LineName(i)&"的值为:"&str&",不等于预计值:"&checkValue(i)
  26.              End If
  27.           Next
  28.           rs.movenext
  29.          Wend
  30.    End If

  31.    If j=0 Then
  32.     reporter.ReportEvent 0,"校验数据库的值","数据校验正确!"
  33.    End If

  34.    rs.close
  35.    set rs=nothing
  36.    con.close
  37.    set con=nothing
  38. End Sub
复制代码


将上述的代码做成一个vbs文件,添加到资源文件中去
使用的时候就可以直接调用了

  1. call check()

  2. Sub check()
  3.   Dim expectedVal(2),dblinename(2),sqlw
  4.   expectedVal(0)=datatable("clientName",dtLocalSheet)
  5.   expectedVal(1)=datatable("grade",dtLocalSheet)
  6.   expectedVal(2)=datatable("gradecode",dtLocalSheet)
  7.   dblinename(0)="s_name"
  8.   dblinename(1)="n_grade"
  9.   dblinename(2)="s_gradecode"
  10.   sqlw="select * from bs_clientsetting where n_rdstatus=1 and s_code ='"&datatable("clientCode",dtLocalSheet)&"'"
  11.   call DBCheck(sqlw,expectedVal,dblinename,3)   
  12. End Sub
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2006-2-6 21:05:58 | 只看该作者
我不太明白datatable的含义,能否指点一下?它是一个函数吗?我怎么在VB中找不到!
谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2006-2-8 11:36:41 | 只看该作者

为什么不用数据库检查点?

完全可以用数据库检查点测试的?迷茫中
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2006-2-14 11:41:50 | 只看该作者

dataTable

dataTable就是QTP中左下方的Excel表格。
dataTable有两种,一个是全局的,是Excel的第一个Sheet;另一个是局部的,是第二个及以后的Sheet
局部的datatable在Action中使用时,可以直接用dtLocalSheet来引用
要使用dataTable,查看help-quickTest Help,直接搜索dataTable就可以查看自带的帮助
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2006-2-14 16:16:56 | 只看该作者

不用QTP自带的数据库校验点的功能的理由

1.能够自己写脚本来检查数据库,这样灵活性比较高
2.手工编写脚本,没有Active Screen,不能用校验点来校验页面和数据库的值
3.不太会用QTP的数据库检查点的功能......
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2006-4-23 15:35:34 | 只看该作者
mstiunicon
我崇拜你
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-26 02:26 , Processed in 0.069179 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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