2014-10-22 5 views
0

데이터베이스에서 행을 업데이트하는 중이 오류가 발생합니다. wcf 서비스 응용 프로그램의 업데이트 오류

유형 'System.Data.OleDb.OleDbException'의 예외

이가 system.data.dll에서 발생했지만 사용자 코드에서

추가 정보 처리되지 않은 : UPDATE 문에 구문 오류가 발생했습니다.

서비스를 호출하지 못했습니다. 가능한 원인 : 서비스가 오프라인이거나 액세스 할 수 없습니다. 클라이언트 측 구성이 프록시와 일치하지 않습니다. 기존 프록시가 유효하지 않습니다. 자세한 내용은 스택 추적을 참조하십시오. 새 프록시를 시작하거나 기본 구성으로 복원하거나 서비스를 새로 고침하여 복구를 시도 할 수 있습니다.

이 내 업데이트 코드입니다

public string UpdateInventory(string name, int quantity) 
{ 
     string strMessage = string.Empty; 
     string sql; 

     //Create connection object 
     OleDbConnection oleConn = new OleDbConnection(connString); 
     oleConn.Open(); 

     //Update a row 
     sql = "UPDATE Product SET Quantity Attribute = '" + quantity + "' WHERE Name = '" + name + "'"; 

     OleDbCommand cmd = new OleDbCommand(sql, oleConn); 

     int rowsAffected = (int)cmd.ExecuteNonQuery(); 

     if(rowsAffected > 0) 
     { 
      strMessage = name + "Details updated succesfully"; 
     } 
     else 
     { 
      strMessage = name + "Details not updated successfully"; 
     } 

     oleConn.Close(); 

     return strMessage; 
} 

하지만 같은 코드를 사용하여 소수 가격과 문자열 설명을 업데이트합니다. 잘된다. 수량을 업데이트 할 때 코드를 가져 오는 것뿐입니다.

+0

[SQL 주입 경고] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - SQL 문을 함께 연결하지 말아야 ** ** SQL 주입을 피하기 위해 ** 매개 변수화 된 쿼리 **를 사용하십시오. –

+1

공간을 처리하기 위해'Quantity Attribute' 주위에 대괄호를 사용하십시오. - UPDATE Product SET [Quantity Attribute]' 구문 오류의 가장 큰 이유를 수정합니다. 그리고 당신이있는 동안 @marc_s가 말했던대로하고 매개 변수화 된 쿼리를 사용하도록 코드를 변경하십시오. – Tim

답변

0

열 이름 Quantity Attribute에 공백이있어 구문 오류가 발생할 가능성이 큽니다. 이 문제를 해결하려면 열 이름 주위에 대괄호를 사용할 수 있습니다. 또한 quantityint이며 SQL 명령에서이 문자열을 문자열로 사용하려고합니다. 테이블에있는 int 일 가능성이 높으므로 그 값 주위에 '이 필요하지 않지만 테이블의 스키마는 알지 못합니다.

코드의 가장 큰 문제점은 SQL 주입 공격에 취약하다는 것입니다. 매개 변수화 된 쿼리를 사용하여이를 방지 할 수 있습니다. 매개 변수화 된 쿼리에는 개별 매개 변수의 유형에 따라 필요한 값의 인용을 처리하는 추가 이점이 있습니다.

마지막으로 using 블록을 연결에 사용하면 오류가 발생해도 using 블록을 종료 할 때 연결을 닫고 처리하는 것이 좋습니다. 여기

이 모두를 랩하는 예입니다 :은 OleDb에 대한 물음표가 매개 변수에 대한 자리 표시로 사용되는 것을

try 
{ 
    using (OleDbConnection oleConn = new OleDbConnection(connString)) 
    { 
     oleConn.Open(); 

     //Update a row 
     sql = "UPDATE Product SET [Quantity Attribute] = ? WHERE Name = ?"; 

     OleDbCommand cmd = new OleDbCommand(sql, oleConn); 
     cmd.CommandType = CommandType.Text; 
     cmd.Parameters.Add("@Quantity", OleDbType.Int).Value = quantity; 
     cmd.Parameters.Add("@Name", OleDbType.VarChar).Value = name; 

     int rowsAffected = (int)cmd.ExecuteNonQuery(); 

     if(rowsAffected > 0) 
     { 
      strMessage = name + "Details updated succesfully"; 
     } 
     else 
     { 
      strMessage = name + "Details not updated successfully"; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    strMessage = String.Format("Update error: {0}", ex.Message); 
} 

주, 그래서 당신이 매개 변수를 추가하는 순서는 중요하다 - 그들은 쿼리 문자열의 자리 표시 자 순서와 일치해야합니다. 나는 또한 try-의 코드를 감싸 최종 권고안으로

UPDATE Product SET [Quantity Attribute] = 20 WHERE Name = 'Sample' 

:

결과 SQL이 (가정 수량 특성과 같을 것이다는 INT와 quantity = 20 name = "샘플"입니다 catch 블록을 사용하면 예외가 발생하면 잡히고 처리됩니다. 처리되지 않은 예외는 공개되지 않아야하는 프로그램에 대한 정보를 나타낼 수 있습니다. 잠재적 인 해커가 시스템을 손상시키려는 시도를 다듬을 수있는 자세한 정보를 제공 할 수 있습니다. 이것은 WCF 서비스이며 구성 예외 사항에 따라 클라이언트에 반환되거나 반환되지 않을 수도 있지만 처리되지 않은 예외로 인해 서비스가 중단되고 w 클라이언트 채널을 서비스에 잘못 사용하는 것.

관련 문제