【发布时间】: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'。
标签: c# sqlite unity3d datareader