我正在尝试使用UWP应用程序中的Microsoft.Data.Sqlite类从我的Sqlite数据库中的表中读取数据。
表中有一行,由同一个应用程序插入。我可以使用Sqlite数据库浏览器查看数据,并可以将SQL查询复制粘贴到数据库浏览器中,运行它,并查看返回的正确结果。
但是,当我使用下面的代码运行相同的查询时,不会返回任何数据。
string _query = "SELECT [Source] FROM [Sessions] ORDER BY [MinTimeOffset];";
_SessionList = new List<string>();
using (SqliteCommand _command = new SqliteCommand(_query, _Connection))
{
using (SqliteDataReader _reader = _command.ExecuteReader())
{
while (_reader.Read())
{
_SessionList.Add((string)_reader["Source"]);
}
}
}
表结构如下:
CREATE TABLE Sessions (
[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
[Source] NVARCHAR(255) NOT NULL,
[MinValue] FLOAT NULL,
[MaxValue] FLOAT NULL,
[MinTimeOffset] BIGINT NULL,
[MaxTimeOffset] BIGINT NULL
)
数据是:
1, "2017-09-17-070007-ELEMNT BOLT BDA2-15-0.fit", NULL, NULL, NULL, NULL
不会抛出任何异常,_reader.Read()
在第一次调用时返回false
,_reader.HasRows
为false
,表示查询不返回任何数据。
我确信这里有一些简单的东西 - 这可能会导致什么?
更新以下评论
我可以使用ExecuteScalar()
从同一个表中检索数据而不会出现问题,虽然这是作为事务的一部分与数千个插入一起执行的,所以我想略有不同。适用的代码如下:
_query = "SELECT [Id] FROM Sessions WHERE [Source] = @sessionName LIMIT 1;";
long _sessionId;
_IngestCommand.CommandText = _query;
_IngestCommand.Parameters.Add(new SqliteParameter("@sessionName", sessionName));
_sessionId = (long)_IngestCommand.ExecuteScalar();
关于我的连接方式,数据库是通过DDL语句从头创建的新数据库,或者是以相同方式创建的现有版本。我使用的这两种方法中的哪一种没有区别。任何时候只有一个数据库文件 - 我在运行之前手动删除文件夹内容以确保我没有打开任何副本或旧版本等,然后以编程方式创建数据库并在事务中插入一堆数据,包括作为插入逻辑的一部分成功检索的该表中的记录,然后提交事务。
此时我可以在Sqlite数据库浏览器中浏览所有插入的数据。然后我调用包含上面显示的ExecuteReader()
代码并且没有收到任何结果的方法。整个过程中都使用了相同的连接 - 它在类构造函数中打开,并在该类的Dispose()方法中关闭(我知道这不是很好的设计 - 一旦我弄清楚了,我就会重构它。连接代码如下所示:
var _connSB = new SqliteConnectionStringBuilder
{
Cache = SqliteCacheMode.Private,
DataSource = filename,
Mode = SqliteOpenMode.ReadWriteCreate
};
_Connection = new SqliteConnection(_connSB.ToString());
_Connection.Open();
构建数据库的代码:
string[] _commands = {
"CREATE TABLE IF NOT EXISTS ProjectMetaData ([Id] INTEGER PRIMARY KEY AUTOINCREMENT, [Name] NVARCHAR(100) NOT NULL, [Value] NVARCHAR(255) NOT NULL)",
"CREATE TABLE IF NOT EXISTS Series ([Id] INTEGER PRIMARY KEY AUTOINCREMENT, [Name] NVARCHAR(100) NOT NULL, [Unit] NVARCHAR(48) NOT NULL, [MinValue] FLOAT NULL, [MaxValue] FLOAT NULL, [MinTimeOffset] BIGINT NULL, [MaxTimeOffset] BIGINT FLOAT NULL)",
"CREATE TABLE IF NOT EXISTS Sessions ([Id] INTEGER PRIMARY KEY AUTOINCREMENT, [Source] NVARCHAR(255) NOT NULL, [MinValue] FLOAT NULL, [MaxValue] FLOAT NULL, [MinTimeOffset] BIGINT NULL, [MaxTimeOffset] BIGINT NULL)",
"CREATE TABLE IF NOT EXISTS Data ([Id] INTEGER PRIMARY KEY AUTOINCREMENT, [SeriesId] INT NOT NULL, [SessionId] NOT NULL, [TimeOffset] BIGINT NOT NULL, [Value] FLOAT NOT NULL, [Discounted] BIT NULL)"
};
foreach (string _command in _commands)
{
using (SqliteCommand _dbCommand = new SqliteCommand(_command, _Connection))
{
_dbCommand.ExecuteNonQuery();
}
}