2016-03-29 5 views
2

Ich arbeite mit SQLite in Unity und habe Probleme beim Laden von Daten aus einer Tabelle, die ich vom Spiel am Startbildschirm erzeugt habe. Ich bekomme keine Fehler und mein "reader.HasRows" Aufruf kommt wieder wahr. Wenn ich jedoch versuche, die Daten in eine DataTable zu laden, bekomme ich nichts. Ich habe SQLite bereits mit C# verwendet und verwende diesen Code als Referenz, aber ich hatte noch nie solche Probleme.DataTable.Load() bekomme keine Daten von ExecuteReader()

ScoreControl.cs:

using (SqliteConnection dbCon = new SqliteConnection("Data Source=" + Application.dataPath + "MainScoreDB.sqlite3")) 
{ 
    if (dbCon.State != ConnectionState.Open) 
     dbCon.Open(); 
    string query = "SELECT * FROM highscores"; 

    SqliteCommand command = new SqliteCommand(query, dbCon); 
    SqliteDataReader reader = command.ExecuteReader(); 

    if(reader.HasRows) 
    { 
     Scores.Load(reader); 
    } 
    else 
    { 
     Debug.Log("No Data was Returned"); 
    } 


    if (dbCon.State == ConnectionState.Open) 
     dbCon.Close(); 
} 

Die Aussage sonst nie gebrannt, um auf jeden Fall Leser etwas bekommt. Ich bin hier ratlos, ich habe mehrere Formate der Datenbank (s3db, sqlite, sqlite3) ausprobiert, aber alle haben das gleiche Ergebnis. Ich bekomme auch keine Fehler.

EDIT

Die Application.dataPath zum Stammordner des Projektes bezieht, ich es verwenden, um die Datenbank und die Tabelle zu erzeugen, sowie Referenzierung es so weiß ich, dass es die richtige Datenbank abfragt, I habe auch eine Datenbank ohne die Tabelle darin gemacht und einen Fehler bekommen, also weiß ich, dass es auf die Datenbank zugreift.

Scores.Load() ist eine Methode in der DataTable, die es lädt die Daten aus dem Leser eingegeben.

So scheint es, dass die while-Schleife die richtige Anzahl von Malen durchläuft, aber es gibt nichts zurück. Muss ich die Art der Daten, die aus der Datenbank kommen, überhaupt verwalten?

+0

Was ist der Wert? Haben Sie überprüft, ob Sie die richtige Datenbank abfragen? – Steve

+0

Wenn Sie einen Pfad mit einem Dateinamen kombinieren, verwenden Sie Path.Combine(). Es wird um etwaige [möglicherweise fehlende] Backslashes kümmern. – djv

+1

Ich denke, wir müssen Ihre Scores.Load-Methode sehen, weil andere hier in Ordnung scheint. Was sehen Sie, wenn Sie eine if-Anweisung debuggen? Sie könnten leicht die Zeilen sehen, die Sie sicher machen würden, wenn Sie die Datensätze korrekt abrufen. –

Antwort

1

Ich glaube, Sie vergessen zu lesen auf Ihrem Datenreader aufrufen. Der Cursor befindet sich am Anfang, bevor die erste Zeile gelesen wird. Probieren Sie eine while-Schleife aus, um alle Zeilen zu durchlaufen, da ein Reader ein nur vorwärts bewegtes Objekt ist.

if (reader.HasRows) 
{  
    while (reader.Read())  
    { 
     // Load each row 1 at a time here  
    } 
} 

Referenz:

https://www.devart.com/dotconnect/sqlite/docs/Devart.Data.SQLite~Devart.Data.SQLite.SQLiteDataReader~HasRows.html

EDIT

Geben Sie dem Datenadapter ausprobieren und sehen, ob es besser verhält oder gibt Ihnen einen weiteren Hinweis auf das, was falsch ist.

SQLiteDataAdapter da = new SQLiteDataAdapter(dbCommand); 
da.Fill(scores); 
+0

Probieren Sie es aus, es ging einmal durch die Schleife und dann nichts zurück, es gibt 3 Einträge in der Tabelle. – geolaw

+0

haben Sie einen Haltepunkt gesetzt und überprüft, welche Daten sich während des Loops im Reader befinden? Zum Beispiel ist die erste Schleife eine gültige Zeile? –

+0

Anstelle eines Datenreaders können Sie auch zu einem Datenadapter wechseln, der eine Load-Funktion unterstützt. –

1

ich wurde, war

Außer Mine ein ähnliches Problem haben, dass die Datatable einfach aus irgendeinem Grund nicht alle Zeilen erhielt er schuldig war.

Der richtige Weg, um eine Datentabelle für SqlLite zu füllen scheint zu sein: für Application.dataPath

DataTable dt = new DataTable(); 
SQLiteConnection cnn = new SQLiteConnection(dbConnection); 
cnn.Open(); 
SQLiteCommand mycommand = new SQLiteCommand(cnn); 
mycommand.CommandText = sql; 
SQLiteDataAdapter adapter = new SQLiteDataAdapter(mycommand); 
adapter.Fill(dt); 
cnn.Close(); 
Verwandte Themen