关于动态生成表结构的问题 (100分)

  • 主题发起人 主题发起人 liamy
  • 开始时间 开始时间
L

liamy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在编程的过程中遇到了一个问题,

数据表的结构要动态生成。
表的各个字段要来自另一个表的记录或edit控件的输入。
所以在delphi实现中要使用参数,我的程序是这么写的:

with query1 do

begin

sql.clear;

sql.add(‘create table test(:fields1 :datatype1, :fields2: datatype2)’);

params.parambyname(‘fields1’).asstring:=edit1.text;

params.parambyname(‘datatype1’).asstring:=edit2.text;

params.parambyname(‘fields2’).asstring:=edit3.text;

params.parambyname(‘datatype2).asstring:=edit4.text;

execsql;

end;

程序报错!
请教各位应该怎么改?

或者类似这样动态生成表结构的问题,有没有其他好的方法可用?
 
动态写:
SQL.Add('Create Table'+TableName);
SQL.Add('(FieldName1 Char(10) Null,');
SQL.Add('FieldName2 Float Null,');
SQL.Add('FieldName3 Char(20) Null)');
用ExecSQL就可以执行。
 
你应该动态生成参数tparams.addparam,并同时指定其类型TParam.DataType
 
我建议你用一个SQLSTR变量,然后这样写SQL语句
SQLSTR :=‘CREATE TABLE ‘‘‘+TABLENAME+’’’( ‘
+ ‘‘‘‘+FIELD1’’’’;
SQL。ADD(SQLSTR);
OPEN;
算了我先给你试试!一会在告诉你好吗
 
在我的一个系统中是这样做的
表Table_Stru中存放表Table的字段信息,有name,type,size等信息
建表时先建立一临时表Table_tmp,然后再将原来表的内容复制过来。
with Table_tmp do
begin
Active := False;
DatabaseName :=your database name;
TableType := your Tbale Tye;
Randomize;
m_name:='~'+trim(inttostr(random(9999999)));
Table_tmp.TableName :=m_name;
Table_tmp.FieldDefs.Clear;
with Table_Stru do
begin
if not(Active) then Open;
First;
while not eof do
begin
m_field:=FieldByName('name').asstring;
m_DataType:=FieldByName('name').asstring;
m_size:=fieldbyName('size').value;
Table_tmp.Fielddefs.Add(m_Field,m_DataType,m_size,False);
next;
end;
end;
// 若存在索引信息需建立索引
with IndexDefs do
begin
Clear;
...
end;
Table_tmp.CreateTable;
Table.Close;
Table.TableName:=your table name;
if not(Table.Exists) then
begin
Table_tmp.RenameTable(your table name);
Table_tmp.Close;
end
else
begin
Table.First;
while not(Table.Eof) do
begin
Table_tmp.Append;
Table_Stru.First;
while not(Table_Stru.eof) do
begin
m_field:=Table_stru.FieldByName('name').asstring;
if Table.Fields.FindField(m_field)<>nil then
begin
Table_tmp.FieldByName(m_field).value:=Table.FieldByName(m_field).value;
end;
Table_stru.next;
end;
Table_tmp.Post;
Table.Next;
end;
Table.Close;
Table.DeleteTable;
Table_tmp.Close;
Table_tmp.RenameTable('your table name');
end;
end;
 
谢谢各位。
请问DJ,我想创建的是SQL SERVER的数据表,该如何处理??
 
调用SqlServer的存储过程!
 
没有指定字段的类型!
Create Table mytable
(Field1 fieldtype Null,
Field2 fieldtype Null,
Field3 fieldtype Null)
将表名、字段名和字段类型分别用变量替换即可。
 
你的SQL不使用参数而是动态构造试一试
Query1.sql.add('create table "Table_tmp" (');
with Table_Stru do
begin
if not(Active) then Open;
First;
while not eof do
begin
Query1.sql.add(FieldByName('name').asstring+' ');
Query1.sql.add(FieldByName('type').asstring+',');
next;
end;
end;
Query1.execsql;
然后将原有数据导入。
最后将Table_tmp drop掉。
 
使用参数也是可以的,就是要给参数指定类型。
 
谢谢大家,这次真是收获多多!!
还想小问一下,“指定参数类型“如何运用到动态生成表结构??
 
我觉得,动态生成表结构最典型的莫过于在电子商务中对商品分类的应用了!
比如说,商品分类要实现无限制的增加和删除,就要用到面向对象的方法,但是它却不是这样
实现的,它是把要增加的字段作为一个关系表的记录(记录当然是可以所以增加和删除的),
然后再把这个关系表的记录转到真正的表中来实现的!
 
多人接受答案了。
 
后退
顶部