안녕하세요.
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에 담아서 사용해야 할 것 같은데 혹시 해보신 분 있나요 ?
> 안녕하세요.
>
> 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;