2016-07-27 9 views
1

私はローカルの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のは十分ですが、あなたが好きなら、あなたがそこにプロジェクトを探索することができます。

洞察力がありがとうございます。

答えて

1

私は以前にもDB2と同様の問題がありましたが、ODBCではなくOLEDBを使用していましたが、System.Dataが特定のフィールドのすべてのプロパティを正しく読み取っていないことが判明しました。私にとっては解決策はGetValueを使用して手動でキャストを行うことでした... は後の段階でデータベースサプライヤのドライバを使用して起動します。

+0

ありがとうございます。だから、代わりにGetValueを試して文字列にキャストしました。まだ私は、引数のインデックスは、varcharの列の配列の範囲の例外を取得します。他の列の値はすべて正常に機能します。 'ビットデータ型のためのvarchar'を試して、メモリリークを引き起こしましたo.O – naphier

+0

もちろん、ベンダー固有のドライバを避ける方がいいでしょう。 – naphier

関連する問題