私はローカルのDB2データベースに接続しているUnity 3Dプロジェクトのデータアクセスに取り組んでいます。私は列がCHARのときにうまく動作していた小さなテストプロジェクトを持っていますが、それらをVARCHARに変更した後、インデックスから範囲外の例外を取得します。さらに興味深いことに、これは、Unity 3Dエディタで実行しているときにEXEビルドにこの問題がない場合にのみ発生するようです。DB2 C#OdbcDataReadderのインデックスがvarcharカラムの範囲外にあります
このプロジェクトはかなり基本的なもので、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のは十分ですが、あなたが好きなら、あなたがそこにプロジェクトを探索することができます。
洞察力がありがとうございます。
ありがとうございます。だから、代わりにGetValueを試して文字列にキャストしました。まだ私は、引数のインデックスは、varcharの列の配列の範囲の例外を取得します。他の列の値はすべて正常に機能します。 'ビットデータ型のためのvarchar'を試して、メモリリークを引き起こしましたo.O – naphier
もちろん、ベンダー固有のドライバを避ける方がいいでしょう。 – naphier