51Testing软件测试论坛

标题: 请大家帮忙调段代码。先谢。 [打印本页]

作者: jandz0413    时间: 2011-8-11 16:40
标题: 请大家帮忙调段代码。先谢。
本帖最后由 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
复制代码

作者: 阳光下的橙子    时间: 2011-8-11 17:51
说下个人的看法
我只看到你创建了两个Key好像
那么你的这个枚举不就是死的吗
Set Adodb=oDic
oDic是一个字典对象,倒不如把Odic.Items传给一个动态数组,再把动态数组的值一个一个传给你的字典,不就好了
作者: jandz0413    时间: 2011-8-11 17:55
恩,最终还是调出来了。和我预感一样,for each写的有问题,对这个语法不太熟悉啊。
改成这样就对了。
  1. For Each key In oDic
  2. oDic.Item(key) = res(oDic.Item(key)).value
  3. Next
复制代码

也感谢楼上兄弟的意见。
作者: 阳光下的橙子    时间: 2011-8-11 17:58
你之前的是直接传值,后面加上了Key对象来做遍历,应该是这样的意思吧
作者: 阳光下的橙子    时间: 2011-8-11 18:04
看明白了,之前的字典对象是添加了你的sql语句里的两个查询列做枚举对象。现在明白你的意思了
作者: jandz0413    时间: 2011-8-12 09:15
恩,是这个意思。其实我觉得之前for each里写的好像也没问题,我仍然不知道为什么就不对。Item赋值也正确,可是func跑一圈出来,字典对象的value还是没变。
第一次用value遍历,第二次用key遍历,为什么第二次就行。
作者: 阳光下的橙子    时间: 2011-8-12 15:42
嘿嘿,我刚写了个脚本,是连到数据库把sql查询的结果存到一张excel里做存储的功能,你想要的话我可以发给你,我觉得用字典太麻烦了点啦。。
唉我最怕看别人的代码。。因为不同的人Coding的风格不同,得花不少功夫去理解。。
作者: ermine    时间: 2011-8-12 17:25
# 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, 是直接在字典里写值
作者: jandz0413    时间: 2011-8-15 13:55
回复 8# ermine
版主解释的很清楚明白。说到底是对for each不太懂,把局部变量当作是字典元素在用。学到东西了。
非常感谢!
作者: jandz0413    时间: 2011-8-15 13:57
回复 7# 阳光下的橙子
恩,看代码确实是件纠结的事情。
橙子你可以把你写的代码作为一种更好的思路贴在下面么,这样这个帖子就完整了,有帮助意义




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2