【问题标题】:Not able to write time stamp value from WebSphere Message Broker to SQL Server 2012 database无法将时间戳值从 WebSphere Message Broker 写入 SQL Server 2012 数据库
【发布时间】:2015-09-09 12:00:01
【问题描述】:

最近我们升级了我们的一个应用程序,作为升级的一部分,数据库也从 SQL Server 2005 升级到 2008。我们使用 WMB 7.0 来处理用于应用程序的传入消息。

代理收到消息后,使用消息流中CURRENT_TIMESTAMP方法返回的值更新db中的列(datetime)。

UPDATE Database.DATABASENAME
SET MODIFIEDDATE = CURRENT_TIMESTAMP

在我们使用 SQL Server 2005 之前,这一切正常,但在使用 SQL Server 2012 时,我们在代理日志中收到此错误:

[IBM][ODBC SQL Server Driver][SQL Server]从字符转换日期和/或时间时转换失败。

在odbc.ini 文件中,我们使用了这个配置:

Driver=/opt/mqsi/ODBC/V6.0/lib/UKmsss24.so
Description=DataDirect 6.0 SQL Server Wire Protocol
Address= ADDRESSOFDB
Database= DATABASENAEM
AnsiNPW=Yes
QEWSD=40117
QuotedId=No
ReportDateTimeType=0

我还尝试在写入 db 之前转换时间戳:

DECLARE timestampChar CHARACTER;
SET timestampChar = CAST (CURRENT_TIMESTAMP AS CHARACTER FORMAT 'yyyy-MM-dd HH:mm:ss.SSS');

UPDATE Database.DATABASENAME
SET MODIFIEDDATE = CAST(timestampChar AS TIMESTAMP FORMAT 'yyyy-MM-dd HH:mm:ss.SSS')

我也试过 passthru :

PASSTHRU ('UPDATE Database.TRANSACTIONINSTALLMENT AS TI
SET UUID =?,
MODIFIEDDATE =?,
WHERE TI.TRANSACTIONID =? AND
TI.INVOLVEMENTNUMBER =? AND
TI.INSTALLMENTNUMBER =?',
techaccount.UUId,
currentTimestampChar,
cTransactionId,
techaccount.Reinsurer_Involvement_Number,
techaccount.Reinsurer_Involvement_Number,
techaccount.TechAccountAmtItem.InstalmentNbr);

但这也会导致同样的错误。请帮助任何人。

【问题讨论】:

    标签: sql-server-2012 ibm-mq messagebroker


    【解决方案1】:

    WMBv7 不支持 SQL Server 2012:请参阅link。更高版本的 WMB 可以。

    此外,对于 2005 年以后的 SQL Server 版本,引入了日期时间的替代方案,您可能需要考虑。

    【讨论】:

    • 感谢您的回答,但我可以从 WMBv7 连接并写入 SQL Server 2012 数据库。
    【解决方案2】:

    您可以尝试使用 PASSTHRU 运行更新,例如:

    PASSTHRU('UPDATE DATABASENAME SET MODIFIEDDATE = ''' || CAST (CURRENT_TIMESTAMP AS CHARACTER FORMAT 'yyyy-MM-dd HH:mm:ss.SSS') || '''')

    我想看看为什么您的 odbc.ini 中有 QEWSD: http://www-01.ibm.com/support/docview.wss?uid=swg21488008

    【讨论】:

    • 更新 Database.TRANSACTIONINSTALLMENT AS TI SET UUID = techaccount.UUId, MODIFIEDDATE = CURRENT_TIMESTAMP WHERE TI.TRANSACTIONID = cTransactionId AND TI.INVOLVEMENTNUMBER = cInvolvementNumber
    • 你能帮我用passthru构造上面的语句吗?另外,作为 passthru 是一个函数,我是否必须返回一个值,如果是,那么在哪里?
    • 这次我使用了 passthru,但得到的是:[IBM][ODBC SQL Server Driver]20136。我已经在上面的问题中使用 passthru 更新了我现在使用的查询。如果有错误请告诉我。
    • 好的,我有一些突破,我尝试将日期直接插入为字符串 UPDATE Database.DATABASENAME SET MODIFIEDDATE = '2015-06-24 07:50:55.000' 并且值在数据库。所以有一点很清楚,代理与 db 的连接没有问题。现在我必须找到一种方法将 CURRENT_DATETIME 转换为字符串。
    【解决方案3】:

    终于解决了。详情如下:

    问题:代理无法在新的 SQL Server 2012 db 中写入时间戳值。

    原因:
    1. Broker 将时间戳作为 datetime 数据类型发送。 2. Broker以YYYY-MM-DD HH:MM:SS.ssssss格式发送时间戳; SQL Server 2012 中的 datetime 数据类型不支持这两者。

    修复:将时间戳转换为字符串并将其格式更改为 YYYY-MM-DD HH:MM:SS.sss。

    铸造和格式化:

    DECLARE timestampChar CHARACTER;
    SET timestampChar = CAST (CURRENT_TIMESTAMP AS CHARACTER FORMAT 'yyyy-MM-dd HH:mm:ss.SSS');
    
    UPDATE Database.DATABASENAME
    SET MODIFIEDDATE = timestampChar;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2020-05-24
      • 2014-01-21
      • 2013-11-04
      相关资源
      最近更新 更多