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
相关产品推荐
相关产品推荐

