c# - 无论记录是否存在,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);
}
}
解决方案
当您期望返回一些数据时,不应使用 ExecuteNonQuery。无论是完整的行集还是单个标量值。
与 SELECT 语句一起使用时,ExecuteNonQuery 将始终返回 -1。至少这是微软对其实施所说的,不确定这是否与 SQLite 相同。
对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。对于所有其他类型的语句,返回值为 -1。
在您的上下文中,当您期望单个 SCALAR 值时,您使用 ExecuteScalar
exist = (int)comm.ExecuteScalar();
强制转换是必要的,因为 ExecuteScalar 返回一个对象
推荐阅读
- html - 全部信息打印在一行上
- python - SQL Alchemy 持久绑定是什么意思?
- ios - 如何在 UIScrollView 中创建可重用的视图控制器?
- mysql - 在 numberofGPUs 上创建外键时出错(检查数据类型) - 列完全相同,我仍然遇到这个问题
- mysql - 需要从数据库中查询数据
- angular - 如何在 Ionic 4 中加载模态
- reactjs - 如何使用 axios 发出 API 请求?
- c++ - 有人可以帮我摆脱这个 memset 吗?
- javascript - 如何修复 jQuery-UI 滑块上的 Range 和 hange 上的触发功能
- python - 来自二维数组的多键字典