DB2 C# OdbcDataReadder 索引在 varchar 列上超出范围

DB2 C# OdbcDataReadder index out of range on varchar columns

我正在连接到本地 DB2 数据库的 Unity 3D 项目中进行数据访问。我有一个小型测试项目,当列为 CHAR 时工作正常,但在将它们更改为 VARCHAR 后,我现在得到索引超出范围异常。更有趣的是,这似乎只有在通过 Unity 3D 编辑器 运行 时才会发生,因为我的 EXE 构建没有这个问题。

该项目非常基础,我不明白为什么它似乎只发生在 VARCHAR 列上。我们有 System.Data.dll 和 System.EnterpriseServices。 Unity 使用的是 .NET 2.0,所以我想知道问题是否出在这里,但我找不到任何支持它的东西。

代码:

 public void MakeQuery(string connectionString, string query)
{
    bool failed = false;
    string errorMessage = "";
    if (string.IsNullOrEmpty(connectionString))
    {
        errorMessage = "Connection string cannot be empty\n";
        failed = true;
    }

    if (string.IsNullOrEmpty(query))
    {
        errorMessage += "Query cannot be empty";
        failed = true;
    }

    if (failed)
    {
        ShowResults(errorMessage);
        Debug.LogError(errorMessage);
        return;
    }
    try
    {
        OdbcConnection odbcCon = new OdbcConnection(connectionString);
        odbcCon.Open();

        OdbcCommand command = new OdbcCommand(query, odbcCon);
        StringBuilder sb = new StringBuilder();
        using (OdbcDataReader reader = command.ExecuteReader())
        {
            for (int i = 0; i < reader.FieldCount; i++)
            {
                Debug.LogFormat("i: {0}  field: {1}", i, reader.GetName(i));
                sb.Append(reader.GetName(i));
                if (i < reader.FieldCount - 1)
                    sb.Append(",");
            }

            sb.AppendLine();

            while (reader.Read())
            {
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    try
                    {
                        sb.Append(reader.GetString(i).Trim()); // Index out of bounds on VARCHAR columns only...
                        if (i < reader.FieldCount - 1)
                            sb.Append(",");
                    }
                    catch (Exception e)
                    {
                        Debug.LogErrorFormat("i: {0}  exception: {1}", i, e.Message);
                    }

                }
                sb.AppendLine();

            }

            Debug.Log(sb.ToString());
            ShowResults(sb.ToString());
        }
        odbcCon.Close();
    }
    catch (Exception e)
    {
        Debug.LogException(e);
        ShowResults(
            string.Format(
                "EXCEPTION: {0}\nconnectionString: {1}\nquery: {2}", 
                e.Message,
                connectionString, 
                query)
            );

    }
}

Table结构:

 NAME       COLTYPE     LENGTH
 --------   --------    ------
 PID        INTEGER          4
 X          REAL             4
 Y          REAL             4
 NAME       VARCHAR        256
 ON_ENTER   VARCHAR        256
 TYPE       VARCHAR        256
 VIEW       VARCHAR        256

Github 项目: https://github.com/Naphier/Unity-ODBC-to-IBM-DB2-Example 发布 v1.0 应该足够了,但如果你愿意,你可以在那里探索项目。

如有任何见解,我们将不胜感激!

前段时间我在使用 DB2 时遇到了类似的问题,但我使用的是 OLEDB 而不是 ODBC,结果是 System.Data 没有正确读取给定字段的所有属性,这个问题也是连接到 Oracle 时存在,对我来说解决方案是使用 GetValue 并手动进行转换...... 在稍后阶段开始使用数据库供应商的驱动程序解决了我最初的问题