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



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

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

我正在尝试按照本指南在 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">
  • 错误消息是

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

  • 使用count(*)会产生 0,所以 Unity 似乎看不到表中的数据?

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

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

这个问题很难解决,因为

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

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

希望这可以帮助其他可能不熟悉数据库浏览器并偶然发现此错误的人!

最新更新