加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp-classic – 将断开连接的记录集插入字典对象?

发布时间:2020-12-16 09:55:19 所属栏目:asp.Net 来源:网络整理
导读:只是想知道是否有人看到过这个问题,当试图将断开连接的记录集中的项目插入到经典的ASP字典对象中时,我得到错误“此密钥已经与此集合的元素相关联”. 事实并非如此,所有关键元素都是独一无二的,是的,我三重检查数据:) 如果我将数据推送到局部变量,它工作正常(
只是想知道是否有人看到过这个问题,当试图将断开连接的记录集中的项目插入到经典的ASP字典对象中时,我得到错误“此密钥已经与此集合的元素相关联”.

事实并非如此,所有关键元素都是独一无二的,是的,我三重检查数据:)

如果我将数据推送到局部变量,它工作正常(见下面的代码).虽然我没关系,但还有其他人看过这个问题,或者知道为什么它不起作用?

Set Options=Server.CreateObject("Scripting.Dictionary")

function Populate(ID) ' WORKS
    Dim strsql,rs,name,id
    if Options.Count = 0 then
        strsql = "select name,ID from options where unique = " & SafeSQL(ID)
        Set rs = RunSQLReturnRS(strsql,null,"Populate") ' returns a disconnected recordset
        do while not rs.eof
            name = rs("name")
            id = rs("id")
            Options.Add name,id
            rs.movenext
        loop
        rs.close
    end if
end function

function Populate2(ID) ' DOES NOT WORK
    Dim strsql,rs
    if Options.Count = 0 then
        strsql = "select name,"Populate") ' returns a disconnected recordset
        do while not rs.eof
            Options.Add rs("name"),rs("id")
            rs.movenext
        loop
        rs.close
    end if
end function

根据用户Shadow Wizard的请求,断开连接的记录功能,(注意my_conn是数据库连接,并且在调用此函数时已经打开)

Function RunSQLReturnRS(sqlstmt,params(),fromfunction)
    ''//Create the ADO objects
    Dim rs,cmd

    Set rs = server.createobject("ADODB.Recordset")
    If Not zerolength(sqlstmt) then
      Set cmd = server.createobject("ADODB.Command")

      ''//Init the ADO objects  & the stored proc parameters
      cmd.ActiveConnection = my_conn
      cmd.CommandText = sqlstmt
      cmd.CommandType = adCmdText
      cmd.CommandTimeout = 900

      ''// propietary function that put params in the cmd
      collectParams cmd,params

      ''//Execute the query for readonly
      rs.CursorLocation = adUseClient
      On Error Resume Next
        rs.Open cmd,adOpenForwardOnly,adLockReadOnly
        If Err.Number <> 0 Then Response.write "Error: "&Err.Description & "<br>fromfunction=" & fromfunction & "<br>" : Response.end
      On Error Goto 0
      ''// Disconnect the recordset
      Set cmd.ActiveConnection = Nothing
      Set cmd = Nothing
      Set rs.ActiveConnection = Nothing
    End if
    ''// Return the resultant recordset
    Set RunSQLReturnRS = rs
  End Function

解决方法

好吧,这有点棘手但我知道发生了什么.

VBScript Dictionary对象的Add()方法接受键和值参数的Object.该对象可以是任何类型:数字,字符串,日期,复杂类型等.

不常见的是当你写rs(“name”),其中“rs”是Recordset类型时,它不返回基本类型,而是返回一个Field对象.

但是,如果您尝试将其分配给局部变量,则VBScript足够智能以查找该对象的默认属性,如果存在,则执行它. Field对象确实有这样的属性,它返回字段的Value.

当你有这个:

name = rs("name")

它实际上意味着:

name = rs("name").Value

所以在你的第一个方法中,你给一个字符串作为键,一切都很好.在第二种方法中,您传递Field对象本身,并且VBScript在Field对象之间缺少适当的比较机制,因此它认为它们都是相同的.

要使第二个方法在不使用局部变量的情况下工作,请将其更改为:

do while not rs.eof
    Options.Add rs("name").Value,rs("id").Value
    rs.movenext
loop

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读