因为表在Open以后,就会自动建立Field。所以除了Lookup和CalcField两种类型外,Delphi都会为你创建相关的Field。
如果需要动态创建,那么只要建立LookUp和CalcField就可以了。而且选择在DataSet的AfterOpen事件中建立是个不错的选择。
如果需要动态创建,那么只要建立LookUp和CalcField就可以了。而且选择在DataSet的AfterOpen事件中建立是个不错的选择。
解决方案 »
- D7调用存储过程:我用的SQLQUERY exec mypro @p1=:p1,@p2=:p2
- 如何保存当前窗口到bmp图片?重点:当前窗口比屏幕大!!!
- 如何把一个属性的类型定义为数组类型?
- 关于SOCKET编程问题
- 做C/S结构的程序,怎么解决如果多个用户同时操作一张表的情况,怎么解决如果多个用户同时操作一张表的情况
- 怎么保存数据库中的BLOB Binary数据到一个文件?
- 请hjd_cw接200分,谢谢。
- SQL SERVER2000恢复设备打不开或脱机
- 編程語法轉換
- 有客户要大型人力资源管理软件或合作或出售源代码 ,寻求合作
- 再讲edit和combobox之间的问题?
- 取字符串的子串???
select name into #colname from syscolumns where id in (select id from sysobjects where name=你的表名)
因为有一次我不小心在Query中选取了一个非常大的表(有十几万的数据),然后Add Fields的时候就狂等了很长时间才有Field出来。
那么一个笨方法就是,内建一个Query,先提取一下SQL语句,然后打开,根据这里面的Field创建记录。当然需要优化一下Where语句。比如Where语句可以使“Where 1=0”
然后把TQuery1的字段用一个For循环倒到TQuery2里去,同时增加Lookup和Calc Fields。
//我也认为Delphi一定是通过打开Query然后才取得Field的,不然select *这种句子它怎么都不弄不出field来!
如果没弄错的话,那我也心平了,气也消了。我担心的是原来就有什么简便方法,结果我却用了笨办法,那就气杀我也了!
多谢chechy(我爱洁洁) 的支持!也谢谢forgot2000(忘记2000年) 。有什么帮得到的地方就联系 我。
在Form上,
有一个TClientDataSet ClientDataSet1
和一个TADODataset ADODataset1
function GetData(ADataSet: TDataSet): OleVariant;
begin
with TDataSetProvider.Create(nil) do
try
DataSet := ADataSet;
Result := Data ;
finally
Free;
end;;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Data := GetData(ADODataSet1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var t:TstringField;
i,j :Integer;
begin
adoquery1.open;
i := 0;
Memo1.Clear();
j := ADOquery1.FieldCount;
while i < j do
begin
Memo1.Lines.Add(ADOquery1.Fields[i].Name);
i := i + 1;
end;
end;//得出的是有内容,不过都是空的,name是'';而换成
Memo1.Lines.Add(ADOquery1.Fields[i].DisplayName);则就有内容出来了,都是正确的字段名。
这也就是说,delphi 在表在Open以后,就会自动建立Field,这个field是没有name的,而动态增加lookup字段却是需要一个KeyFields,这个KeyFields肯定是和name有关的,所以就象设计期时增加lookup字段时如果不先把字段都加入,也会出现找不到KeyFields的错误。
另外加点分,不然还真太小气了。