iDB2SQLErrorException,除非连接字符串包含库列表 - 为什么?

问题描述 投票:0回答:1

我正在尝试更新一个应用程序,该应用程序写入位于 AS400(IBM DB2 中型)上的 Mapics 数据库中的表。这样做时,我从连接字符串中删除了库列表,现在当我尝试插入时它会抛出异常。

为什么这个查询(它根本不需要库列表,因为它已经指定了库)在连接字符串不包含库列表时会抛出错误?更重要的是,如何在不需要更新连接字符串的情况下修复它?

下面是一些演示该问题的代码。

try
{
    var connectionString = "DataSource=as400.myCompany.com" +
                           "; UserID=" + ConfigurationManager.AppSettings["UserName"] +
                           "; Password=" + ConfigurationManager.AppSettings["Password"] +
                           "; InitialCatalog=PRODTEST" +
                           //"; LibraryList=*USRLIBL, AMALIBT" + //Works... WHY?
                           //"; LibraryList=AMALIB" + //Doesn't work.
                           //"; LibraryList=*USRLIBL" +//Doesn't work.
                           "; DataCompression=True; CheckConnectionOnOpen=True; Naming = System;";
    const string sql = "insert into AMFLIBT.SHIPVF(VIACD, VIADS, MDATE) values(?, ?, ?) with NC";
    var parameters = new List<IBM.Data.DB2.iSeries.iDB2Parameter>
    {
        new IBM.Data.DB2.iSeries.iDB2Parameter("NameDoesNotMatter","AAA"),
        new IBM.Data.DB2.iSeries.iDB2Parameter("NameDoesNotMatter","TEST555"),
        new IBM.Data.DB2.iSeries.iDB2Parameter("NameDoesNotMatter", 1240129),
    };
    var conn = new IBM.Data.DB2.iSeries.iDB2Connection(connectionString);
    conn.Open();
    var transaction = conn.BeginTransaction();
    var command = new IBM.Data.DB2.iSeries.iDB2Command(sql, conn, transaction);
    command.SetParameters(parameters);
    var rc = command.ExecuteNonQuery();
    command.Dispose();
}
catch (IBM.Data.DB2.iSeries.iDB2SQLErrorException e)
{
    //e.ToString() returns "SQL0901 SQL system error.".
    Console.WriteLine(e);
    throw;
}

更新:尝试运行它然后检查作业日志,这是结果消息:

SQL system error.
Trigger error.
153 - CALL PGM(QMHSNDPM) /* The CALL command contains paramsters */
Error found on CALL command.
Program AMZTRG3R in library %LIBL not found.
122 - CALL PGM(AMZTRGRR) /* The CALL command contains paramsters */
112 - CHDTAARA DTAARA(ZTRIGCOMM (1 10)) VALUE('*ALL     ')
Data area ZTRIGCOMM created in library QTEMP.
110 CRTDTAARA DTAARA(QTEMP/ZTRIGCOMM) TYPE (*CHAR) LEN(1024)
Data area ZTRIGCOMM created in *LIBL not found.
108 - RTVDTAARA DTAARA(ZTRIGCOMM (1 10)) RTNVAR(&TRGSRC)
107 - RTVDTAARA DTAARA(*LDA *ALL) RTNVAR(&LDA)

因此,当更新表时,触发器会尝试调用使用库列表的 RPG 程序...而我无法删除该触发器...除了保留库列表之外,是否没有其他方法可以解决此问题在连接字符串中?

c# exception db2 connection-string ibm-midrange
1个回答
0
投票

在不确切知道异常是什么的情况下,我猜测表上附加了一个触发器,并且触发器本身或它调用的某些代码正在使用库列表。

在调试中运行代码并在异常发生后检查 IBM i 作业的作业日志应该提供更多信息。

编辑

是的,看起来这是一个触发错误...问题变成了我做什么, 然后...我无法删除触发器。有没有办法添加一个 库列表到连接字符串?

简短的回答,在执行插入之前,您需要设置正确的库列表,以便触发器正常工作。您可以在连接字符串上执行此操作,或者例如通过添加调用来预先设置它。

问题是您认为为什么不想在连接字符串中这样做? (你的答案可能是一个新的SO问题)

© www.soinside.com 2019 - 2024. All rights reserved.