Q&A

  • VB에서 OleVariant로 리턴한 RecordSet을 델파이에서 받는 방법 ?
안녕하세요.



VB에서 ActiveX DLL로 만든 DLL이 있고 여기에서 하는 일은 ADO에 연결해서 Connection을 OleVariant로 받아서 일정한 SQL 쿼리를 수행해서 그 결과를 RecordSet에 담아서 OleVariant로 넘겨줍니다.



아래에 VB 소스가 있습니다.



Public Function getProduct(ByVal sConn As Variant, _

ByRef objrs As Variant) As Variant



'입력 :

'출력 : 레코드셋



Dim strSql As String

Dim retVal As Variant

Dim oRs As ADODB.Recordset

Dim lErrno As Long

Dim sErrDesc As String, strTemp As String

Dim objdb As Object



strSql = " 쿼리를 수행합니다. "



Set objdb = CreateObject(sProgId)



retVal = objdb.GetRecordset(sConn, strSql, oRs)

If (retVal <> "") Then

GoTo ErrHandler

End If



Set objrs = oRs

Set oRs = Nothing

getProduct = ""



Set objdb = Nothing



End Sub



결국, oRs에 있는 RecordSet을 objrs라는 OleVariant라는 변수에 담아서 리턴합니다.



그러면 델파이에서는



var

conn, ors: olevariant;

begin

conn := CreateOleObject('adodb.connection');

ors := CreateOleObject('adodb.recordset');

connstr := 'DRIVER={Oracle73 Ver 2.5};UID=****;PWD=****;DBQ=서버.WORLD;ASY=OFF;';

conn.Open(connstr);

cEtc1.getProduct(conn, ors);

//cEtc1은 Import Type Library에서 가져온 객체입니다.

end;



로 받습니다.



몇가지 테스트를 해 보니 정상적으로 ors에는 데이터(recordset)이 담겨있는 것으로 확인되었지만 이녀석을 바로 써먹지 못하는 것 같군요.



요지는 이 ors를 델파이의 recordset에 담아서 사용해야 할 것 같은데 혹시 해보신 분 있나요 ?

1  COMMENTS
  • Profile
    우주인 2001.05.14 18:58
    Mr. Larson wrote:

    > 안녕하세요.

    >

    > VB에서 ActiveX DLL로 만든 DLL이 있고 여기에서 하는 일은 ADO에 연결해서 Connection을 OleVariant로 받아서 일정한 SQL 쿼리를 수행해서 그 결과를 RecordSet에 담아서 OleVariant로 넘겨줍니다.

    >

    > 아래에 VB 소스가 있습니다.

    >

    > Public Function getProduct(ByVal sConn As Variant, _

    > ByRef objrs As Variant) As Variant

    >

    > '입력 :

    > '출력 : 레코드셋

    >

    > Dim strSql As String

    > Dim retVal As Variant

    > Dim oRs As ADODB.Recordset

    > Dim lErrno As Long

    > Dim sErrDesc As String, strTemp As String

    > Dim objdb As Object

    >

    > strSql = " 쿼리를 수행합니다. "

    >

    > Set objdb = CreateObject(sProgId)

    >

    > retVal = objdb.GetRecordset(sConn, strSql, oRs)

    > If (retVal <> "") Then

    > GoTo ErrHandler

    > End If

    >

    > Set objrs = oRs

    > Set oRs = Nothing

    > getProduct = ""

    >

    > Set objdb = Nothing

    >

    > End Sub

    >

    > 결국, oRs에 있는 RecordSet을 objrs라는 OleVariant라는 변수에 담아서 리턴합니다.

    >

    > 그러면 델파이에서는

    >

    > var

    > conn, ors: olevariant;

    > begin

    > conn := CreateOleObject('adodb.connection');

    > ors := CreateOleObject('adodb.recordset');

    > connstr := 'DRIVER={Oracle73 Ver 2.5};UID=****;PWD=****;DBQ=서버.WORLD;ASY=OFF;';

    > conn.Open(connstr);

    > cEtc1.getProduct(conn, ors);

    > //cEtc1은 Import Type Library에서 가져온 객체입니다.

    > end;

    >

    > 로 받습니다.

    >

    > 몇가지 테스트를 해 보니 정상적으로 ors에는 데이터(recordset)이 담겨있는 것으로 확인되었지만 이녀석을 바로 써먹지 못하는 것 같군요.

    >

    > 요지는 이 ors를 델파이의 recordset에 담아서 사용해야 할 것 같은데 혹시 해보신 분 있나요 ?



    OleVariant type의 recordSet 데이타는 TDataSet에 직접 옮겨지지 않습니다.

    물론 MIDAS의 TClientDataSet을 사용하고 공급자는 IProvider interface를 사용하면 가능하지만요.

    아래와 같이 RDS(Remote Data Service)을 사용하면 가능합니다. 그렇지만 이 경우에는 DBControl component(DBGRID, ...)들은 사용할 수 없습니다.

    잘 아시리라 생각되지만 RDS는 MSDN을 참조하십시요.



    procedure TForm1.Button1Click(Sender: TObject);

    var rs, ADS, ADC, myCom : oleVariant;

    tmpStr : String;

    begin

    try

    ADS := CreateOleObject('RDS.DataSpace');

    ADC := CreateOleObject('RDS.DataControl');

    myCom := ADS.CreateObject('myMTSCom.myMTS', 'JEONGHUNLEE');

    rs := CreateOleObject('ADODB.RecordSet');



    ADC.SourceRecordSet := myCom.GetData;

    rs := ADC.RecordSet;

    rs.MoveFirst;

    while not rs.EOF do begin

    tmpStr := rs.Fields.Item['MODEL_CD'].Value + rs.Fields.Item['ENGNO'].Value;

    Memo1.Lines.Add(tmpStr);

    rs.MoveNext;

    end;

    rs.Close;



    finally

    rs := unAssigned;

    ADS := unAssigned;

    ADC := unAssigned;

    end;



    end;