SQLite .NET,ExecuteScalarAsync <int>,如何知道什么时候没有结果?

时间:2017-11-07 12:05:49

标签: c# sqlite sqlite.net

SQL语句正在检索行的ID。但可能没有这样的排。当我在GUI工具中执行特定的SQL语句时,它返回&#34; 0行从0 ...返回:...&#34;。

但是,当我使用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)");
}

2 个答案:

答案 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的列。