2017-10-24 16 views
0

쿼리 문자열을 채울 매개 변수를받는 "InsertEmpolyee"라는 함수가 있습니다. 문제는 이러한 변수 중 일부를 선택적으로 만들고 싶습니다. 즉, 매개 변수에 값을 전달하지 않고 함수를 호출하고 데이터베이스에 NULL을 삽입하여 올바른 쿼리 문자열을 만들 수 있기를 바랍니다. 쿼리 문자열에 NULL 값 전달

는 함수 InsertEmployee

public int InsertEmployee(string FirstName, char Minit, string LastName, int SSN 
, int? Salary) 
{ 
    string query = "INSERT INTO Employee (Fname, Minit, Lname, SSN, Salary) " + "Values ('" + FirstName + "','" + Minit + "','" + LastName + "'," + Salary + ");"; 
    return model.ExecuteNonQuery(query); 
} 

입니다 그리고 여기에 내가 전화하는 방법입니다.

int res = Controlobj.InsertEmployee(txtbox_FirstName.Text, txtbox_Minit.Text[0], 
        txtbox_LastName.Text, Int32.Parse(txtbox_SSN.Text), null); 

나는 다음과 같은

if (!Salary.HasValue) 
      Salary = DBNull.Value; 

을하려고 노력하지만 나에게 다음과 같은 오류 준다 "암시 system.DBNull는 int로 변환 할 수 없습니다를?"

어떻게 해결할 수 있습니까? 그리고 이것을 할 수있는 더 좋은 방법이 있습니까?

+4

쿼리에 문자열 연결을 사용하지 말고 대신 매개 변수화 된 쿼리를 사용하십시오. 이렇게하면 코드가 SQL 삽입 공격에 취약하지 않게됩니다. 또한 들어오는 매개 변수 중 하나가'null' 일 때 매개 변수 값으로'System.DBNull.Value'를 전달할 수 있기 때문에 문제를 해결할 것입니다. – Igor

+0

'model'은'SqlCommand'의 인스턴스입니까? – Igor

+0

@Igor 아니요, 제가 작성한 수업입니다. 나는 매개 변수화 된 쿼리에 대해 읽을 것이다. 사실 나는 문자열 연결이 SQL 인젝션에 취약하다는 것을 알았지 만, 이것은 문자 그대로 데이터베이스를 다루는 처음 문자입니다. –

답변

4

코드는 null에서 실패 할뿐만 아니라 아포스트로피가 포함 된 문자열에서도 실패하지 않습니다. 다른 함정도있을 수 있습니다. 그래서 우리는 매개 변수를 사용합니다.

public int InsertEmployee(string Fname, char Minit, string Lname, int SSN, int? Salary) 
{ 
    return model.ExecuteNonQuery(
     @" 
      INSERT INTO Employee (
         Fname, Minit, Lname, SSN, Salary 
        ) VALUES (
         @Fname, @Minit, @Lname, @SSN, @Salary 
        ) 
     ", 
     new SqlParameter("@Fname", SqlDbType.VarChar) { Value = (object)Fname ?? System.DBNull.Value }, 
     new SqlParameter("@Minit", SqlDbType.VarChar) { Value =   Minit       }, 
     new SqlParameter("@Lname", SqlDbType.VarChar) { Value = (object)Lname ?? System.DBNull.Value }, 
     new SqlParameter("@SSN", SqlDbType.Int ) { Value =   SSN       }, 
     new SqlParameter("@Salary", SqlDbType.Int ) { Value = (object)Salary ?? System.DBNull.Value }); 
} 
+0

이것은 사용해야하는'SqlParameter'의 생성자가 아닙니다. 전달 된 값에서 유형을 유추하기 때문에 매우 혼란스러운 행동을 유발할 수 있지만 전달 된 값은 어떤 유형도없는 'null'일 수 있습니다. (BTW, 이전에 포함 된 링크는 좋지 않았습니다. 이제는 무시해주십시오.) – hvd

+0

직접 모델 클래스를 작성 했으므로 ExecuteNonQuery 함수는 문자열을 매개 변수로 사용합니다. 제안 된 방법에 적합한 매개 변수는 무엇입니까? –

+1

그런 다음 ExecuteNonQuery를 수정해야합니다. SqlCommand.ExecuteNonQuery가 매개 변수를 사용하는 이유가 있습니다. – ikegami