SQL 语句正在检索行的 ID。但可能不存在这样的行。当我在 GUI 工具中执行特定 SQL 语句时,它返回“0 行在 0 毫秒内返回:...”。
但是,当我执行相同的 SQL 语句时ExecuteScalarAsync<int>
,它返回0,并且没有发生异常或null。我怎么知道是否没有这样的行?理论上可以存在ID为0的行。
附:
这是我使用 Nuget 添加的 SQLite-net (https://github.com/praeclarum/sqlite-net https://github.com/praeclarum/sqlite-net)。它的版本是1.4.118。 SQL 语句非常简单。我更改了字段名称,但基本上是这样的:
using SQLite;
public Task<int> GetLastID()
{
return RealDatabase.ExecuteScalarAsync<int>
("SELECT max(ID) FROM DATA)");
}
我用扩展方法解决了这个问题:
using System;
using System.Threading.Tasks;
using SQLite;
namespace MyApp.DB
{
public class Row<T>
{
public T scalar_value { get; set; }
}
public class Maybe<T>
{
public readonly T Value;
public Maybe(T v) { Value = v; }
}
public static class SQLiteExtensions
{
public async static Task<Maybe<T>> QueryScalarAsync<T>(this SQLite.SQLiteAsyncConnection conn, string sql)
{
var res = await conn.QueryAsync<Row<T>>(sql);
if (res.Count == 0)
{
return null;
}
else
{
return new Maybe<T>(res[0].scalar_value);
}
}
}
}
返回值为null
表示未找到任何行,并且任何返回值本身都包含在Maybe
类以便可以区分空值:
var version = await conn_.QueryScalarAsync<int>("SELECT version AS scalar_value FROM schema_version");
if (version == null)
{
Debug.WriteLine("no rows found");
}
else
{
Debug.WriteLine(string.Format("value = {0}", version.Value));
}
唯一的问题是您的查询必须包含名为scalar_value
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)