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!
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
Wir würden natürlich lieber herstellerspezifische Treiber vermeiden, da sonst der Sinn von ODBC;) Jedenfalls danke fürs ausprobieren! – naphier