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

时间:2020-09-30 09:53:57

标签: 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", adBSTR, 50
    rec_result.Fields.Append "SType", adBSTR, 50
    rec_result.Fields.Append "Dilution", adBSTR, 50
Else
    rec_result.Fields.Append "machineparamid", adBSTR, 50
    rec_result.Fields.Append "SType", adBSTR, 50
    rec_result.Fields.Append "Dilution", adBSTR, 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, adOpenStatic, 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

谢谢

2 个答案:

答案 0 :(得分:0)

这仍然使问题出现在哪一行。另外:“它也没有用,它显示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 :(得分:0)

我的目标:

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

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

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

相关问题