2016-07-27 2 views
1

Ich arbeite an Datenzugriff in einem Unity 3D-Projekt, das eine Verbindung zu einer lokalen DB2-Datenbank herstellt. Ich habe ein kleines Testprojekt, das gut funktionierte, als die Spalten CHAR waren, aber nachdem ich sie in VARCHAR geändert habe, erhalte ich nun Index-außerhalb-Bereich-Ausnahmen. Noch interessanter scheint dies nur bei der Ausführung über den Unity 3D-Editor zu sein, da mein EXE-Build dieses Problem nicht aufweist.DB2 C# OdbcDataReadder-Index liegt außerhalb des Bereichs von Varchar-Spalten

Das Projekt ist ziemlich einfach und ich kann nicht herausfinden, warum es gerade mit VARCHAR-Säulen passiert. Wir haben System.Data.dll und System.EnterpriseServices. Unity verwendet .NET 2.0, also frage ich mich, ob das Problem dort liegt, aber ich kann nichts finden, das es unterstützt.

Code:

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) 
      ); 

    } 
} 

Tabellenstruktur:

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-Projekt: https://github.com/Naphier/Unity-ODBC-to-IBM-DB2-Example Veröffentlichung v1.0 sollte ausreichen, aber Sie können das Projekt dort erkunden, wenn Sie mögen.

Alle Einsichten sind willkommen!

Antwort

1

Ich hatte vor einiger Zeit ähnliche Probleme mit DB2, aber ich habe OLEDB und nicht ODBC verwendet, es stellte sich heraus, dass das System.Data nicht alle Eigenschaften korrekt für ein bestimmtes Feld liest, dieses Problem besteht auch beim Herstellen einer Verbindung für Oracle, für mich war die Lösung GetValue zu verwenden und das Casting manuell zu tun ... zu einem späteren Zeitpunkt ist Start mit den Treibern der Datenbank Lieferanten, was mein erstes Problem gelöst

+0

Danke, klang wie eine gute Lösung. Also habe ich stattdessen GetValue ausprobiert und sie in Strings umgewandelt. Immer noch bekomme ich einen Argument-Index außerhalb des Array-Bereichs Ausnahme für die Spalte, die ein Varchar ist. Alle anderen Spaltenwerte kommen gut durch. Versuchte einen 'varchar for bit data'-Typ und verursachte einen Speicherleck o.O – naphier

+0

Wir würden natürlich lieber herstellerspezifische Treiber vermeiden, da sonst der Sinn von ODBC;) Jedenfalls danke fürs ausprobieren! – naphier

Verwandte Themen