c# - 使用 fluentmigrator 运行 sql 脚本

标签 c# .net oracle11g database-migration fluent-migrator

我有 SQL 脚本:

CREATE TABLE TESTTABLE1(
   ID_TESTTABLE1          NUMBER (18) NOT NULL,
   TESTTABLE_VALUE1       NUMBER (18),
   TESTTABLE_KEY1       NUMBER (18))

并使用 Fluentmigrator:

[Migration(201302021800)]
public class Migration_201302021800 : AutoReversingMigration
{
    public override void Up()
    {
        var url = @"Update_1.0.0.5.sql";
        Execute.Script(url);
    }
}

它执行成功,如果我添加一些 SQL:

CREATE TABLE TESTTABLE1
(
  ID_TESTTABLE1          NUMBER (18) NOT NULL,
  TESTTABLE_VALUE1       NUMBER (18),
  TESTTABLE_KEY1       NUMBER (18)
);
CREATE TABLE TESTTABLE
(
  ID_TESTTABLE          NUMBER (18) NOT NULL,
  TESTTABLE_VALUE      NUMBER (18),
  TESTTABLE_KEY      NUMBER (18)
);

在 Fluentmigrator 中执行失败,出现 Oracle 异常 {"ORA-00911: invalid character"}

我的数据库是 Oracle db。

有什么问题?

最佳答案

要将 Oracle 的语句一起批处理,您需要将其包含在 BEGIN...END block 中。在您在评论中链接到的最后一个示例中,您在第二个语句之后和 END 关键字之前缺少分号。

BEGIN 
CREATE TABLE TESTTABLE1 
    ( 
      ID_TESTTABLE1          NUMBER (18) NOT NULL, 
      TESTTABLE_VALUE1       NUMBER (18), 
      TESTTABLE_KEY1       NUMBER (18) 
    ); 
CREATE TABLE TESTTABLE 
    ( 
      ID_TESTTABLE          NUMBER (18) NOT NULL, 
      TESTTABLE_VALUE      NUMBER (18), 
      TESTTABLE_KEY      NUMBER (18) 
    );
END;

虽然 FluentMigrator 可以在这种情况下提供更好的支持。例如,当 FluentMigrator 处理来自 Sql Server 的多语句脚本时,它会将脚本拆分并执行每个语句 (https://github.com/schambers/fluentmigrator/blob/master/src/FluentMigrator.Runner/Processors/SqlServer/SqlServerProcessor.cs#L197-236)。所以我建议在 https://github.com/schambers/fluentmigrator/issues 记录一个问题

关于c# - 使用 fluentmigrator 运行 sql 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14672476/

相关文章:

Java:如何从 Oracle 打印存储过程数据

c# - 将相似的方法浓缩成一个 super 酷的方法

c# - 在意外的时间调用了一个方法。 (HRESULT : 0x8000000E) exception was thrown by a method 的异常

.net - Entity Framework 和可为空的字段

.net - 如何锁定表的一行

sql - FORALL循环中有多个SQL语句

oracle - 目标表中的默认值

C# 调试 - 在不知道哪个属性具有它的情况下寻找某个值

c# - 如何在不选择新模型的情况下包含导航属性?

.net - 如何在不调用 ResourceManager.GetString() 并捕获异常的情况下确定 ResourceManager 是否包含键?