【发布时间】:2021-03-19 23:04:26
【问题描述】:
我正在尝试使用此 PROCEDURE 在与 FireDAC 兼容的数据库中创建一个新字段:
PROCEDURE CreateField(Connection : TFDConnection ; CONST TableName : STRING; F : TFieldDefinition);
VAR
Table : TFDTable;
BEGIN
Table:=TFDTable.Create(NIL);
TRY
Table.Connection:=Connection;
Table.TableName:=TableName;
Table.FieldDefs.Updated:=FALSE;
Table.FieldDefs.Update;
Table.FieldDefs.Add(F.FieldName,F.FieldType,F.MaxLen,NOT F.Nullable);
// Commit my changes to the database //
FINALLY
FreeAndNIL(Table)
END
END;
在哪里
TYPE
TFieldDefinition = CLASS
PUBLIC
FieldName : STRING;
FieldType : TFieldType;
MaxLen : Integer;
Nullable : BOOLEAN;
END;
但我似乎无法将更改“提交”回数据库(即最终执行 ALTER TABLE ADD [COLUMN] 语句)。
如何将更改提交到表的 FieldDefs 列表?还是有其他方法——使用普通的 FireDAC——我可以用来在现有表中创建一个新字段?
注意:表中已经有数据了,不能简单地“DROP”再“CREATE”表。
【问题讨论】:
-
为什么不执行 SQL 请求来添加列? SQL 语句为 ALTER TABLE SomeTableName ADD SomeColumnName SomeDataType;检查您的数据库 SQL 语法以获取更多详细信息。
-
我不认为 FireDAC 允许您使用
FieldDefs更改表结构。向表中添加新列并不总是一件容易的事 - 例如如果新列不允许空值。恐怕您需要自己生成DDL 命令。 -
@fpiette:因为我希望 100% 独立于底层数据库的特定 SQL 语法。比如,我是否使用 " 或 [] 来包围表和字段名称(如果它们与保留字相同)?布尔字段的有效类型是 BOOL、BOOLEAN 还是 BIT?它是 VARBINARY(MAX)、IMAGE 还是BLOB?VARCHAR(MAX) 还是 CLOB?字符串是真值“1”还是“TRUE”?这就是 FireDAC 对我隐藏的东西......
-
您是否尝试将 false 作为第一个参数 (ARecreate) 传递给
TFDTable.CreateTable? -
@Brian:是的:“表已存在”错误。从跟踪到它,它似乎只能做一个 CREATE TABLE(有或没有之前的 DROP TABLE)而不是一个 ALTER TABLE。