SqlDataReader 的 Read() 函数 returns 空行,来自数据库浏览器的相同查询 returns 值
SqlDataReader's Read() function returns empty row, same query returns value from database browser
我在 SQLite 中有一个 table 结构如下:
+-------+------+------+
| id |name |value |
|int |text |int |
+-------+------+------+
我正在尝试按照 this guide 在 Unity 中使用 sqlite 数据库。我可以使用以下代码查询 sqlite_master
table 以检索唯一的数据库 table 名称:
_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));
}
但是,当我尝试使用类似代码从 table 本身查询以获取最大 ID 时,我的 DataReader
returns 一个空行:
_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
而不是我的其他 table.
时有效
我也试过 ExecuteScalar
但没有成功。
谢谢!
编辑:
tableName
等于 "unit_def"
- 错误信息是
InvalidCastException: Cannot cast from source type to destination type.
Mono.Data.Sqlite.SqliteDataReader.VerifyType (Int32 i, DbType typ)
- 使用
count(*)
得到0,所以unity好像看不到table? 中的数据
此外,奇怪的是,由于某种原因,更改代码弄乱了我编辑器中的 GUI 元素。
我解决了这个问题,希望这个回答对其他人有帮助:
这个问题很难解决,因为
- 引用了正确的数据库
- 所有代码都是正确的
- 当 运行 在我的数据库浏览器中
时,sql 查询得到了 return 结果
问题是我正在使用 DB Browser for Sqlite,这是我的新手。我已经将数据行写入数据库,以便我的查询在浏览器中得到 return 结果,但显然这些更改不会写入数据库文件供其他应用程序查看,直到按下 "Write Changes" 按钮.
希望这对可能不熟悉 db 浏览器并遇到此错误的其他人有所帮助!
我在 SQLite 中有一个 table 结构如下:
+-------+------+------+
| id |name |value |
|int |text |int |
+-------+------+------+
我正在尝试按照 this guide 在 Unity 中使用 sqlite 数据库。我可以使用以下代码查询 sqlite_master
table 以检索唯一的数据库 table 名称:
_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));
}
但是,当我尝试使用类似代码从 table 本身查询以获取最大 ID 时,我的 DataReader
returns 一个空行:
_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
而不是我的其他 table.
我也试过 ExecuteScalar
但没有成功。
谢谢!
编辑:
tableName
等于 "unit_def"- 错误信息是
InvalidCastException: Cannot cast from source type to destination type. Mono.Data.Sqlite.SqliteDataReader.VerifyType (Int32 i, DbType typ)
- 使用
count(*)
得到0,所以unity好像看不到table? 中的数据
此外,奇怪的是,由于某种原因,更改代码弄乱了我编辑器中的 GUI 元素。
我解决了这个问题,希望这个回答对其他人有帮助:
这个问题很难解决,因为
- 引用了正确的数据库
- 所有代码都是正确的
- 当 运行 在我的数据库浏览器中 时,sql 查询得到了 return 结果
问题是我正在使用 DB Browser for Sqlite,这是我的新手。我已经将数据行写入数据库,以便我的查询在浏览器中得到 return 结果,但显然这些更改不会写入数据库文件供其他应用程序查看,直到按下 "Write Changes" 按钮.
希望这对可能不熟悉 db 浏览器并遇到此错误的其他人有所帮助!