正确的SQL查询命令使用SQL Compact失败
本文关键字:SQL Compact 失败 查询 命令 | 更新日期: 2023-09-27 18:09:22
我有一个函数,用于存储为系统中经过身份验证的每个用户生成的临时信息。这个"会话ID"是一个字符串,存储在会话表中,与经过身份验证的用户的原始ID一起被赋予会话标识符。
删除/取消认证/使现有会话无效的函数首先通过另一个方法检查用户是否存在,实现方法如下:
int userId = 0;
SqlCeCommand cmd = new SqlCeCommand();
SqlCeParameterCollection sqlParams = cmd.Parameters;
sqlParams.AddWithValue("@User", userName);
cmd.Connection = this.conn;
cmd.CommandText = "SELECT Id FROM Users WHERE (Username = @User)";
userId = (int) cmd.ExecuteScalar()
cmd.Dispose();
之后,它尝试查找该用户的现有会话,该会话将被删除(再次通过不同的方法):
SqlCeCommand cmd = new SqlCeCommand();
SqlCeParameterCollection sqlParams = cmd.Parameters;
sqlParams.AddWithValue("@SID", mysession);
sqlParams.AddWithValue("@UID", myuserid);
cmd.Connection = this.Connection;
cmd.CommandText = "SELECT Id FROM UserSessions WHERE (SessionID = @SID) AND (User_Id = @UID)";
int foo = cmd.ExecuteNonQuery();
…而失败。不幸的是,没有出现异常。因此,我使用非参数化查询字符串添加了一个不安全的等效物:
cmd.CommandText = String.Format("SELECT Id FROM UserSessions WHERE (SessionID = '{0}') AND (User_Id = {1})", mysession, myuserid);
cmd.Prepare();
int bar = cmd.ExecuteNonQuery();
添加了一个断点,暂停,将查询复制粘贴到Visual Studio查询工具中,瞧,确实工作了。但是在继续之后,代码中的查询也失败了。我找不到这个恼人问题的罪魁祸首,因为没有异常,一切似乎都是正确的。数据存在,参数以适当的类型(字符串和int)提供,我没有东西要检查。连接打开,等等。
周围的人有线索吗?谢谢!
Update:我错了,在我修改进行测试之前,我忽略了函数使用ExecuteScalar的事实。它确实使用ExecuteScalar和返回null,只是以防万一。
您正在使用ExecuteNonQuery
:
int foo = cmd.ExecuteNonQuery();
…但你显然是在尝试执行查询(SELECT)!再次使用ExecuteScalar
,就像在第一个代码中所做的那样,或者使用ExecuteReader
并适当地查看结果。如果您坚持使用ExecuteScalar
,您应该首先检查结果是否为null
以表示没有结果。
ExecuteNonQuery
返回受UPDATE/INSERT/DELETE命令影响的行数——这就是它的目的。我怀疑它为您返回-1,如文档所示:
对于UPDATE、INSERT和DELETE语句,返回值是受该命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1
(我强调。)
使用set[]避免与数据库关键字歧义。
cmd.CommandText = "SELECT [Id] FROM [Users] WHERE ([Username] = @User)";
ExecuteScalar()
或ExecureReader()
方法。