在Delphi 6中如何在运行时将字段添加到ADO Recordset?

我有一个关于ADOlogging集的简单问题。 我有两个_RecordSetfunction,我比较他们的差异。

代码如下。

function TPT101_ANAF.DataSetKarsilastir(Eski: _Recordset; Yeni: _Recordset) :_Recordset; var varBookMark:OleVariant; begin Eski.MoveFirst; Yeni.MoveFirst; while not Yeni.EOF do begin Eski.Find('SİCİL = '''+Yeni.Fields['SİCİL'].Value+'''',0, adSearchForward, adBookmarkFirst); If (Eski.BOF = True) OR (Eski.EOF = True) Then begin PT101FDM.EXCELSET.Append; **/* i want to add differences to EXCELSET (From Yeni RecordSet) /* but the disconnected ADODataset error raising.** PT101FDM.EXCELSET.Insert; end; Yeni.MoveNext; end; Result := PT101FDM.EXCELSET.Recordset; 

结束;

我应该如何创build一个新的RecordSet并在其中写入数据。

注意:EXCELSET.Recordset是另一个function,使Excel表,所以它没有这样的事情与数据库。

如果您使用包含要用来保存数据的工作表的预先存在的电子表格,我认为这样做更容易。 然后,可以构造一个Sql语句来创build一个具有所需结构的表格,并将TAdoCommand的CommandText设置为该表格,只需调用TAdoCommand.Execute即可将工作表添加到电子表格中。 (很显然,只需在Excel中手动添加工作表就可以了,但是我假设你不想这么做,无论出于何种原因,无论如何,搞清楚如何做这样的事情是很有趣的“困难的方式“)。

下面是一个在现有的工作簿中创build一个新表的最小项目,我希望这个工作簿足以让你走了。

我发现最棘手的一点是要得到TAdoConnectionString的权利。 特别是,在IDE中的AdoConnectionString构build器中,您需要转到“ 全部”选项卡,然后在“扩展属性”条目中input适当的值,在我的示例“Excel 8.0”中。

注意(无论如何D7):

a)如果您在IDE中对连接到它的数据集进行后续更改,扩展属性条目往往会空白

b)在IDE中,TAdoCommand以某种方式得到一个在编译和运行程序之前创build的需要删除的Parameter对象。

更新我假设一旦你创build了新的表/工作表,你将能够使用你select的标准Delphi Ado组件填充它,但为了完整性,我已经更新了下面的代码,以显示正在做。

  TForm1 = class(TForm) [...] ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; ADOQuery2: TADOQuery; ListBox1: TListBox; ADOCommand1: TADOCommand; Button1: TButton; [...] const scSheetName = 'test'; scCreateSheet = 'create table %s (id integer, name char(80))'; scSelect = 'select * from [%s]'; procedure TForm1.FormDestroy(Sender: TObject); begin AdoQuery1.Close; AdoQuery2.Close; end; procedure TForm1.Button1Click(Sender: TObject); begin if ListBox1.Items.IndexOf(scSheetName) < 0 then begin AdoCommand1.CommandText := Format(scCreateSheet, [scSheetName]); AdoCommand1.Execute; end; AdoQuery2.SQL.Text := Format(scSelect, [scSheetName]); if AdoQuery2.Active then AdoQuery2.Close; AdoQuery2.Open; if AdoQuery2.RecordCount = 0 then begin AdoQuery2.InsertRecord([1, 'Name1']); AdoQuery2.InsertRecord([2, 'Name2']); end; GetTables; end; procedure TForm1.GetTables; begin AdoConnection1.GetTableNames(ListBox1.Items,True); end; procedure TForm1.FormCreate(Sender: TObject); begin AdoConnection1.Connected := True; AdoQuery1.Open; // this just selects whatever is on the first worksheet of the spreadsheet GetTables; end; 

DFM

 object ADOConnection1: TADOConnection ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\aa' + 'ad7\Ado\Excel\Table1.xls;Mode=Share Deny None;Extended Propertie' + 's=Excel 8.0;Persist Security Info=False;Jet OLEDB:System databas' + 'e="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";J' + 'et OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;Jet OL' + 'EDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions' + '=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Da' + 'tabase=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Co' + 'py Locale on Compact=False;Jet OLEDB:Compact Without Replica Rep' + 'air=False;Jet OLEDB:SFP=False' LoginPrompt = False Provider = 'Microsoft.Jet.OLEDB.4.0' Left = 16 Top = 8 end object ADOQuery1: TADOQuery Connection = ADOConnection1 Parameters = <> SQL.Strings = ( 'select * from [sheet1$]') Left = 48 Top = 16 end object ADOCommand1: TADOCommand CommandText = 'create table test (id integer,'#13#10'name char(80)'#13#10')' Connection = ADOConnection1 Parameters = <> Left = 152 Top = 16 end object DataSource2: TDataSource Left = 184 Top = 16 end object ADOQuery2: TADOQuery Connection = ADOConnection1 Parameters = <> SQL.Strings = ( 'select * from [test]') Left = 40 Top = 288 end