2011-09-23 2 views
0

시스템에 인증 된 모든 사용자에 대해 생성 된 임시 정보를 저장하는 기능이 있습니다. 이 '세션 ID'는 인증 된 사용자의 원래 ID를 따라 세션 테이블에 저장된 문자열이며 세션 식별자를 부여 받았습니다.SQL Compact가 포함 된 적절한 SQL 쿼리 명령이 실패했습니다.

기능은 사용자로 구현하는 다른 방법을 통해 존재하는 경우 기존 세션 먼저 확인을 무효화// 비인증를 제거하면 다음과

 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(); 

추가 중단 점 및 짜잔, 그것은 참으로 을했다 : 그래서 비 매개 변수화 쿼리 문자열을 사용하여 동등한 불안을 추가했다. 그러나 계속하면 코드에서 쿼리도 실패합니다.. 예외가 발생하지 않았으므로이 성가신 문제의 주범을 찾을 수 없습니다. 및 모든 것이 올바른 것으로 보입니다. 데이터가 존재하고, 매개 변수가 적절한 유형 (문자열 및 int)으로 제공되며, 점검 할 항목이 없습니다. 연결이 열려있는 등.

주변 사람의 단서가 있습니까? 감사!

업데이트 : 내 잘못 culpa, 내가 테스트를 위해 그것을 수정 될 때까지 기능이 ExecuteScalar는 사용 사실을 놓쳤다. 으로 ExecuteScalar를 사용하고 은 null의 경우을 반환합니다.

int foo = cmd.ExecuteNonQuery(); 

...하지만 당신은 명확 쿼리 (A SELECT)을 실행하려는 :

답변

2

당신은 ExecuteNonQuery를 사용! 첫 번째 코드에서와 마찬가지로 ExecuteScalar을 다시 사용하거나 ExecuteReader을 사용하고 결과를 적절하게 살펴보십시오. ExecuteScalar을 고수하면 결과가 null인지 여부를 먼저 확인해야합니다.

ExecuteNonQuery은 UPDATE/INSERT/DELETE 명령의 영향을받는 행 수를 리턴합니다.

반환 값은 명령에 의해 영향을받는 행 수입니다. 삽입 또는 갱신중인 테이블에 트리거가 존재하면, 리턴 값에는 삽입 또는 갱신 조작과 트리거 또는 트리거에 의해 영향을받는 행의 수에 영향을받는 행 수가 포함됩니다. 다른 모든 유형의 명령문의 경우 반환 값은 -1입니다. 롤백이 발생하면 반환 값도 -1입니다.

(강조 광산.) 데이터베이스 키워드 모호성을 피하기 위해 [] 설정

+0

오랜 반응을 보내 주셔서 감사합니다. 어떻게 든 오류가 사라졌습니다. 나는 그것이 동시성과 관련이 있을지도 모른다고 생각하지만 그것은 지옥처럼 이상했다. – soze

+1

@soze : 여전히 ExecuteNonQuery를 사용하는 경우 코드가 여전히 손상되어 여전히 수정해야합니다. –

1

사용.

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

및 SELECT 문 작업을 할 때 ExecuteScalar() 또는 ExecureReader() 방법을 사용합니다.

+0

감사합니다. 결정된! – soze