SQL语句正在检索行的ID。但可能没有这样的排。当我在GUI工具中执行特定的SQL语句时,它返回" 0行从0 ...返回:..."。
但是,当我使用ExecuteScalarAsync<int>
执行相同的SQL语句时,它返回0,并且没有发生异常或null。我如何知道是否没有这样的行?从理论上讲,可以有一行ID为0的行。
PS: 我使用Nuget(https://github.com/praeclarum/sqlite-net)添加了SQLite-net。它的版本是1.4.118。 SQL语句非常简单。我改变了字段名称,但基本上它是这样的:
using SQLite;
public Task<int> GetLastID()
{
return RealDatabase.ExecuteScalarAsync<int>
("SELECT max(ID) FROM DATA)");
}
答案 0 :(得分:0)
实际上,provider没有实现可为空的类型,并且有一个open issue。
尽管可以切换到其他提供程序(如果您知道其他轻量级的选择,请提供建议),我使用以下技巧。就我而言,我不能简单地避免零(0)值,它在数据库中具有特殊含义,我必须将其与无数据区分开来。
public Task<int> GetLastID()
{
var sRes = RealDatabase.ExecuteScalarAsync<string>
("SELECT cast(max(ID) as varchar) FROM DATA)");
return string.IsNullOrEmpty(sRes) ? null : int.Parse(sRes);
}
答案 1 :(得分:0)
我用扩展方法解决了这个问题
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
的列。