51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2153|回复: 9
打印 上一主题 下一主题

[原创] 请大家帮忙调段代码。先谢。

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2011-8-11 16:40:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jandz0413 于 2011-8-11 17:05 编辑

我是想把数据库连接的代码弄成function公用。需要取数据的时候,创建一个dictionary对象(对象值是字段名)传给这个Function,由其取值并替换对象的值后再传回来。
这样做是为了应对不同的地方,所需的字段数量不同的情况,需要几个字段我就给字典对象add几条key/value就行。
以上是需求。而问题是对象去function里转了一圈出来,值没变。
我觉得问题可能是我在For Each循环里给赋值的方法不对。
请大家帮忙改改。谢谢。

  1. 'Option Explicit
  2. Dim sql
  3. sql="SELECT AccQty,AvaQty FROM ProQty WHERE ProNo= 26103"
  4. Dim oDic
  5. Set oDic = CreateObject("scripting.dictionary")
  6. oDic.Add "1","AccQty"
  7. oDic.Add "2","AvaQty"
  8. Set temp=Adodb(sql,oDic)
  9. MsgBox temp.Item("1")'--按说值应该已经变了,但是这里看仍然是oDic.Add进去的值


  10. Function Adodb(sql,oDic)
  11. Dim res,cmd
  12. Dim objCount
  13. Set Res=Createobject("adodb.recordset")
  14. Set Cmd=Createobject("adodb.command")
  15. Cmd.activeconnection="Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=PPC;Data Source=192.168.168.168"
  16. Cmd.CommandType = 1
  17. cmd.CommandText = sql
  18. Set res = Cmd.Execute()

  19. For Each Item In oDic.Items
  20.     Item = res(Item).value
  21.     MsgBox Item'--这里看值是正确的,已经取到需要的数据了。
  22. Next  

  23. res.movenext  
  24. Set res = nothing
  25. Set cmd.ActiveConnection = nothing
  26. Set Cmd= Nothing

  27. Set Adodb=oDic'--把对象作为返回值

  28. End Function
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2011-8-11 17:51:43 | 只看该作者
说下个人的看法
我只看到你创建了两个Key好像
那么你的这个枚举不就是死的吗
Set Adodb=oDic
oDic是一个字典对象,倒不如把Odic.Items传给一个动态数组,再把动态数组的值一个一个传给你的字典,不就好了
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2011-8-11 17:55:12 | 只看该作者
恩,最终还是调出来了。和我预感一样,for each写的有问题,对这个语法不太熟悉啊。
改成这样就对了。
  1. For Each key In oDic
  2. oDic.Item(key) = res(oDic.Item(key)).value
  3. Next
复制代码

也感谢楼上兄弟的意见。
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2011-8-11 17:58:02 | 只看该作者
你之前的是直接传值,后面加上了Key对象来做遍历,应该是这样的意思吧
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2011-8-11 18:04:49 | 只看该作者
看明白了,之前的字典对象是添加了你的sql语句里的两个查询列做枚举对象。现在明白你的意思了
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2011-8-12 09:15:30 | 只看该作者
恩,是这个意思。其实我觉得之前for each里写的好像也没问题,我仍然不知道为什么就不对。Item赋值也正确,可是func跑一圈出来,字典对象的value还是没变。
第一次用value遍历,第二次用key遍历,为什么第二次就行。
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2011-8-12 15:42:13 | 只看该作者
嘿嘿,我刚写了个脚本,是连到数据库把sql查询的结果存到一张excel里做存储的功能,你想要的话我可以发给你,我觉得用字典太麻烦了点啦。。
唉我最怕看别人的代码。。因为不同的人Coding的风格不同,得花不少功夫去理解。。
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2011-8-12 17:25:29 | 只看该作者
# For Each Item In oDic.Items
#     Item = res(Item).value
#     MsgBox Item'--这里看值是正确的,已经取到需要的数据了。
# Next  

这里的Item是function里的局部变量
For Each Item In oDic.Items, 字典里的值,传给Item这个变量.

而oDic.Item(key) = res(oDic.Item(key)).value, 是直接在字典里写值
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2011-8-15 13:55:51 | 只看该作者
回复 8# ermine
版主解释的很清楚明白。说到底是对for each不太懂,把局部变量当作是字典元素在用。学到东西了。
非常感谢!
回复 支持 反对

使用道具 举报

该用户从未签到

10#
 楼主| 发表于 2011-8-15 13:57:40 | 只看该作者
回复 7# 阳光下的橙子
恩,看代码确实是件纠结的事情。
橙子你可以把你写的代码作为一种更好的思路贴在下面么,这样这个帖子就完整了,有帮助意义
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2024-11-27 09:36 , Processed in 0.077091 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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