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

时间:2016-07-27 19:36:10

标签: c# unity3d db2 indexoutofrangeexception

我正在连接到本地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)
            );

    }
}

表格结构:

 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应该足够了,但如果你愿意,可以在那里探索项目。

任何见解都表示赞赏!

1 个答案:

答案 0 :(得分:1)

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