2014-03-07 2 views
0

저는 MVC를 처음 접했고 sqlserver에 대한 등록 양식 링크를 만들었습니다. 나는이 오류 그러나 : 나는 바로 여기 내 오류 얻을MVC C# SqlException

public bool IsUserExist(string emailid) 
{ 
    bool flag = false; 
    SqlConnection connection = new SqlConnection("Data Source=HOMESERV;Initial Catalog=JSO;Integrated Security=True;MultipleActiveResultSets=True"); 
    connection.Open(); 
    SqlCommand command = new SqlCommand("select * from EMPLOYEE where EMP ID='" + EMP_ID + "'", connection); 
    flag = Convert.ToBoolean(command.ExecuteScalar()); 
    connection.Close(); 
    return flag; 
} 

:

An expression of non-boolean type specified in a context where a condition is expected, near 'ID

여기 내 코드입니다

flag = Convert.ToBoolean(command.ExecuteScalar()); 

내가 뭔가 잘못하고 있어요 알아 내 어디 스테이트 넷,하지만 그게 뭔지 확실하지 않다면 : ( 도와 주시면 고맙겠습니다. 감사합니다!

+1

'command.ExecuteScalar()'의 값은 무엇을 반환합니까? 코드를 디버그 했습니까? 항상 매개 변수가있는 쿼리를 사용해야합니다. 이러한 종류의 문자열 연결은 SQL 주입 공격에 개방적입니다. –

+3

SQL 주입 사람? –

답변

3

필드 이름이 Emp ID 같은 공백이 포함 된 경우에 당신이 당신의 쿼리에 또 다른 큰 문제는 그것이 SQL Injection라고,

SqlCommand command = new SqlCommand("select * from EMPLOYEE where [EMP ID]=....", connection); 

그러나 그 이름을 대괄호를 사용해야합니다.
나는 또한 당신도록 SqlConnection 및 SqlCommand를 주위에 using statement 블록을 추가 한이

bool flag = false; 
using(SqlConnection connection = new SqlConnection("Data Source=HOMESERV;Initial Catalog=JSO;Integrated Security=True;MultipleActiveResultSets=True")) 
using(SqlCommand command = new SqlCommand("select * from EMPLOYEE where [EMP ID][email protected]", connection); 
{ 
     connection.Open(); 
     command.Parameters.AddWithValue("@id", EMP_ID); 
     flag = Convert.ToBoolean(command.ExecuteScalar()); 
} 
return flag; 

처럼 뭔가 코드를 변경하십시오. 이렇게하면 예외적으로 일회용 물건을 올바르게 닫고 처분 할 수 있습니다.

마지막으로, 나는 SELECT * 쿼리에서 ExecuteScalar의 사용법에 조금 당황 스럽다. ExecuteScalar은 첫 번째 행의 첫 번째 필드 만 반환합니다. 따라서 SELECT * 쿼리에는 적합하지 않습니다. 레코드의 존재를 테스트하고 있다면 전체 레코드를 반환하지 않고 간단한 SELECT COUNT (*) 또는 IF EXISTS 쿼리를 사용하지 않는 이유는 무엇입니까?

"select count(*) from EMPLOYEE where [EMP ID] = @id" 
"if exists(select * from EMPLOYEE where [EMP ID] = @id) SELECT 1 ELSE SELECT 0" 
+0

감사합니다. 정확합니다 ... 내 시간을 절약했습니다 :) – NilR

+0

어떻게 모든 필드가 일부만 삽입 할 수 있습니까? 나는 이것을했으나 여전히 테이블의 나머지 부분을 채우라고 요청하지만 나는 그들을 null로 남겨두고 싶다 SqlCommand command = new SqlCommand ("EMPLOYEE (EMP_ID, PASSWORD, CONFIRMPASSWORD) VALUES ('+ EMP_ID + ', ""+ Password + "', +"ConfirmPassword + " ')", 연결); – NilR

+1

NULL 필드가없는 경우 삽입 할 때 필드의 값을 제공해야합니다. 다시 쿼리를 만들 때 문자열 연결을 사용하지 마십시오. 모든 종류의 명령 텍스트에 대한 매개 변수. 문자열 연결은 장기적으로 치명적인 오류입니다 ..... (여전히 문제가 있다면 새로운 질문을 올리시기 바랍니다) – Steve

2

귀하의 DB 스키마에서 추측 하겠지만 그 안에 공백이있는 열을 참조했습니다. 대괄호로 묶어보십시오.

select * from EMPLOYEE where [EMP ID] = ... 

아니면 단순히 열 이름의 철자가 틀린 것일 수 있습니다.