【问题标题】:How to Call DB2 Table Valued Function from EF Core如何从 EF Core 调用 DB2 表值函数
【发布时间】:2020-10-17 11:48:37
【问题描述】:

我正在使用带有 EF Core 的 ASP.NET Core 3.1 和 DB2 AS400 数据库。我创建了一个看起来像这样的表值函数

CREATE FUNCTION ABELIBLE.TVFBOEGETSHIPMENTS ( 
    STARTDATE DATE , 
    ENDDATE DATE , 
    ADDRESSCODE CHAR(9) ) 
    RETURNS TABLE ( 
    "ID" INTEGER , 
    JOBNUMBER CHAR(9) , 
    CUSTOMERREFERENCE CHAR(18) , 
    CONSIGNEENAME CHAR(30) , 
    CREATEDDATE DATE , 
    AIRPORTOFORIGIN CHAR(3) , 
    AIRPORTOFARRIVAL CHAR(3) , 
    AIRPORTOFDESTINATION CHAR(3) , 
    COUNTRYOFDESTINATION CHAR(3) , 
    ADDRESSCODE CHAR(9) , 
    CONSIGNMENTNUMBER CHAR(25) )   
    LANGUAGE SQL 
    SPECIFIC ABELIBLE.TVFBOEGETSHIPMENTS 
    NOT DETERMINISTIC 
    READS SQL DATA 
    CALLED ON NULL INPUT 
    SET OPTION  ALWBLK = *ALLREAD , 
    ALWCPYDTA = *OPTIMIZE , 
    COMMIT = *NONE , 
    DECRESULT = (31, 31, 00) , 
    DYNDFTCOL = *NO , 
    DYNUSRPRF = *USER , 
    SRTSEQ = *HEX   
    RETURN 
        SELECT 
                ROW_NUMBER ( ) OVER ( ORDER BY EMJOBN DESC ) , 
                A . EMJOBN , 
                A . EMCREF , 
                A . EMOSNM , 
                DATE ( TIMESTAMP_FORMAT ( DIGITS ( A . EMCRTD ) , 'DDMMYY' ) ) , 
                A . EMAOFO , 
                A . EMAOFA , 
                A . EMAOFD , 
                A . EMCOFD , 
                A . EMUKCD , 
                A . EMRPRT 
                FROM DTALIBLE . EMASTER A WHERE A . EMPSFT = 'Y' AND A . EMUKCD = ADDRESSCODE AND 
                ( DATE ( TIMESTAMP_FORMAT ( DIGITS ( A . EMCRTD ) , 'DDMMYY' ) ) >= STARTDATE AND DATE ( TIMESTAMP_FORMAT ( DIGITS ( A . EMCRTD ) , 'DDMMYY' ) ) <= ENDDATE )  ; 

我可以使用这个语句在 DBeaver 中得到这个函数的结果

SELECT * FROM TABLE(ABELIBLE.TVFBOEGETSHIPMENTS('2020-05-27', '2020-05-27','MUL0044'))

但是我无法从 EF Core 调用函数。我的调用代码如下所示:

这是我得到的错误:

非常感谢任何帮助。

【问题讨论】:

    标签: c# sql entity-framework-core db2


    【解决方案1】:

    请不要使用包含纯文本的图像。原因是图片内容不可搜索,图片难以引用/引用。

    相反,只需将您的代码或错误消息的纯文本复制到您的问题中即可。

    您的第一张图片显示您在代码中的查询(语法不正确)与提供给 DBeaver 的查询(语法正确)不同。先解决这个问题。

    Db2 服务器通过抛出 SQL0104N 拒绝您的错误语法。您可以在Db2-for-i knowledge center 中查找这些代码。如果您花时间研究这些解释,它们通常会有所帮助。

    【讨论】:

    • 谢谢,但我已经按照 DBeaver 尝试了该语句,并且我得到了身份不明的令牌“(”,因此我修改了该语句。
    【解决方案2】:

    想通了。下面的工作与语句的格式有关。

    string sql = "SELECT * FROM TABLE ( ABELIBLE.TVFBOEGETSHIPMENTS ( '2020-05-27', '2020-05-27','MUL0044' ) )";
                var Shipments = _appDbContext.Shipments.FromSql(sql);
                return Shipments;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多