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

How to add field to ADO Recordset on runtime in Delphi 6?

我有一个关于 ADO 记录集的简单问题。我有两个 _RecordSet 正在运行,我正在比较它们的区别。

代码如下。

    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;

结束;

创建一个新的RecordSet并向其中写入数据应该怎么做

注意:EXCELSET.Recordset 正在执行另一个函数,该函数生成 excel sheet,因此它与数据库无关。

我认为,如果您使用预先存在的电子表格,而该电子表格包含您要用于保存数据的工作表,那么这样做会更容易。然后,您可以构造一个 Sql 语句来创建一个具有您想要的结构的 table 并将 TAdoCommand 的 CommandText 设置为其,然后只需调用 TAdoCommand.Execute 即可添加工作表到您的电子表格。 (显然,在 Excel 中手动添加工作表会更容易,但我假设你不想这样做,无论出于何种原因,无论如何 fun/useful 来计算如何做这样的事情 "the hard way").

下面是一个在现有工作簿中创建新 table 的最小项目,我希望它足以让您继续。

我发现让它工作最棘手的一点是让 TAdoConnectionString 正确。特别是,在 IDE 中的 AdoConnectionString 生成器中,您需要转到 All 选项卡并在扩展属性条目中输入适当的值,在我的例子中是 'Excel 8.0'。

注意(无论如何在 D7 中):

a) 如果您在 IDE 中对与其连接的数据集进行后续更改并且

,则扩展属性条目往往会被空白

b) 在 IDE 中,TAdoCommand 以某种方式创建了一个参数对象,该对象需要在编译和 运行 程序之前删除。

更新 我假设一旦您创建了新的 table/worksheet,您将能够使用标准 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