2016-03-29 26 views
2

私はUnityでSQLiteを使用しており、起動画面でゲームによって生成されたテーブルからデータを読み込む際に問題が発生しています。私は何の誤りもなく、私の "reader.HasRows"呼び出しが真実に戻ってきます。しかし、DataTableにデータをロードしようとすると、何も得られません。私は以前にC#でSQLiteを使用していましたが、そのコードを参考にしていますが、以前はこのような問題は一度もありませんでした。DataTable.Load()は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(); 
} 

else文は、読者は間違いなく何かを取得しますので、解雇されることはありません。私はここで紛失している、私はデータベース(s3db、sqlite、sqlite3)の複数のフォーマットを試したが、すべて同じ結果を持っています。私もエラーはありません。

EDIT

Application.dataPathがルートプロジェクトフォルダを参照し、私はデータベースやテーブルを生成するためにそれを使用するだけでなく、私はそれが正しいデータベースを照会していることを知って、それを参照し、Iテーブルを持たないデータベースを作成してエラーが発生したため、データベースにアクセスしていることがわかりました。

Scores.Load()は読み込まれたDataTableのメソッドで、リーダーから返されたデータを入力します。

したがって、whileループは適切な時間が経過しているように見えますが、何も返されません。データベースから出てくるデータのタイプを管理する必要がありますか?

+0

Application.dataPathの値とは何ですか?正しいデータベースを照会しているかどうか確認しましたか? – Steve

+0

パスとファイル名を組み合わせる場合は、Path.Combine()を使用します。これは、[欠落している可能性のある]バックスラッシュを処理します。 – djv

+1

私はあなたのScores.Loadメソッドを見なければならないと思います。また、if文をデバッグするときに何が表示されますか?行を簡単に覗くことができます。これにより、レコードを正しく取得するかどうかを確かめることができます。 –

答えて

1

あなたはあなたのデータレディにReadを呼び出すことを忘れていると思います。最初の行を読み取る前にカーソルが最初にあります。 Readerが前方移動のみのオブジェクトであるため、whileループを実行してすべての行を処理してみてください。

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

参考:

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

EDIT

データアダプタ試してみて、それが良く振る舞うか、間違っているものに、あなたに別の手がかりを与えるかどうかを確認します。鉱山除き

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

ちょうどこれを試して、それは一度ループを通過し、何も返されませんでした、テーブルに3つのエントリがあります。 – geolaw

+0

ループを実行しているときに、ブレークポイントを設定し、リーダー内のデータを調べましたか?たとえば、最初のループは有効な行ですか? –

+0

また、datareaderを実行する代わりに、dataadapterに切り替えることができます。これは、Load関数をサポートします。 –

1

私は同様の問題を抱えていた、

は、何らかの理由でデータテーブルは、単にそれが負ったすべての行を受け取っていなかったということでした。

SqlLiteのためのDataTableを埋めるための適切な方法があるように思わ:

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(); 
関連する問題