2011-09-23 67 views
0

我有一个函数存储为系统中验证的每个用户生成的临时信息。这个“会话ID”是一个存储在会话表中的字符串,沿着被认证的用户的原始ID并被给予所述会话标识符。正确SQL查询命令与SQL Compact正在失败

该函数删除/ deauthenticate /该用户是否存在通过作为实施的另一方法无效的现有会话首先检查如下:

 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查询工具,瞧,它确实工作。但在继续之后,代码中的查询失败以及。我无法找到这个烦人的问题的罪魁祸首,因为没有例外并且一切似乎都正确。数据存在,参数以适当的类型(字符串和整数)提供,我无法检查。连接打开等等。

周围任何人的任何线索?谢谢!

更新:过失,错过了函数中使用的ExecuteScalar直到我修改了它用于测试的事实。它确实使用ExecuteScalar和返回null,以防万一。

回答

2

您使用ExecuteNonQuery

int foo = cmd.ExecuteNonQuery(); 

...但你显然试图执行一个查询(一个SELECT)!再次使用ExecuteScalar,就像您在第一个代码或ExecuteReader中所做的那样,并适当查看结果。如果您坚持使用ExecuteScalar,则应首先检查结果是否为null以指示没有结果。

ExecuteNonQuery返回受UPDATE/INSERT/DELETE命令影响的行数 - 这是它的用途。如下所示,我怀疑它会返回-1:

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括受插入或更新操作以及触发器或触发器影响的行数影响的行数。 对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1。

(重点煤矿。)

+0

感谢您的漫长反应,我的坏。不知怎的,错误消失了。我认为它可能与同步性有关,但它很奇怪。 – soze

+1

@soze:如果您仍在使用ExecuteNonQuery,那么代码仍然存在问题,您仍应该修复它。 –

1

使用set [],以避免与数据库关键字歧义。

cmd.CommandText = "SELECT [Id] FROM [Users] WHERE ([Username] = @User)"; 

,并与SELECT语句工作时使用ExecuteScalar()ExecureReader()方法。

+0

谢谢,没错。固定! – soze