2011-07-19 4 views
1

が、私は単にVBScriptの辞書には、私のクエリがあると、既存のキーエラー

dim viewableProductIDs : set viewableProductIDs = CreateObject("Scripting.Dictionary") 
    do while not rsEntry.EOF 
     viewableProductIDs.Add rsEntry("ProductID"), true 
     rsEntry.MoveNext 
    loop 

rsEntryがADODBレコードセットですproductIDsの辞書を構築しようとしていると私は徹底的debbug印刷により、必ず行っている生産ループに追加します実際には一意のproductIDが返され、レコードセットには重複がありません。しかし、何とか、vbscriptは重複があると考えることを主張している。それは最初の1つの罰金を追加しますが、それ以降はすべての残りの部分でエラーになります。私はそれを既存の鍵のチェックで囲んでみたが、someohowはそれらすべてを考えたが、最初のものは存在した。そして最後に、その中に1つのエントリしかない辞書が残っています。

これを行う理由は誰にも分かりますか? .Valueを追加

+0

'SELECT DISTINCT ProductId FROM YourTable'を実行し、その結果をrsEntry変数に入れてコードを再実行するようにしてください。 –

答えて

5

試してみてください。

viewableProductIDs.Add rsEntry("ProductID").Value, true 

説明:

VBScriptのは、 "デフォルト" のプロパティと呼ばれる概念があります。例えば、ライン

someString = rsEntry("ProductID") 

は本当にFieldsItem、およびValueは、それぞれのオブジェクトのすべてのデフォルトプロパティです

someString = rsEntry.Fields.Item("ProductID").Value 

の省略形です。ここでの主な問題は、チェーンの最後のステップです。rsEntry("ProductID")rsEntry("ProductID").Valueの違いです。上記の例では、キーワードSetを使用しなかったため、オブジェクト参照は割り当ての右側では不正です。 rsEntry("ProductID")はオブジェクト参照Fieldと評価されるため、次の手順を実行し、Fieldオブジェクトのデフォルトプロパティ、Valueを展開します。私は

Set someObj = rsEntry("ProductID") 

を行っていた場合はインタプリタはFieldオブジェクト参照にsomeObjを設定しているだろう。

ここで楽しい部分があります:Dictionaryオブジェクトは、キーとして任意のタイプの値を使用できます。文字列や数値などの単純な値を使用する方が一般的ですが、配列やオブジェクト参照を使用することは完全に正当です。オブジェクト参照がDictionary.Addメソッドの最初の引数に対して合法であるため、インタプリタはデフォルトのプロパティを拡張することを煩わしくなく、単にオブジェクト参照をFieldキーとして使用します。 Fieldオブジェクト参照はレコードごとに変更されないので、同じキーを何度も何度も追加しようとします。 .Valueを追加すると、インタプリタに、オブジェクトではなく値が必要であることが明示的に示されます。

+0

ああ、私はこれが起こっていなければならない何かを知っていた。ありがとう、これは間違いなく問題を解決しました。 – Acquire

関連する問題