我正在连接到本地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应该足够了,但如果你愿意,可以在那里探索项目。
任何见解都表示赞赏!
答案 0 :(得分:1)
我前段时间遇到类似DB2的问题,但是我使用的是OLEDB而不是ODBC,结果是System.Data没有正确读取给定字段的所有属性,连接到这个问题时也存在这个问题Oracle,对我来说解决方案是使用GetValue并手动执行转换... 在稍后阶段开始使用数据库供应商的驱动程序解决了我的初始问题