【问题标题】:DataTable.Load() not getting data from ExecuteReader()DataTable.Load() 未从 ExecuteReader() 获取数据
【发布时间】:2016-03-29 19:36:11
【问题描述】:

我在 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 循环经过了正确的次数,但它没有返回任何内容。我是否需要管理来自数据库的数据类型?

【问题讨论】:

  • Application.dataPath 的值是多少?你检查你是否正在查询正确的数据库?
  • 将路径与文件名组合时,使用 Path.Combine()。它将处理任何 [可能丢失的] 反斜杠。
  • 我认为我们需要查看您的 Scores.Load 方法,因为这里的其他方法似乎很好。另外,当您调试 if 语句时,您会看到什么?您可以轻松查看行,这将确定您是否正确获取记录。
  • 作为旁注,您将包装在 using 中,因此您无需输入 dbCon.Close() - 这将自动发生;也不需要一开始就检查 - 它不会打开。
  • 我假设 Scores 是一个数据表,因此 Scores.Load(reader) 使用阅读器加载数据表....

标签: c# unity3d sqlite mono


【解决方案1】:

我认为您忘记在数据读取器上调用 Read。光标位于读取第一行之前的开头。尝试做一个 while 循环来遍历所有行,因为 Reader 是一个仅向前移动的对象。

 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

编辑

试一试数据适配器,看看它是否表现得更好,或者给你另一个线索来找出问题所在。

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

【讨论】:

  • 刚试了一下,循环了一次,然后什么也没返回,表中有3个条目。
  • 您是否设置了断点并在循环时检查了阅读器中的数据?例如,第一个循环是有效行吗?
  • 另外,您可以切换到支持加载功能的数据适配器,而不是使用数据读取器。
  • 循环不是一个有效的行,我正在调查它可能是一个空的插入行,正如您在上面的评论中提到的那样
【解决方案2】:

我遇到了类似的问题,

除了我的是,由于某种原因,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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2017-05-05
    相关资源
    最近更新 更多