jandz0413 发表于 2011-8-11 16:40:56

请大家帮忙调段代码。先谢。

本帖最后由 jandz0413 于 2011-8-11 17:05 编辑

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

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


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

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

res.movenext
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= Nothing

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

End Function

阳光下的橙子 发表于 2011-8-11 17:51:43

说下个人的看法
我只看到你创建了两个Key好像
那么你的这个枚举不就是死的吗
Set Adodb=oDic
oDic是一个字典对象,倒不如把Odic.Items传给一个动态数组,再把动态数组的值一个一个传给你的字典,不就好了

jandz0413 发表于 2011-8-11 17:55:12

恩,最终还是调出来了。和我预感一样,for each写的有问题,对这个语法不太熟悉啊。
改成这样就对了。
For Each key In oDic
oDic.Item(key) = res(oDic.Item(key)).value
Next
也感谢楼上兄弟的意见。

阳光下的橙子 发表于 2011-8-11 17:58:02

你之前的是直接传值,后面加上了Key对象来做遍历,应该是这样的意思吧

阳光下的橙子 发表于 2011-8-11 18:04:49

看明白了,之前的字典对象是添加了你的sql语句里的两个查询列做枚举对象。现在明白你的意思了

jandz0413 发表于 2011-8-12 09:15:30

恩,是这个意思。其实我觉得之前for each里写的好像也没问题,我仍然不知道为什么就不对。Item赋值也正确,可是func跑一圈出来,字典对象的value还是没变。
第一次用value遍历,第二次用key遍历,为什么第二次就行。

阳光下的橙子 发表于 2011-8-12 15:42:13

嘿嘿,我刚写了个脚本,是连到数据库把sql查询的结果存到一张excel里做存储的功能,你想要的话我可以发给你,我觉得用字典太麻烦了点啦。。
唉我最怕看别人的代码。。因为不同的人Coding的风格不同,得花不少功夫去理解。。:)

ermine 发表于 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, 是直接在字典里写值

jandz0413 发表于 2011-8-15 13:55:51

回复 8# ermine
版主解释的很清楚明白。说到底是对for each不太懂,把局部变量当作是字典元素在用。学到东西了。
非常感谢!

jandz0413 发表于 2011-8-15 13:57:40

回复 7# 阳光下的橙子
恩,看代码确实是件纠结的事情。
橙子你可以把你写的代码作为一种更好的思路贴在下面么,这样这个帖子就完整了,有帮助意义:)
页: [1]
查看完整版本: 请大家帮忙调段代码。先谢。