Oracle 给定一个记录集,如何填充TDataSet子体,以便以后填充网格?
目前,我已经遵循了本文中的示例 具体而言,示例名为: 示例:返回多个行集的存储过程 这是从上述示例翻译的delphi代码:Oracle 给定一个记录集,如何填充TDataSet子体,以便以后填充网格?,oracle,delphi,oledb,ado,procedure,Oracle,Delphi,Oledb,Ado,Procedure,目前,我已经遵循了本文中的示例 具体而言,示例名为: 示例:返回多个行集的存储过程 这是从上述示例翻译的delphi代码: //Copied from ADODB.pas function CreateADOObject(const ClassID: TGUID): IUnknown; var Status: HResult; FPUControlWord: Word; begin asm FNSTCW FPUControlWord end; Status := C
//Copied from ADODB.pas
function CreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, Result);
asm
FNCLEX
FLDCW FPUControlWord
end;
if (Status = REGDB_E_CLASSNOTREG) then
raise Exception.CreateRes(@SADOCreateError) else
OleCheck(Status);
end;
var
Con: TADOConnection;
RSet: _Recordset;
Cmd: _Command;
P1, P2: _Parameter;
i: integer;
RecordsAffected: OleVariant;
begin
Con := TADOConnection.Create(nil);
try
Con.ConnectionString := PromptDataSource(Handle, '');
Con.Open('user', 'password');
Cmd := CreateADOObject(CLASS_Command) as _Command;
try
Cmd.Set_ActiveConnection(Con.ConnectionObject);
P1 := Cmd.CreateParameter('P1', adSmallInt, adParamInput, 0, 1);
Cmd.Parameters.Append(P1);
P2 := Cmd.CreateParameter('P2', adSmallInt, adParamOutput, 0, EmptyParam);
Cmd.Parameters.Append(P2);
Cmd.Properties['PLSQLRSet'].Value := True;
Cmd.CommandType := adCmdText;
Cmd.CommandText := '{CALL Employees.GetEmpRecords(?, ?)}';
RSet:= CreateADOObject(CLASS_Recordset) as _RecordSet;
try
//If I use Execute, the CursorLocation will be adUseServer
RSet.Open(Cmd, EmptyParam, adUseClient, adOpenStatic, adCmdText);
ShowMessage(IntToStr(RSet.RecordCount));
for I:= 0 to RSet.Fields.Count-1 do
begin
showmessage(vartostr(RSet.Fields.Item[i].Name)+': '+vartostr(RSet.Fields.Item[i].Value));
end;
Cmd.Properties['PLSQLRSet'].Value := False;
finally
RSet := nil;
end;
finally
Cmd := nil;
end;
finally
Con.Free;
end;
end;
注意:我将过程更改为只返回一个光标强>
问题: 1.a)如何从记录集中填充数据集? 或 1.b)是否有其他方法通过Delphi中的ADO从oracle过程中捕获游标参数?
更新1: 根据MartynA的建议,我尝试使用
TADQuery
,但迄今为止没有成功:
object ADOQuery1: TADOQuery
Connection = ADOConnection1
CursorType = ctStatic
Parameters = <
item
Name = 'param0'
DataType = ftUnknown
Direction = pdOutput
Size = -1
Value = Null
end
item
Name = 'param1'
DataType = ftSmallint
Size = -1
Value = 7084
end
item
Name = 'param2'
DataType = ftSmallint
Direction = pdOutput
Size = -1
Value = Null
end>
SQL.Strings = (
'{CALL Employees.GetEmpRecords(:param0, :param1, :param2)}')
Left = 560
Top = 96
end
procedure TForm1.ADOConnection1WillExecute(Connection: TADOConnection;
var CommandText: WideString; var CursorType: TCursorType;
var LockType: TADOLockType; var CommandType: TCommandType;
var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
const Command: _Command; const Recordset: _Recordset);
begin
CommandType := cmdText;
Command.Properties['PLSQLRSet'].Value := True;
end;
对象ADOQuery1:TADOQuery
连接=ADOConnection1
CursorType=ctStatic
参数=<
项目
名称='param0'
数据类型=未知
方向=输出
大小=-1
值=空
结束
项目
名称='param1'
数据类型=ftSmallint
大小=-1
值=7084
结束
项目
名称='param2'
数据类型=ftSmallint
方向=输出
大小=-1
值=空
结束>
SQL.Strings=(
“{调用Employees.GetEmpRecords(:param0,:param1,:param2)}”
左=560
Top=96
结束
过程TForm1.ADOConnection1WillExecute(连接:TADOConnection;
var-CommandText:WideString;var-CursorType:TCursorType;
var-LockType:TADOLockType;var-CommandType:TCommandType;
var ExecuteOptions:TExecuteOptions;var事件状态:TEventStatus;
const命令:_命令;const记录集:_记录集);
开始
CommandType:=cmdText;
Command.Properties['PLSQLRSet'].Value:=True;
结束;
回答第一个问题非常简单:
RSet.Open(Cmd, EmptyParam, adUseClient, adOpenStatic, adCmdText);
DataSet := TADOQuery.Create(nil);
try
DataSet.Recordset := RSet;
...
当您将记录集“设置”到数据集中时,它会自动填充记录集数据。您可以直接将记录集指定给数据集
ADODataset := TADODataset.Create(nil);
ADODataset.Recordset := RecordsetData;
不知道为什么需要使用原始记录集。您不能使用TAdoQuery或TAdoDataSet检索数据吗?这两种方法都有NextRecordSet方法,并使用标准的DB感知控件,如TDBGrid。是的,您可以使用ado调用存储过程query@JerryDodge我正在努力,但没有什么比这更有效far@MartynA正如我在问题中所说,我只需要第一个记录集,不是第二次,但如果你提供了记录集,为什么要使用TADOQuery?这只是为了演示,我可以使用TADODataSet,正如你在回答中所示。我的答案的关键部分是最后一段。是的,您不需要为数据集分配连接属性。连接在_记录集中处于活动状态+1是的,我想在你回答之前几分钟,谢谢你