469,343 Members | 5,388 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,343 developers. It's quick & easy.

Dictionary Object

Wondering if someone can give me a hand with something that I'm sure is
really easy - but damned if I know what I'm doing wrong. I'm trying to read
the contents of a database into an ASP dictionary object. However I'm
getting the error

Microsoft VBScript runtime error '800a01c9'
This key is already associated with an element of this collection
/test.asp, line 21

There's definately no repeated data in either column, it's currently only
test data, one column is 1,2,3,4 etc the other is a,b,c,d. I can confirm
it's reading the data properly if I use response.write instead of d.add
The code I'm using is this:

Set rsCount = Server.CreateObject ("ADODB.Recordset")
sqlView = "select data,number from tblTemp"
Set d=Server.CreateObject("Scripting.Dictionary")

rsCount.Open sqlView, "dsn=dsn_hits_2"
do while not rsCount.eof
d.add rsCount("number"),rsCount("data")
rsCount.MoveNext
loop
rsCount.close

Set rsCount = Nothing


Many thanks in advance.
Jul 19 '05 #1
6 5939
When you add an item to the dictionary object, the key must be unique. The
key is the first argument in the add method, which in this case, is
rsCount("number"). What that error means is that it's hitting a record that
has rsCount("number") with the same value as another record that has already
been inserted into the dictionary object. i.e.
number data
1 Joe
2 Kelly
3 Frank
2 Jorg

When it gets to the Jorg record and tries to use 2 as the key, that'll throw
an error since the Kelly item in the dictionary object already has a key of
2.

Possible Solutions:

Use an array instead of a dictionary object.

Use the primary key in your recordset if the key doesn't matter.

Use a counter for the key and increase it by one in your loop if the key
doesn't matter.

Probably some other things.

Ray at work
"Johnny Klunk" <johnnyklunk@:rem0ve-this:johnnyklunk.com> wrote in message
news:be**********@sparta.btinternet.com...
Wondering if someone can give me a hand with something that I'm sure is
really easy - but damned if I know what I'm doing wrong. I'm trying to read the contents of a database into an ASP dictionary object. However I'm
getting the error

Microsoft VBScript runtime error '800a01c9'
This key is already associated with an element of this collection
/test.asp, line 21

There's definately no repeated data in either column, it's currently only
test data, one column is 1,2,3,4 etc the other is a,b,c,d. I can confirm
it's reading the data properly if I use response.write instead of d.add
The code I'm using is this:

Set rsCount = Server.CreateObject ("ADODB.Recordset")
sqlView = "select data,number from tblTemp"
Set d=Server.CreateObject("Scripting.Dictionary")

rsCount.Open sqlView, "dsn=dsn_hits_2"
do while not rsCount.eof
d.add rsCount("number"),rsCount("data")
rsCount.MoveNext
loop
rsCount.close

Set rsCount = Nothing


Many thanks in advance.

Jul 19 '05 #2

"Ray at <%=sLocation%>" <as*@me.forit> wrote in message
news:O3**************@TK2MSFTNGP12.phx.gbl...
When you add an item to the dictionary object, the key must be unique. The key is the first argument in the add method, which in this case, is
rsCount("number"). What that error means is that it's hitting a record that has rsCount("number") with the same value as another record that has already been inserted into the dictionary object. i.e.

Hi,
Thanks for the response. The thing is, the data is definately not repeated.
I entered the data manually to test and make there's no error. It's just
1,2,3,4 etc..
That's a good idea with the primary key. I've just tested again, setting
each of my columns as the primary key to ensure the database has no repeated
entries. I'm still getting the same thing. It's driving me nuts!
Jul 19 '05 #3
Try this then and look:

rsCount.Open sqlView, "dsn=dsn_hits_2"
do while not rsCount.eof
response.write rsCount("number") & "," & rsCount("data") &
"<br />"
rsCount.MoveNext
loop
rsCount.close

Ray at work
"Johnny Klunk" <johnnyklunk@:rem0ve-this:johnnyklunk.com> wrote in message
news:be**********@hercules.btinternet.com...

"Ray at <%=sLocation%>" <as*@me.forit> wrote in message
news:O3**************@TK2MSFTNGP12.phx.gbl...
When you add an item to the dictionary object, the key must be unique. The
key is the first argument in the add method, which in this case, is
rsCount("number"). What that error means is that it's hitting a record

that
has rsCount("number") with the same value as another record that has

already
been inserted into the dictionary object. i.e.

Hi,
Thanks for the response. The thing is, the data is definately not

repeated. I entered the data manually to test and make there's no error. It's just
1,2,3,4 etc..
That's a good idea with the primary key. I've just tested again, setting
each of my columns as the primary key to ensure the database has no repeated entries. I'm still getting the same thing. It's driving me nuts!

Jul 19 '05 #4

"Ray at <%=sLocation%>" <as*@me.forit> wrote in message
news:e7**************@TK2MSFTNGP12.phx.gbl...
Try this then and look:

rsCount.Open sqlView, "dsn=dsn_hits_2"
do while not rsCount.eof
response.write rsCount("number") & "," & rsCount("data") &
"<br />"
rsCount.MoveNext
loop
rsCount.close

Ray at work


Ray,
Thanks again for the quick response :) I've actually tried that idea - but
to be sure, to be sure I pasted your code in to make sure the results
matched. I've copy-pasted the output from test.asp below. You can see why
this is driving me nuts ! As far as I see, every row has different data in
each column.

a,1
b,2
c,3
d,4
e,5
f,6
g,7


Jul 19 '05 #5
"Johnny Klunk" <johnnyklunk@:rem0ve-this:johnnyklunk.com> wrote in
message news:be**********@sparta.btinternet.com...
d.add rsCount("number"),rsCount("data")


Try:
d.add rsCount.Fields.Item("number").Value,
rsCount.Fields.Item("data").Value

Also you can take advantage of the fact that the dictionary object will
create/overwrite a key based on whether it exists or not:
d(rsCount.Fields.Item("number").Value) =
rsCount.Fields.Item("data").Value

However this method wreaks of "programming by side effect" so if the
first method work, use that.

HTH
-Chris
Jul 19 '05 #6
"Johnny Klunk" <johnnyklunk@:rem0ve-this:johnnyklunk.com> wrote in
message news:be**********@sparta.btinternet.com...
d.add rsCount.Fields.Item("number").Value, rsCount.Fields.Item("data").Value

Yep, thats worked. Superb, thanks so much. No idea why my bit of

code didn't work, but I'm glad for a solution.

Cheers

You code was attempting to set the dictionary key to a field Object, not
it's value. Whenever possible, try to explicitly reference values. When
you reference the value of a field object implicitly (i.e.
rsCount("number") you're asking the parser to do the following:

1. Determine the default property/method for the rsCount object, the
Fields collection
2. Determine the default property/method for the Fields collection, the
Item method
3. Determine the default property/method for the Item object, the Value
property
4. Determine if the Value property is an object
5. If it is an object do the whole object model default method/property
traversal thing again.
6. If not, return the Value

All of these steps are also dependent on the context in which they are
called. So sometimes the default thing happens, sometime it doesn't.
There are also a lot more going on before, between and after each of
these steps, but you get the idea. Always better to explicitly identify
the "value" you want.

HTH-
Chris

Jul 19 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by none | last post: by
2 posts views Thread by jg | last post: by
1 post views Thread by john wright | last post: by
4 posts views Thread by Betina Andersen | last post: by
4 posts views Thread by NullQwerty | last post: by
3 posts views Thread by wildThought | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by zhoujie | last post: by
1 post views Thread by Marylou17 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.