0

C# で複数の挿入レコード クエリを生成し、FireBird で実行しようとしています。

FlameRobin で実行すると、うまく機能します。しかし、C# 経由で実行すると、例外がスローされます。

SET TERM ^ ; INSERT INTO COUNTRY1 SELECT '2', 'two ' FROM RDB$DATABASE UNION ALL SELECT '4', 'four' FROM RDB$DATABASE UNION ALL SELECT '5', 'five' FROM RDB$DATABASE; ^ SET TERM ; ^ 

C#コードの例外は

{"動的 SQL エラー\r\nSQL エラー コード = -104\r\nトークン不明 - 行 1、文字 5\r\nTERM"}

C#コードは

string sQuery = "SET TERM ^ ; INSERT INTO COUNTRY1 SELECT '2', 'two ' FROM RDB$DATABASE UNION ALL SELECT '4', 'four' FROM RDB$DATABASE UNION ALL SELECT '5', 'five' FROM RDB$DATABASE; ^ SET TERM ; ^ ";
SqlHelper.ExecuteNonQuery(SQLHelp.Connectionstring, CommandType.Text, sQuery);

私はここで何が間違っているのですか?ありがとう

4

2 に答える 2

1

クエリが Firebird 構文に準拠していません。ドライバーは一度に 1 つのステートメントしか実行できません ( は 1EXECUTE BLOCKつのステートメントと見なされることに注意してください)。を使用しないでください。これSET TERMは ISQL ツール (および FlameRobin などの他のクエリ ツール) のアーティファクトであり、実際には Firebird SQL 言語の一部ではありません。

;また、クエリに含めるべきではありません。EXECUTE BLOCKこれらは、1) PSQL (ストアド プロシージャ、トリガー、内部) および 2) ISQL などのツールでステートメントを分離 (終了) する場合にのみ有効です。

したがって、次のクエリを単独で使用するだけで十分です。

INSERT INTO COUNTRY1 SELECT '2', 'two ' FROM RDB$DATABASE UNION ALL SELECT '4', 'four' FROM RDB$DATABASE UNION ALL SELECT '5', 'five' FROM RDB$DATABASE

編集

私がコメントしたように、パーサーUNIONINSERT ... SELECT.

サブセレクトを使用すると、おそらくうまくいくでしょう:

INSERT INTO COUNTRY1 
  SELECT column1, column2 FROM (
     SELECT '2' AS column1, 'two ' AS column2 FROM RDB$DATABASE 
     UNION ALL SELECT '4', 'four' FROM RDB$DATABASE 
     UNION ALL SELECT '5', 'five' FROM RDB$DATABASE
  )

編集2

以下のコードでテストしたところ、動作します。期待される行が挿入されます。

static void Main(string[] args)
{
    var constrBuilder = new FbConnectionStringBuilder();
    constrBuilder.DataSource = "localhost";
    constrBuilder.Database = @"D:\data\db\testdatabase.fdb";
    constrBuilder.UserID = "sysdba";
    constrBuilder.Password = "masterkey";

    string constr = constrBuilder.ToString();

    using (var con = new FbConnection(constr))
    {
        con.Open();
        using (var trans = con.BeginTransaction())
        {
            var cmd = new FbCommand();
            cmd.CommandText = "INSERT INTO COUNTRY1 SELECT '2', 'two ' FROM RDB$DATABASE UNION ALL SELECT '4', 'four' FROM RDB$DATABASE UNION ALL SELECT '5', 'five' FROM RDB$DATABASE";
            cmd.Connection = con;
            cmd.Transaction = trans;

            cmd.ExecuteNonQuery();
            trans.Commit();
        }
    }
}
于 2013-04-11T06:34:02.843 に答える