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

Posted

技术标签:

【中文标题】SqlDataReader 的 Read() 函数返回空行,相同的查询从数据库浏览器返回值【英文标题】:SqlDataReader's Read() function returns empty row, same query returns value from database browser 【发布时间】:2017-12-29 01:28:45 【问题描述】:

我在 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,所以unity好像看不到表中的数据?

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

【问题讨论】:

The null causes a conversion error with the call 请使用确切的异常类型和消息更新您的帖子。 还请附上来自数据库浏览器的查询和结果的屏幕截图。 @mjwills 我添加了一些细节。谢谢! 你的桌子是空的。因此,为什么 max 是 null @mjwills,感谢您提供帮助。正如我所提到的,我在 sqlite 浏览器中复制粘贴相同的 sql,然后返回值 1(只有一行)。不知道我将如何“证明”... 你在查询中的 WHERE 有 'type' 和 'name' 而表的字段是:id、name 和 value。所以你必须把'type'改成'id'。 【参考方案1】:

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

这个问题很难解决,因为

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

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

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

【讨论】:

以上是关于SqlDataReader 的 Read() 函数返回空行,相同的查询从数据库浏览器返回值的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 Read 无效”

SqlDataReader

SqlDataReader

SqlDataReader 按列名获取值(不是序号)

c#中SqlDataReader dr = cmd.ExecuteReader();然后读取dr.read(),用了while循环,就一直循环了

关于sqlDataReader未显示问题