尝试连接到Oracle数据库VB6时出现内存不足错误

问题描述

当我尝试使用oracle连接字符串设置Recordset时,我遇到了内存错误

在“ rsLIS.Open sql,gConnLIS,adOpenStatic,adLockReadOnly ”上

但是有时它会像5-6次尝试一样工作

但是当它起作用时,它将在其他行上给出错误

在行“ 如果rsLink.Fields(2).value = rsLIS.Fields(1).value然后

这是我尝试过的事情:

  1. 我尝试不创建记录集,而是尝试创建数组(GetRows)方法

即使记录集计数为26,但数组的UBound显示为1

  1. 我尝试将第三个参数值从静态更改为仅正向 在“” rsLIS.Open sql,gConnLIS,adOpenStatic,adLockReadOnly“”

它也不起作用,它显示recordset.count为0

  1. 重启客户端系统后仍然尝试

我在客户端遇到此错误,因为在我这里我没有调试的开发环境

错误是“内存不足”

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属性也很可能是内存不足错误的原因,因为我似乎记得,为了确定记录数,它会(从服务器)加载所有记录以对它们进行计数。但是我在那里可能是错的。

,

我的目标:

  1. 需要根据一个参数获取所有记录(数据库-Access) -将最大返回到最大30行(例如列是A,B,C)table1 ---我将其添加到一个记录集中

  2. 需要针对一个参数获取所有记录(数据库-oracle) -它将返回约30-35条记录(c,d列)table2 我将其添加到另一个记录集

  3. 接下来,在我需要进一步处理的两个查询的输出中匹配的行 -(table1.C = Table2.c我需要这些数据来进一步处理) -无论匹配哪一个,我都会将其添加到另一个记录集中并返回该记录集