首页 > 解决方案 > 无论记录是否存在,SQLite EXISTS 参数都返回 -1,C#

问题描述

我的 SQLite 代码有问题。我正在尝试检查我的 SQLite 表中是否存在记录,但由于某种原因,无论该记录是否存在,它总是返回 -1。据我所知,如果记录存在,它应该返回 1,如果不存在,它应该返回 0。有人可以指出我的错误吗?谢谢!

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))
                {
                    comm.Parameters.AddWithValue("@date", hour.ToString());
                    con.Open();

                    exist = comm.ExecuteNonQuery();
                }

                if(exist != 1) //The object doesn't exists in the DB
                {
                    freeHours.Add(hour);
                }
            }

标签: c#.netsqlite

解决方案


当您期望返回一些数据时,不应使用 ExecuteNonQuery。无论是完整的行集还是单个标量值。

与 SELECT 语句一起使用时,ExecuteNonQuery 将始终返回 -1。至少这是微软对其实施所说的,不确定这是否与 SQLite 相同。

对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。对于所有其他类型的语句,返回值为 -1。

在您的上下文中,当您期望单个 SCALAR 值时,您使用 ExecuteScalar

 exist = (int)comm.ExecuteScalar();

强制转换是必要的,因为 ExecuteScalar 返回一个对象


推荐阅读