问题描述
当我尝试使用oracle连接字符串设置Recordset时,我遇到了内存错误。
在“ rsLIS.Open sql,gConnLIS,adOpenStatic,adLockReadOnly ”上
但是有时它会像5-6次尝试一样工作
但是当它起作用时,它将在其他行上给出错误
在行“ 如果rsLink.Fields(2).value = rsLIS.Fields(1).value然后”
这是我尝试过的事情:
- 我尝试不创建记录集,而是尝试创建数组(GetRows)方法。
即使记录集计数为26,但数组的UBound显示为1
- 我尝试将第三个参数值从静态更改为仅正向 在“” rsLIS.Open sql,gConnLIS,adOpenStatic,adLockReadOnly“”
它也不起作用,它显示recordset.count为0
- 重启客户端系统后仍然尝试
我在客户端遇到此错误,因为在我这里我没有调试的开发环境
错误是“内存不足”
Public Function GetResults_New(MachName As String,patid As String,bCheckDate As Boolean,SendAssay As Boolean) As ADODB.Recordset
On Error GoTo errdesc
Call ShowTempMsg("Line 1")
Dim bXVar As Boolean
Dim i,j As Integer
Dim tmplis,tmporder
Dim tmpresult
bXVar = False
Dim rec_result As New ADODB.Recordset
Dim rsLink As New ADODB.Recordset
Dim rsLIS As New ADODB.Recordset
Dim xSampleIdType As String
gAppPath = AddEditinifile("VAHSIF.INI","IF","sLinkPath","")
xSampleIdType = AddEditinifile(gAppPath & "\sLinkConfig.ini",MachName,"SampleIdType","SampleId1",False)
Call Open_Connection
Call Open_Connection_LIS
rec_result.CursorLocation = adUseClient
If SendAssay = True Then
rec_result.Fields.Append "machineparamid",adBSTR,50
rec_result.Fields.Append "Assayno",50
rec_result.Fields.Append "SType",50
rec_result.Fields.Append "Dilution",50
Else
rec_result.Fields.Append "machineparamid",50
End If
rec_result.Open
\
'Link Query For Mapped Params.
sql = "SELECT EquipParamMapping.EquipId,EquipParamMapping.EquipParamCode,EquipParamMapping.LISParamCode,EquipParamMapping.EquipAssayNo from EquipParam,EquipParamMapping where equipParam.equipid = equipparammapping.equipid and equipparam.equipparamcode = equipparammapping.equipparamcode and EquipParam.EquipID = '" & MachName & "' and EquipParam.isProgram = 'Y'"
**rsLink.Open sql,gConn,adOpenStatic,adLockReadOnly**
If enumConnTo = connoracle Then
sql = "select " & xSampleIdType & ",LIS_Param_Code From SL_21CI_View_sampleid_Orders where " & xSampleIdType & " || SuffixCode = '" & patid & "' and isApplicable <> 'N' "
Else
sql = "select " & xSampleIdType & ",LIS_Param_Code From SL_21CI_View_sampleid_Orders where " & xSampleIdType & " + cast(SuffixCode as varchar(20)) = '" & patid & "' and isApplicable <> 'N' "
End If
rsLIS.Open sql,gConnLIS,adLockReadOnly
While Not rsLIS.EOF
If bXVar = True Then
rsLink.MoveFirst
bXVar = False
End If
While Not rsLink.EOF
bXVar = True
**If rsLink.Fields(2).value = rsLIS.Fields(1).value Then**
If SendAssay = True Then
rec_result.AddNew
rec_result("machineparamid") = rsLink.Fields("EquipParamCode")
rec_result("Assayno") = rsLink.Fields("EquipAssayNo")
rec_result("SType") = " "
rec_result("Dilution") = "0"
rec_result.Update
rec_result.MoveFirst
Else
rec_result.AddNew
rec_result("machineparamid") = rsLink.Fields("EquipParamCode")
rec_result("SType") = " "
rec_result("Dilution") = "0"
rec_result.Update
rec_result.MoveFirst
End If
GoTo NextParam
End If
rsLink.MoveNext
Wend
NextParam:
rsLIS.MoveNext
Wend
Set GetResults_New = rec_result
Exit Function
errdesc:
Call InsertIntoLogWithFileName("Transaction.GetResults_New" & vbNewLine & sql & vbNewLine & err.Description & "ErrLine : " & ErrLine)
End Function
谢谢
解决方法
这仍然使问题出现在哪一行。另外:“它也没有用,它显示recordset.count为0”。 RecordSet.Count属性取决于提供程序。使用与此类似的函数:
Public Function RecordCount(ByVal cn As ADODB.Connection,ByVal sTable As String) As Long
Dim sSQL As String,lRetVal as Long
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
sSQL = "SELECT COUNT(1) AS RecCount FROM " & sTable & ";"
Call rs.Open(sSQL,cn)
If Not (rs.BOF And rs.EOF) Then
lRetVal = rs.Fields("RecCount").Value
Else
lRetVal = -1
End If
Call rs.Close
Set rs = Nothing
RecordCount = lRetVal
End Function
.Count
属性也很可能是内存不足错误的原因,因为我似乎记得,为了确定记录数,它会(从服务器)加载所有记录以对它们进行计数。但是我在那里可能是错的。
我的目标:
-
需要根据一个参数获取所有记录(数据库-Access) -将最大返回到最大30行(例如列是A,B,C)table1 ---我将其添加到一个记录集中
-
需要针对一个参数获取所有记录(数据库-oracle) -它将返回约30-35条记录(c,d列)table2 我将其添加到另一个记录集
-
接下来,在我需要进一步处理的两个查询的输出中匹配的行 -(table1.C = Table2.c我需要这些数据来进一步处理) -无论匹配哪一个,我都会将其添加到另一个记录集中并返回该记录集