You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中SQLite EXISTS查询无论记录是否存在均返回-1的问题排查求助

问题分析与解决

嘿,你这个问题的核心原因其实很简单——用错了数据库执行方法!

为什么一直返回-1?

你现在用的ExecuteNonQuery(),它的本职工作是执行INSERT/UPDATE/DELETE这类不返回结果集的SQL语句,返回值是操作影响的行数。对于SELECT查询,它的返回值固定是-1,和你的记录存不存在完全没关系,这就是你不管有没有匹配记录都得到-1的根源。

正确的做法

要获取SELECT EXISTS(...)的查询结果,你得用ExecuteScalar()方法——它专门用来获取查询结果的第一行第一列的值,也就是你想要的1(存在)或0(不存在)。

另外还有个小细节要优化:别把DateTime转成字符串传给参数,直接传hour这个DateTime对象就行,SQLite能正确处理日期类型,避免因字符串格式不一致导致的查询匹配失败。

修正后的代码

var freeHours = new List<DateTime>();
User user = new User();
for (int i = user.HoursOfWork[0]; i < user.HoursOfWork[1]; i++)
{
    DateTime hour = new DateTime(date.Year, date.Month, date.Day, i, 0, 0);
    int exist;
    using (var con = new SQLiteConnection(cs))
    using (var comm = new SQLiteCommand("SELECT EXISTS(SELECT 1 FROM Schedule WHERE date = @date)", con))
    {
        // 直接传入DateTime对象,无需转字符串
        comm.Parameters.AddWithValue("@date", hour);
        con.Open();
        // 用ExecuteScalar获取查询结果并转为int类型
        exist = Convert.ToInt32(comm.ExecuteScalar());
    }
    if(exist != 1) // 记录不存在于数据库中
    {
        freeHours.Add(hour);
    }
}

额外提示

如果你的Schedule表中date字段是字符串类型而非日期类型,那你可能需要统一两边的日期格式(比如用hour.ToString("yyyy-MM-dd HH:mm:ss")),但更推荐的是把数据库字段改成日期类型,这样更规范也更不容易出问题。

内容的提问来源于stack exchange,提问作者Someone with many names

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:37:36