【问题标题】:FireDAC Add new field to existing SQL tableFireDAC 向现有 SQL 表添加新字段
【发布时间】: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。

标签: delphi firedac


【解决方案1】:

FireDAC 应该了解支持的数据库使用的语法并使用适当的语法和修饰。请参阅此处的文档:http://docwiki.embarcadero.com/RADStudio/Sydney/en/Preprocessing_Command_Text_(FireDAC)

TFieldDef 是 TDataSet 中字段的内部描述符,它不会用于自动更新表结构。 (尽管您可以编写自己的程序,将您的 TFieldDefs 与 FireDAC MEta 数据进行比较,并创建您需要在 TFDCommand 中执行的 DDL(数据定义语言)语句......)

要更改该表结构,您需要提供使用 TFDCommand 执行的 DDL (SQL) 语句 - 上面的“预处理”链接将解释如何以方言抽象的方式编写它。

如果您使用适当的 FireDAC 描述,它将自动为您放入适当的 SQL 修饰,因此语法是有效的。根据您的 SQL 方言和 FireDAC 驱动程序,您可能会遇到限制。 (例如,使用 ODBC 驱动程序 FireDAC 通常不会知道底层数据库的具体细节 - 我们必须为 SAP HANA 实施一个解决方案,这正是面临这个挑战)。

请记住,某些 SQL 方言支持其他方言不支持的功能 - 例如,假设您可以在添加列时定位列(例如 MySQL 支持)是不安全的,因为并非所有方言都允许在一个 ALTER TABLE 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2015-07-08
    相关资源
    最近更新 更多