SqlDataReader的Read()函数返回空行,同一查询从数据库浏览器返回值

问题描述 投票:-2回答:1

我在SQLite中有一个表,具有以下结构:

+-------+------+------+
| id    |name  |value |
|int    |text  |int   |
+-------+------+------+

我试图跟随this guide在Unity中使用sqlite数据库。我能够使用以下代码查询sqlite_master表以检索唯一的数据库表名:

    _dbConnection = (IDbConnection)new SqliteConnection(_dbURI);
    _dbConnection.Open();
    string sqlStatement = "SELECT name FROM sqlite_master WHERE type='table' AND name='" + tableName + "';";
    _dbCommand = _dbConnection.CreateCommand();
    _dbCommand.CommandText = sqlStatement;
    _dbReader = _dbCommand.ExecuteReader();
    while (_dbReader.Read())
    {
        Debug.Log("Table: " + _dbReader.GetString(0));
    }

但是,当我尝试从表本身查询以使用类似代码获取最大ID时,我的DataReader返回一个空行:

    _dbConnection = (IDbConnection)new SqliteConnection(_dbURI);
    _dbConnection.Open();
    string sqlStatement = "SELECT max(id) FROM " + tableName + ";";
    _dbCommand = _dbConnection.CreateCommand();
    _dbCommand.CommandText = sqlStatement;
    _dbReader = _dbCommand.ExecuteReader();
    while (_dbReader.Read())
    {
        Debug.Log("MaxId = " + _dbReader.GetInt32(0));
    }

null调用_dbReader.GetInt32(0)会导致转换错误。当我将sql语句写入日志并将其粘贴到我的数据库浏览器中时,它产生一个数字,因此查询应返回一个值。

在查询sqlite_master而不是我的其他表时,我不清楚为什么类似的代码有效。

我也尝试过ExecuteScalar没有成功。

谢谢!

编辑:

  • tableName等于“unit_def”
  • 错误信息是

InvalidCastException:无法从源类型转换为目标类型。 Mono.Data.Sqlite.SqliteDataReader.VerifyType(Int32 i,DbType typ)

  • 使用count(*)产生一个0,所以看来统一看不到表中的数据?

另外,奇怪的是,由于某种原因,更改代码会弄乱编辑器中的GUI元素。

c# sqlite unity3d datareader
1个回答
0
投票

我解决了这个问题,希望这个答案对其他人有帮助:

从那以后,这个问题很难解决

  • 正在引用正确的数据库
  • 所有代码都是正确的
  • 在我的数据库浏览器中运行时,sql查询确实返回了一个结果

问题是我使用的是Sqlite的数据库浏览器,我是新手。我已经将数据行写入数据库,以便我的查询将在浏览器中返回结果,但显然这些更改不会写入数据库文件以供其他应用程序查看,直到按下“Write Changes”按钮。

希望这可以帮助其他任何可能不熟悉db浏览器的人并且偶然发现这个错误!

© www.soinside.com 2019 - 2024. All rights reserved.