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 并手动进行转换......
在稍后阶段开始使用数据库供应商的驱动程序解决了我最初的问题
我正在连接到本地 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 并手动进行转换...... 在稍后阶段开始使用数据库供应商的驱动程序解决了我最初的问题