我在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元素。
我解决了这个问题,希望这个答案对其他人有帮助:
从那以后,这个问题很难解决
问题是我使用的是Sqlite的数据库浏览器,我是新手。我已经将数据行写入数据库,以便我的查询将在浏览器中返回结果,但显然这些更改不会写入数据库文件以供其他应用程序查看,直到按下“Write Changes”按钮。
希望这可以帮助其他任何可能不熟悉db浏览器的人并且偶然发现这个错误!