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 无效”
c#中SqlDataReader dr = cmd.ExecuteReader();然后读取dr.read(),用了while循环,就一直循环了