连接到安装了单声道的 Informix DB 时出现 ODBC 错误

Posted

技术标签:

【中文标题】连接到安装了单声道的 Informix DB 时出现 ODBC 错误【英文标题】:ODBC error when connecting to Informix DB with mono installed 【发布时间】:2010-09-15 08:21:28 【问题描述】:

我最近在我们的 Fedora Linux 系统上安装了 Mono,以便我们能够在其上运行 ASP.NET 应用程序。我能够启动并运行这部分,但问题是我们使用 Informix DB,而 Mono 似乎阻止了 ODBC 工作。

有没有人有过让 ODBC 连接到安装了 Mono 的 Informix DB 的经验?

我们有:

IBM Informix-ESQL 版本 3.50.UC7 unixODBC 2.2.14 Informix SE 版本 7.25.UC6R1 单声道版本 2.6.7。 CSDK 版本为“IBM Informix CSDK 版本 3.50,IBM Informix-ESQL 版本 3.50.UC7”

任何帮助将不胜感激。

这是完整的跟踪:


ppid=00003564,pid=00000000         ENTER SQLSetEnvAttr
        SQLHENV       0x087489C8
        SQLINTEGER    200
        SQLPOINTER    0x00000003
        SQLINTEGER    0

ppid=00003564,pid=00000000         EXIT SQLSetEnvAttr
        SQLHENV       0x087489C8
        SQLINTEGER    200
        SQLPOINTER    0x00000003
        SQLINTEGER    0 with return code 0 (SQL_SUCCESS)

ppid=00003564,pid=00000000         ENTER SQLGetEnvAttr
        SQLHENV       0x087489C8
        SQLINTEGER    200
        SQLPOINTER    0xBFBF84F0
        SQLINTEGER    0
        SQLINTEGER *  0x04D05CA0

ppid=00003564,pid=00000000         EXIT SQLGetEnvAttr
        SQLHENV       0x087489C8
        SQLINTEGER    200
        SQLPOINTER    0xBFBF84F0
        SQLINTEGER    0
        SQLINTEGER *  0x04D05CA0 with return code 0 (SQL_SUCCESS)

ppid=00003564,pid=00000000         ENTER SQLAllocHandle
        SQLSMALLINT            2
        SQLHANDLE       0x087489c8
        SQLHANDLE *     0x0874c4c8

ppid=00003564,pid=00000000         EXIT SQLAllocHandle
        SQLSMALLINT            2
        SQLHANDLE       0x087489c8
        SQLHANDLE *     0x0874c4c8 with return code 0 (SQL_SUCCESS)

ppid=00003564,pid=00000000         ENTER SQLSetConnectAttrW
        SQLHDBC       0x08758F88
        SQLINTEGER    115
        SQLPOINTER    0x04D05CA0
        SQLINTEGER    0
        SQLINTEGER *  0x00000000

ppid=00003564,pid=00000000         EXIT SQLSetConnectAttrW
        SQLHDBC       0x08758F88
        SQLINTEGER    115
        SQLPOINTER    0x04D05CA0
        SQLINTEGER    0
        SQLINTEGER *  0x00000000 with return code -1 (SQL_ERROR)

ppid=00003564,pid=00000000         ENTER SQLConnectW
        SQLHDBC         0x08758F88
        SQLWCHAR        i
        SQLSMALLINT     -3
        SQLWCHAR *       *****
        SQLSMALLINT     -3
        SQLWCHAR *       *****
        SQLSMALLINT     -3
ppid=00003564,pid=00000000         EXIT SQLConnectW
        SQLHDBC         0x08758F88
        SQLWCHAR        i
        SQLSMALLINT     -3
        SQLWCHAR *       *****
        SQLSMALLINT     -3
        SQLWCHAR *       *****
        SQLSMALLINT     -3 with return code -1 (SQL_ERROR)

ppid=00003564,pid=00000000         ENTER SQLGetDiagRecW
        ,SQLSMALLINT     2
        SQLHANDLE       0x08758F88
        SQLSMALLINT     1
        SQLWCHAR *       ^R
        SQLINTEGER *    0xBFBF96E0
        SQLWCHAR *       ~B
        SQLSMALLINT     1026
        SQLSMALLINT *   0xBFBF96EA

ppid=00003564,pid=00000000         EXIT SQLGetDiagRecW
        ,SQLSMALLINT     2
        SQLHANDLE       0x08758F88
        SQLSMALLINT     1
        SQLWCHAR *       I
        SQLINTEGER *    0xBFBF96E0
        SQLWCHAR *       [
        SQLSMALLINT     1026
        SQLSMALLINT *   0xBFBF96EA with return code 0 (SQL_SUCCESS)

ppid=00003564,pid=00000000         ENTER SQLGetDiagRecW
        ,SQLSMALLINT     2
        SQLHANDLE       0x08758F88
        SQLSMALLINT     2
        SQLWCHAR *       I
        SQLINTEGER *    0xBFBF96E0
        SQLWCHAR *       [
        SQLSMALLINT     1026
        SQLSMALLINT *   0xBFBF96EA

ppid=00003564,pid=00000000         EXIT SQLGetDiagRecW
        ,SQLSMALLINT     2
        SQLHANDLE       0x08758F88
        SQLSMALLINT     2
        SQLWCHAR *       I
        SQLINTEGER *    0xBFBF96E0
        SQLWCHAR *       [
        SQLSMALLINT     1026
        SQLSMALLINT *   0xBFBF96EA with return code 100 (SQL_NO_DATA_FOUND)

ppid=00003564,pid=00000000         ENTER SQLFreeHandle
        SQLSMALLINT            2
        SQLHANDLE       0x08758f88

ppid=00003564,pid=00000000         EXIT SQLFreeHandle
        SQLSMALLINT            2
        SQLHANDLE       0x00000000 with return code 0 (SQL_SUCCESS)

ppid=00003564,pid=00000000         ENTER SQLFreeHandle
        SQLSMALLINT            1
        SQLHANDLE       0x087489c8

ppid=00003564,pid=00000000         EXIT SQLFreeHandle
        SQLSMALLINT            1
        SQLHANDLE       0x00000000 with return code 0 (SQL_SUCCESS)

当我在 Mono 之外运行它时,连接非常相似,除了 EXIT SQLConnectW 给了 -3 with return code 0 (SQL_SUCCESS)

【问题讨论】:

您是否尝试过从其他 ODBC 工具(如 unixODBC)连接 Informix? Mono 显示什么错误? 您使用的是哪个版本的 Informix ODBC 驱动程序?或者您使用的是哪个版本的 Informix CSDK?我确实在使用稍旧版本的 ODBC 的 Mono 环境中遇到了 Unicode 转换问题;它已在 ODBC 的最新版本中得到修复。但我必须查找错误编号等。 您好,感谢您的回复。我们正在运行 unixODBC 2.2.14 和 Informix SE 版本 7.25.UC6R1。我们安装了 Mono 2.6.7 版。 嗨,我可以说我们可以使用 php 和 C 连接到 ODBC,但不能使用 Mono。我没有收到正确的错误,就好像这是一个 Unicode 问题。当我输出错误时,我只得到 'Error:ERROR [I000] [unixODBC][' 弗兰基,我不知道出了什么问题。您可以尝试使用SQLIDEBUG 跟踪它,也许在此跟踪中会有一些错误描述? 【参考方案1】:

虽然只有 Mono 有问题,但您可以尝试跟踪它。启用 ODBC 跟踪(一旦我在 Linux 上遇到问题,但 Informix 文档中出现错误,请参阅:Tracing ODBC calls for Informix Client for Linux)。

isql 跟踪 Informix 客户端并保存跟踪文件,然后从 Mono 跟踪它并比较两个跟踪。在 Mono 跟踪中应该有更多关于发生了什么的信息。

Jonathan 要求您检查是否使用最新的 CSDK 库,向我们展示您的驱动程序版本。也许您使用 Jonathan 所说的存在 Unicode 错误的旧驱动程序,您应该升级驱动程序?

【讨论】:

您好,感谢您的回复,CSK 版本是“IBM Informix CSDK 版本 3.50,IBM Informix-ESQL 版本 3.50.UC7”。

以上是关于连接到安装了单声道的 Informix DB 时出现 ODBC 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AWS Lambda Python 连接到 Informix DB

使用 .NET 连接到 Informix

在 Windows 上使用 pyodbc 连接到 Informix

从 Windows 通过 Entity Framework 连接到 Informix 的问题

为啥在 Robot Framework IDE (RIDE) 中使用 pymssql 连接到 db 时出现错误?

无法通过php连接到informix数据库