Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Firebird合并SQL命令和.net FbBatchExecution_C#_Sql_Firebird - Fatal编程技术网

C# Firebird合并SQL命令和.net FbBatchExecution

C# Firebird合并SQL命令和.net FbBatchExecution,c#,sql,firebird,C#,Sql,Firebird,情景: 火鸟数据库 Winform应用程序(.NET) 文本文件中的SQL脚本 FbBatchExecution(用于从c#执行SQL脚本的firebird.net提供程序类) 鉴于这种表格结构 CREATE TABLE MYMASTERTABLE ( PRJ_PK INTEGER NOT NULL, ID_PK INTEGER NOT NULL, FIELDTOUPDATE INTEGER, DESCRIPTION

情景:

  • 火鸟数据库
  • Winform应用程序(.NET)
  • 文本文件中的SQL脚本
  • FbBatchExecution(用于从c#执行SQL脚本的firebird.net提供程序类)
鉴于这种表格结构

CREATE TABLE MYMASTERTABLE (
    PRJ_PK         INTEGER NOT NULL,
    ID_PK          INTEGER NOT NULL,
    FIELDTOUPDATE  INTEGER,
    DESCRIPTION    VARCHAR(20) NOT NULL
);

ALTER TABLE MYMASTERTABLE ADD CONSTRAINT PK_MYMASTERTABLE PRIMARY KEY (PRJ_PK, ID_PK);

CREATE TABLE MYDETAILSTABLE (
    PRJ_FK      INTEGER NOT NULL,
    ID_FK       INTEGER NOT NULL,
    ID_ITEM_PK  INTEGER NOT NULL,
    MYFIELD1    INTEGER
);
ALTER TABLE MYDETAILSTABLE ADD CONSTRAINT PK_MYDETAILSTABLE PRIMARY KEY (PRJ_FK, ID_FK, ID_ITEM_PK);
…用这些值填充

UPDATE OR INSERT INTO MYMASTERTABLE (PRJ_PK, ID_PK, FIELDTOUPDATE, DESCRIPTION) VALUES (1, 1, NULL, 'My Item 1') MATCHING (PRJ_PK, ID_PK);
UPDATE OR INSERT INTO MYMASTERTABLE (PRJ_PK, ID_PK, FIELDTOUPDATE, DESCRIPTION) VALUES (1, 2, NULL, 'My Item 2') MATCHING (PRJ_PK, ID_PK);
UPDATE OR INSERT INTO MYMASTERTABLE (PRJ_PK, ID_PK, FIELDTOUPDATE, DESCRIPTION) VALUES (2, 1, NULL, 'Another Item 1') MATCHING (PRJ_PK, ID_PK);
UPDATE OR INSERT INTO MYMASTERTABLE (PRJ_PK, ID_PK, FIELDTOUPDATE, DESCRIPTION) VALUES (2, 2, NULL, 'Another Item 2') MATCHING (PRJ_PK, ID_PK);
UPDATE OR INSERT INTO MYMASTERTABLE (PRJ_PK, ID_PK, FIELDTOUPDATE, DESCRIPTION) VALUES (2, 3, NULL, 'Third') MATCHING (PRJ_PK, ID_PK);
UPDATE OR INSERT INTO MYMASTERTABLE (PRJ_PK, ID_PK, FIELDTOUPDATE, DESCRIPTION) VALUES (2, 4, NULL, 'Fourth') MATCHING (PRJ_PK, ID_PK);

UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (1, 1, 1, 4) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (1, 1, 2, 5) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (1, 1, 3, 1) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (1, 1, 4, 7) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (2, 1, 2, 4) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (2, 2, 2, 2) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (2, 1, 1, 5) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
UPDATE OR INSERT INTO MYDETAILSTABLE (PRJ_FK, ID_FK, ID_ITEM_PK, MYFIELD1) VALUES (2, 1, 3, 10) MATCHING (PRJ_FK, ID_FK, ID_ITEM_PK);
。。。我在文本文件中有一个合并SQL命令,我可以从IbExpert执行该命令,并且没有错误

MERGE INTO mymastertable AS MMT
    USING (
                SELECT
                    MYDETAILSTABLE.PRJ_FK AS PRJ_FK,
                    MYDETAILSTABLE.ID_FK AS ID_FK,
                    Sum(MYFIELD1) AS TheSum
                FROM
                    MYDETAILSTABLE
                GROUP BY
                    MYDETAILSTABLE.PRJ_FK,
                    MYDETAILSTABLE.ID_FK
            ) AS MyDetails

     ON MyDetails.PRJ_FK = MMT.PRJ_PK AND MyDetails.ID_FK = MMT.ID_PK
     WHEN MATCHED then
     update set
        MMT.FIELDTOUPDATE = MyDetails.TheSum
这个MERGE命令基本上是一个UPDDATE查询的替代品,它在JOIN中有两个表作为源,不能在Firebird数据库中执行

当我尝试执行应用程序中用c#编写的相同脚本时,MERGE命令不起作用。 错误是:

无法确定SQL语句的类型

C#应用程序有一个内置的firebird数据库更新引擎,从很久以来(至少8年)它就像一个charme一样工作。 这是我第一次使用合并命令,因为我需要用详细信息表中某个字段的值之和更新主字段表(主字段-详细信息关系已就绪)

我无法使用FbBatchExecution使此合并命令正常工作

编辑 问题在于SQL脚本的解析,而不是它的执行

ScriptFileName = @"c:\anypath\TestUpdate.txt";    
if (File.Exists(ScriptFileName))
{
    StreamReader sr = File.OpenText(ScriptFileName);
    FbScript script = new FbScript(sr.ReadToEnd());

    script.Parse(); //THIS WILL CAUSE AN EXCEPTION

    FbConnection cn = fbm.GetConnection();
    FbBatchExecution fbe = new FbBatchExecution(cn);

    fbe.AppendSqlStatements(script);

    fbe.Execute();
}
堆栈跟踪:

在FirebirdSql.Data.Isql.FbScript.Parse()中 在C:\Users\francesco.giossi\Documents\testApp\Test.cs中的Test.UpgradeDatabase_NEW(Int32 UpgradeTo)中:第853行

.Net框架:4.6.1

Firebird.Net提供程序:5.12.1.0

火鸟数据库:2.5

有什么想法或解决办法吗?

我尝试了更新。。。哪里有这样的方式,但我不能让它工作,即使在IBExpert,所以我放弃了

解决方案

将其添加到列表中。解析器无法识别
MERGE
语句


作为一种快速解决方法,您可以处理
Unknownstation
事件并提供,即
SqlStatementType.Update

请显示用于在C#中执行合并的确切代码,并包括完整的异常堆栈跟踪。您是否尝试过将merge作为普通命令执行,而不是使用
fbatchexecution
?您好,我更新了帖子,指定问题出在Parse函数中,而不是在执行过程中(根本没有执行);正如你所建议的,我试着使用命令,但没有乐趣。动态SQL错误SQL错误代码=-104令牌未知-第1行第1列FirebirdSqlhhmm,查看SqlStatementType,其中没有定义“合并”。@Francescogiosi cincura.net明确声明将语句类型更改为
SqlStatementType.Update
,为什么要查找
合并
?语句类型只是通知脚本执行如何执行语句,在这方面,
merge
语句是一个更新。@markrotVeel是的,谢谢,我误解了cincura net的评论。它起作用了!有趣的是,我记得我在UIB库中修复了一个类似的问题。坦率地说,这不是开源的目的吗-D
StreamReader sr = File.OpenText(ScriptFileName);
FbScript script = new FbScript(sr.ReadToEnd());

script.UnknownStatement += Script_UnknownStatement;

script.Parse();

FbConnection cn = fbm.GetConnection();
FbBatchExecution fbe = new FbBatchExecution(cn);
private void Script_UnknownStatement(object sender, UnknownStatementEventArgs e)
{
    //TODO Look for MERGE command in e.Statement
    e.NewStatementType = SqlStatementType.Update;
    e.Handled = true;
}