基本上“动态添加一个数据库字段”是数据库SQL本身的事,与Delphi关系不大。
ADOCommand1CommandText := 'alter table 表名 add 字段名1 varchar(12),字段名2 integer,字段3 datetime';
ADOCommand1Execute;
alter table Test add name varchar(30) 增加一列 列名为name的字段个人认为这种 *** 作极有可能破坏数据的完整性和一致性。如果你在程序中还给用户提供一个这样的页面来运行它,运行用户自己来新增字段,向数据库发送 alter table add column这样的DDL,我认为不可取 。
增加字段: alter table [表名] add 字段名 smallint default 0 增加数字字段,整型,缺省值为0。
alter table [表名] add 字段名 int default 0 增加数字字段,长整型,缺省值为0。
alter table [表名] add 字段名 single default 0 增加数字字段,单精度型,缺省值为0。
alter table [表名] add 字段名 double default 0 增加数字字段,双精度型,缺省值为0。
alter table [表名] add 字段名 Tinyint default 0 增加数字字段,字节型,缺省值为0。
alter table [表名] add 字段名 text [null] 增加备注型字段,[null]可选参数。
alter table [表名] add 字段名 memo [null] 增加备注型字段,[null]可选参数。
alter table [表名] add 字段名 varchar(N) [null] 增加变长文本型字段大小为N(1~255)。
alter table [表名] add 字段名 char [null] 增加定长文本型字段大小固定为255。
扩展资料
全局变量
全局变量是sql server(WINDOWS平台上强大的数据库平台)系统内部使用的变量,其作用范围并不局限于某一程序,而是任何程序均可随时调用全局变量通常存储一些sql server(WINDOWS平台上强大的数据库平台)的配置设定值和效能统计数据。
用户可在程序中用全局变量来测试系统的设定值或Transact-SQL命令执行后的状态值。有关sql server(WINDOWS平台上强大的数据库平台) 全局变量的详细情况请参见附录。
注意:全局变量不是由用户的程序定义的,它们是在服务器级定应义的。只能使用预先说明及定义的变局变量。引用全局变量时,必须以“@@”开头。局部变量的名称不能与全局变量的名称相同、否则会在应用中出错。
可以采用四种技术:
动态增加数据库表字段
预留足够的空白字段,运行时作动态影射
用xml格式保存在单字段里
改列为行,用另外一个表存放定制字段
一
现在我们来分析一下四种技术的优劣,不过首先可以排除的是第一点动态增加字段的方法,因为在实际 *** 作时候几乎是不可能的(sqlserver太慢,oracle索性不支持),基本可以不讨论就排除。剩下后三点。
二
先来讨论预留空白字段的方法,基本原理就是在数据库表设计的时候加入一些多余的字段,看下面的代码:
CREATE TABLE Sample(
name varchar(12),
field0 varchar(1),
field1 varchar(1),
fieldN varchar(1)
}
然后看实际运行时候的需要,动态分配字段给系统使用,也许需要一个这样的结构来描述分配情况:
public class Available
{
public int CurrentUnusedFieldNumber;
public Hashtable FieldToRealName;
}
也许某一时刻的数据状况是这样的: CurrentUnusedFieldNumber=3,
哈西表FieldToRealName包含内容是("field0"="SomeId", "field1"="AnyName",
"field2=IsOk")
现在的问题是如果要配合Hibernate,如何来处理?以上段的数据使用状况为例子,如果我们的类定义是这样:
public class Entity01
{
public string Name;
public string SomeId;
public string AnyName;
public bool IsOk;
}
也许只需要修改一下xxxhbmxml,把 SomeId 和 field0
做成对应就ok了。但是在运行时我们怎么知道会有这样的类定义?除非我们做动态代码生成,自动编译也许可以,但是问题也许就到其他方面去了;如果我们不用动态定义,那么类就只能是这样:
public class Entity01
{
public string Name;
public Hashtable ExtraFieldAndValues;
}
使用的时候,用 entity01ExtraFieldAndValuessetValue("AnyName", "boss")
的方式来引用,也许这样是修改最少的了,但是问题是Hibernate不支持这样的方法。
三
再来讨论单字段存储的方法,我们使用这样的数据库表定义
CREATE TABLE Sample
(
Name varchar(12),
Xml CLOB(102400) // 仅作说明而已
)
然后对应这样的类定义
public class Entity01
{
public string Name;
public string Xml;
public Hashtable ExtraNameAndValueFromXml;
}
我们的代码就可以这样使用:string id =
entity01ExtraNameAndValueFromXmlgetValue("SomeId")
了。这样解决看起来很不错,不仅不需要Available表,而且看起来Hibernate对它的支持也很完美,但是致命的问题在于:如果保持高效的查询?除非数据库系统本身对此有支持,否则就只能用低效的substring或者like做查询,这在大批量数据中根本就不可行。
是不是折衷一下,把两种方法的优点和起来?问题有来了:怎么保持两者之间数据的同步?难道要我们用存储过程去解析xml内容?
所以,一个两难的问题,需要我们认真去解决。我们通过认真的需求分析,也许可以减少可变字段的数量,但是只要有一个可变字段或者可变的可能性存在,我们始终要去解决这个两难的问题。
期待继续讨论。
四
还有一种方法就是改列为行,用另外一个表存放扩展字段,定义可以如下:
CREATE
TABLE SampleFields
(
idSample Integer,
fieldName varchar(30),
fieldValue varchar(100)
)
其中idSample关联到Sample表的id字段(我没有写出来)。这样的话,Hibernate很容易支持,也可以支持Sql的查询,而且可以支持把内容放到Hashtable中去,看起来是目前最好的方式了。但是在大容量数据的时候,SampleFields表的数据会是主表数据量的N倍(看定制的字段数目多少而定),同样存在有很严重的性能问题。
以上就是关于ADOQuery1中怎样动态添加字段全部的内容,包括:ADOQuery1中怎样动态添加字段、java中,如何向数据库表中动态添加列、SQL如何添加字段等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)