2010-05-29 3 views
1

우선, 도와주세요! 나 더이상 이걸 받아 들일 수 없어. 오류가있는 위치를 찾을 수 없습니다. 여기 내 문제가 있습니다 :업데이트 문 업데이트 0 C# Winform 응용 프로그램을 통해 행?

나는 C# winform 응용 프로그램을 통해 행을 업데이트하려고합니다. 응용 프로그램에서 생성 된 업데이트 쿼리의 서식이 올바르게 지정되었습니다. 나는 SQL 서버 환경에서 그것을 테스트, 잘 작동했습니다. 내가 응용 프로그램에서 실행하면 0 행이 업데이트됩니다.

리플렉션을 사용하여 업데이트 구문을 생성하는 스 니펫입니다. 알아 내려고하지 마세요.

objSqlCommand.CommandText = "UPDATE " + this.TableName + " SET " + SQL + " WHERE " + cust.PKName + " = @cusID AND PhoneNumber = " + "'" + "@phNum" + "'"; 

는 DML 생성 :

 public void Update(int cusID) 
     { 
      SqlCommand objSqlCommand = new SqlCommand(); 
      Customer cust = new Customer(); 

      string SQL = null; 

      try 
      { 
       if ((cusID != 0)) 
       { 
         foreach (PropertyInfo PropertyItem in this.GetType().GetProperties()) 
         { 
          if (!(PropertyItem.Name.ToString() == cust.PKName)) 
          { 
           if (PropertyItem.Name.ToString() != "TableName") 
           { 
            if (SQL == null) 
            { 
             SQL = PropertyItem.Name.ToString() + " = @" + PropertyItem.Name.ToString(); 
            } 
            else 
            { 
             SQL = SQL + ", " + PropertyItem.Name.ToString() + " = @" + PropertyItem.Name.ToString(); 
            } 
           } 
           else 
           { 
            break; 
           } 
          } 
         } 

         objSqlCommand.CommandText = "UPDATE " + this.TableName + " SET " + SQL + " WHERE " + cust.PKName + " = @cusID AND PhoneNumber = " + "'" + "@phNum" + "'"; 

         foreach (PropertyInfo PropertyItem in this.GetType().GetProperties()) 
         { 
          if (!(PropertyItem.Name.ToString() == cust.PKName)) 
          { 
           if (PropertyItem.Name.ToString() != "TableName") 
           { 
            objSqlCommand.Parameters.AddWithValue("@" + PropertyItem.Name.ToString(), PropertyItem.GetValue(this, null)); 
           } 
           else 
           { 
            break; 
           } 

          } 
         } 

         objSqlCommand.Parameters.AddWithValue("@cusID", cusID); 
         objSqlCommand.Parameters.AddWithValue("@phNum", this.PhoneNumber); 
         DAL.ExecuteSQL(objSqlCommand); 
       } 
       else 
       { 
        //AppEventLog.AddWarning("Primary Key is not provided for Update.") 
       } 

      } 
      catch (Exception ex) 
      { 
       //AppEventLog.AddError(ex.Message.ToString) 
      } 
     } 

부분이 아래 : 코드 부분 이후 계속 읽어

UPDATE CustomerPhone SET PhoneTypeID = @PhoneTypeID, PhoneNumber = @PhoneNumber WHERE CustomerID = @cusID AND PhoneNumber = '@phNum' 

@PhoneTypeID 및 @PhoneNumber 두 특성으로부터 받고있다. 우리는 사용자 입력 텍스트 상자에서 프레젠테이션 레이어의 이러한 속성에 값을 할당했습니다.

    objSqlCommand.Parameters.AddWithValue("@cusID", cusID); 
        objSqlCommand.Parameters.AddWithValue("@phNum", this.PhoneNumber); 

최종 코드는과 같아야 :

UPDATE CustomerPhone 
SET PhoneTypeID = 7, PhoneNumber = 999444 
WHERE CustomerID = 500 AND PhoneNumber = '911'; 

전화 유형 ID가 7

objSqlCommand.Parameters.AddWithValue("@" + PropertyItem.Name.ToString(), PropertyItem.GetValue(this, null)); 

아래 코드 WHERE 값을 채우고, 아래 부분은 값을 가져 - 텍스트 상자에서 가져온 사용자 값 전화 번호는 999444입니다 - 텍스트 상자에서 가져온 사용자 값

위의 최종 업데이트 문은 SQL 환경에서 작동하지만 응용 프로그램을 통해 을 실행하면 execute 비 쿼리가 실행되어 0 행이 업데이트됩니다! 왜 그런지 궁금해?

답변

3

이 문제입니다 정확히 텍스트 인 '@phNum' - 이 아니고을 사용 중입니다. phNum이라는 매개 변수 원하는 경우

AND PhoneNumber = @phNum 

확실한 이유없이 문자열 리터럴을 또한 분할합니다.이 문장은 :

objSqlCommand.CommandText = "UPDATE " + this.TableName + " SET " + SQL + 
    " WHERE " + cust.PKName + " = @cusID AND PhoneNumber = " + 
    "'" + "@phNum" + "'"; 

더 쉽게 읽을 같은 것이다 :

분명히 당신은 단지 그것을 만들기 위해, 그것에서 따옴표를 제거하려는
objSqlCommand.CommandText = "UPDATE " + this.TableName + " SET " + SQL + 
    " WHERE " cust.PKName + " = @cusID AND PhoneNumber = '@phNum'"; 

:

objSqlCommand.CommandText = "UPDATE " + this.TableName + " SET " + SQL + 
    " WHERE " cust.PKName + " = @cusID AND PhoneNumber = @phNum"; 

약간의 리팩토링을 어느 쪽이든 나쁘지 않을거야. 이 루프 :

foreach (PropertyInfo PropertyItem in this.GetType().GetProperties()) 
{ 
    if (!(PropertyItem.Name.ToString() == cust.PKName)) 
    { 
     if (PropertyItem.Name.ToString() != "TableName") 
     { 
      if (SQL == null) 
      { 
       SQL = PropertyItem.Name.ToString() + " = @" + PropertyItem.Name.ToString(); 
      } 
      else 
      { 
       SQL = SQL + ", " + PropertyItem.Name.ToString() + " = @" + PropertyItem.Name.ToString(); 
      } 
     } 
     else 
     { 
      break; 
     } 
    } 

}

이 같은 더 간단하고 읽을 수있는 것 :

StringBuilder sqlBuilder = new StringBuilder(); 
foreach (PropertyInfo property in this.GetType().GetProperties()) 
{ 
    string name = property.Name; 
    // I believe you had a bug before - the properties being updated 
    // would depend on the ordering of the properties - if it 
    // ran into "TableName" first, it would exit early! 
    // I *suspect* this is what you want 
    if (name != cust.PKName && name != "TableName") 
    { 
     sqlBuilder.AppendFormat("{0} = @{0}, ", name); 
    } 
} 
// Remove the trailing ", " 
if (sqlBuilder.Length > 0) 
{ 
    sqlBuilder.Length -= 2; 
} 

당신은 너무 최종 루프와 비슷한 작업을 수행 할 수 있습니다.

+0

내가 곧 길이 전화 번호, 솔루션을 확인합니다 내가라는 오류 얻을 다시 – peace

+0

될 것입니다 .... 문자열입니다 ... 외래 키 제약 조건
UPDATE 문 충돌을
내가 업데이트하려고하는 테이블에는 두 개의 fk 열과 하나의 일반 열이 있습니다. 기본 키가 없습니다. – peace

+0

CustomerID와 PhoneTypeID는 fuk의 – peace

2

PhoneNumber은 문자열입니까, 아니면 정수입니까?

나는 SET 정수로 표시되지만, WHERE을 리터럴로 확인합니다. 이것이 문제가되지 않을 수 있습니까? 이 정수의 경우

, 시도 :

UPDATE CustomerPhone 
SET PhoneTypeID = 7, PhoneNumber = 999444 
WHERE CustomerID = 500 AND PhoneNumber = 911; 

을이 문자열의 경우, 시도 :

AND PhoneNumber = '@phNum' 

전화 번호를 찾고 :

UPDATE CustomerPhone 
SET PhoneTypeID = 7, PhoneNumber = '999444' 
WHERE CustomerID = 500 AND PhoneNumber = '911';