DataTable.Load()没有从ExecuteReader()获取数据

时间:2016-03-29 19:36:11

标签: c# unity3d sqlite mono

我正在使用Unity中的SQLite,并且在从我在开始屏幕上由游戏生成的表中加载数据时出现问题。我没有得到任何错误,我的“reader.HasRows”电话确实回来了。但是,当我尝试将数据加载到DataTable时,我什么也得不到。我以前使用SQLite和C#并使用该代码作为参考,但我之前从未遇到过这样的问题。

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),但都有相同的结果。我也没有错误。

修改

Application.dataPath引用根项目文件夹,我用它来生成数据库和表,以及引用它所以我知道它正在查询正确的数据库,我还创建了一个没有表的数据库在它,并得到一个错误,所以我知道它正在访问数据库。

Scores.Load()是它加载的DataTable中的一个方法,用于输入从阅读器返回的数据。

因此看起来while循环经历了适当的次数,但它没有返回任何东西。我是否需要管理数据库中出现的数据类型?

2 个答案:

答案 0 :(得分:1)

我认为您忘记在您的datareader上调用Read。在读取第一行之前,光标处于开始状态。尝试执行while循环以遍历所有行,因为Reader是仅向前移动的对象。

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

参考:

Java Multithread Access Static Variable

修改

尝试使用数据适配器,看看它是否表现得更好,或者为您提供了另一个错误的线索。

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

答案 1 :(得分:1)

我遇到了类似的问题,

除了我之外,由于某种原因,DataTable根本没有收到它所欠的所有行。

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