如何在 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
我有一个关于 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