asp-classic – 将断开连接的记录集插入字典对象?
只是想知道是否有人看到过这个问题,当试图将断开连接的记录集中的项目插入到经典的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET中下载文件的几种实例代码
- asp.net-mvc – 应用偏移量时表示的UTC时间必须介于0到10,0
- asp.net cookie,身份验证和会话超时
- 腾讯云-Linux-docker容器中安装vim 、telnet、ifconfig, pi
- asp.net – 如何在WebGrid中的列标题使用DisplayName数据注
- asp.net-mvc-3 – Mvc 3图像上传库
- jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
- asp.net-mvc – 在IISExpress上通过计算机名访问ASP.net we
- ASP.NET图表
- asp.net-mvc – 如何在HTML属性中添加剃刀值和字符串?