【问题标题】:Mirth Database Reader failed to process row retrieved from the database in channel (index out of range)?Mirth Database Reader 无法处理从通道中的数据库检索到的行(索引超出范围)?
【发布时间】:2025-12-03 03:05:02
【问题描述】:

我有一个 Mirth (v3.10) Database Reader 通道源,它使用查询获取一些测试记录(来自 SQL Server 源)...

select * 
  from [mydb].[dbo].[lab_test_MIRTHTEST_001]
  where orc_2_1_placer_order_number 
  in (
  'testid_001', 'testid_002', 'testid_003'
  )

即使通道似乎运行正常并且消息正在写入通道目标,但在部署通道时,我在仪表板的服务器日志中看到 SQL 错误:

[2020-12-16 08:16:28,266]  ERROR  (com.mirth.connect.connectors.jdbc.DatabaseReceiver:268): Failed to process row retrieved from the database in channel "MSSQL2SFTP_TEST"
com.mirth.connect.connectors.jdbc.DatabaseReceiverException: com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range.
    at com.mirth.connect.connectors.jdbc.DatabaseReceiverQuery.runPostProcess(DatabaseReceiverQuery.java:233)
    at com.mirth.connect.connectors.jdbc.DatabaseReceiver.processRecord(DatabaseReceiver.java:260)
    ...

我可以在 SQL Server Mgmt Studio 本身中很好地运行此查询(并且消息似乎可以正常传输),因此不确定为什么会弹出此错误,但我担心我在这里遗漏了一些东西。

有更多经验的人知道这里发生了什么吗?如何解决?

【问题讨论】:

    标签: mirth


    【解决方案1】:

    问题似乎出在数据库读取器的后处理 SQL 部分,因此消息似乎正常工作是有道理的。

    您是否打算启用源选项卡底部的后期处理部分?

    【讨论】:

    • 有趣的收获。没有注意到堆栈跟踪行中的runPostProcess(...)。在出现错误时,我相信我将 PostProcess 逻辑设置为“在每条消息之后”,但只在文本框中注释了 sql 代码。这会是个问题吗(我认为不会)?
    • 如果不进行测试,我无法确定,但如果您告诉它在处理完每条消息后执行更新,然后不给它声明执行。
    【解决方案2】:

    请分享您用于处理结果集中数据的代码。同时,您可以将下面的代码视为起点。您可以将其放在频道源连接器中的 Javascript 转换器步骤中。

    //Declaring variables to hold column values returned from the result set
    var variable1;
    var variable2;
    
    //defining the sql read command
    var  Query = "select * from [mydb].[dbo].[lab_test_MIRTHTEST_001]";
    Query += " where orc_2_1_placer_order_number in";
    Query += " ('testid_001', 'testid_002', 'testid_003')";
    
    var result = dbconn.executeCachedQuery(Query);  
    //where dbconn is your database connection string
    
    //looping through the results
    while(result.next())
    {
        
    variable1=result.getString("variable1");
    variable2 = result.getString("variable2");
        
    }
    
    //optionally place the returned values in a channel map for use later
    $c('variable1',variable1);
    $c('variable2',variable2);
    

    【讨论】: