[英]Proper SQL query command with SQL Compact is failing
我有一个功能可以存储为系统中每个经过身份验证的用户生成的临时信息。 该“会话ID”是沿着用户表的原始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查询工具中,瞧,它确实有效 。 但是在继续之后, 代码中的查询也失败了 。 我找不到这个烦人的问题的罪魁祸首,因为没有引发任何例外,而且一切似乎都正确。 数据存在,参数以正确的类型(字符串和整数)提供,我没什么要检查的。 连接已打开,依此类推。
周围的人有什么线索吗? 谢谢!
更新 :Mea culpa错过了该函数使用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)";
并在使用SELECT语句时使用ExecuteScalar()
或ExecureReader()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.