2012-04-05 2 views
1

MySQL 데이터베이스에 대해 레코드 집합을 만들고 열거 나 연결을 끊습니다. 하나의 쿼리에 대해 올바르게 작동하지만 데이터베이스에 행이있는 다른 쿼리에 대해 0 레코드를 반환합니다. 작동하는 곳에서는 레코드 집합에서 레코드를 삭제할 수 있습니다. 레코드를 반환VB6 ADO 연결이 끊긴 레코드 집합은 레코드를 반환하지 않습니다.

쿼리 :

sql = "select convert(v.wonotes using UTF8) as WonData, v.wo_cat_id, v.id As wo_desc_id, v.line_no as line_no, " & _ 
     " v.wo_id as wo_id, v.prop_id as prop_id, convert(v.description using UTF8) as description, v.cat_id as cat_id, " & _ 
     " v.completion_date as completion_date from vw_property_wo_desc v " & _ 
     " where v.wo_cat_id= 6 and **(v.wo_status = 'completed' or v.wo_status = 'approved')** " & _ 
     " and v.wonotes is not null and v.wonotes<> '' " 

레코드를 반환하지 않는 쿼리

sql = "select convert(v.wonotes using UTF8) as WonData, v.wo_cat_id, v.id As wo_desc_id, v.line_no as line_no, " & _ 
     " v.wo_id as wo_id, v.prop_id as prop_id, convert(v.description using UTF8) as description, v.cat_id as cat_id, " & _ 
     " v.completion_date as completion_date from vw_property_wo_desc v " & _ 
     " where v.wo_cat_id= 6 and **v.wo_status = 'unassigned'** " & _ 
     " and v.wonotes is not null and v.wonotes<> '' " 

다른 변화가 없다.

커서 유형을 adOpenDynamic으로 변경하면 쿼리에서 레코드를 반환하지만 연결을 끊을 수 없습니다. 이는 데이터베이스에 해당 쿼리를 만족하는 레코드가 있음을 증명하기위한 것입니다. 연결이 끊긴 된 레코드에 대한

코드 : 나는 아이디어가 부족했다

With rsToUse 

    If .State = adStateOpen Then .Close 

    .ActiveConnection = GetConnection 
    .Source = sql 
    .CursorLocation = adUseClient 
    .CursorType = adOpenForwardOnly 
    .LockType = adLockBatchOptimistic 
    .Open 

    If .EOF Then 
     .Close 
     Exit Function 
    End If 

    .ActiveConnection = Nothing 

End With 

이, 도와주세요.

+1

나는 당신이 레코드를 열었다가 연결을 해제했다는 말을하는 것 같습니다. 정적 커서 유형을 사용해 보셨습니까? – Bob77

+0

@BobRiemersma : 질문을 올바른 텍스트로 업데이트했습니다. 예, 정적으로 시도했지만 레코드를 반환하지 않습니다. Cursorside를 Client로 설정하면 레코드 반환이 중지됩니다. 서버로 설정하면 레코드가 리턴됩니다. – Shrieks

+0

또 하나의 관찰 - cursortype을 adForwardOnly와 serverside로 설정하면 BLOB 필드에 null이 생기기 시작합니다. 정적 사용은 작동하는 것처럼 보입니다. – Shrieks

답변

0

SQL Server 데이터베이스에서 연결이 끊긴 레코드 집합을 가져 오는 데 사용하는 코드입니다. 나는 그것이 물론 MySQL 데이터베이스 (물론 연결 문자열을 제외하고)에서 작동 할 것이라고 생각한다.

Public Function GetRecordset(ByVal SQL As String) As ADODB.Recordset 

    Dim DB As ADODB.Connection 
    Dim RS As ADODB.Recordset 

    Set DB = CreateObject("ADODB.Connection") 
    DB.ConnectionString = globalConnectionString 
    DB.CursorLocation = adUseClient 
    DB.CommandTimeout = 0 
    Call DB.Open 

    Set RS = CreateObject("ADODB.Recordset") 
    RS.CursorLocation = adUseClient 
    Call RS.Open(SQL, DB, adOpenForwardOnly, adLockReadOnly) 
    Set RS.ActiveConnection = Nothing 
    Set GetRecordset = RS 
    Set RS = Nothing 
    DB.Close 
    Set DB = Nothing 

End Function 

이 정확한 코드는 현재 아무런 문제없이 5 년 이상 생산되었습니다. 시도해 보시길 권합니다.

연결이 끊긴 레코드 집합을 사용하는 마법의 조합은 연결 개체가 UseClient로 설정된 CursorLocation을 가지며 레코드 집합 개체가 ForwardOnly 및 LockReadOnly인지 확인하는 것입니다.

+0

고마워요 - 내일 한번 해봐. – Shrieks

+0

나는 이것을 시도했지만 여전히 레코드가 없다. 그런데 Connection 수준에서 CursorLocation을 Client로 설정하면 Recordset의 기본값도 클라이언트로 설정됩니다. 나는 이것을 말하기가 싫지만 첫 번째 쿼리가 문제없이 작동하기 때문에 이상하게 보입니다. – Shrieks

관련 문제