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

时间:2017-12-29 01:28:46

标签: c# sqlite unity3d datareader

我在SQLite中有一个表,结构如下:

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

我试图在Unity中使用this guide关于使用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元素。

1 个答案:

答案 0 :(得分:0)

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

开始排除故障是个棘手的问题
  • 正在引用正确的数据库
  • 所有代码都是正确的
  • 在我的数据库浏览器中运行时,sql查询确实返回了一个结果

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

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