2011-10-13 2 views
0

이 커뮤니티에 계속해서 두 번째 질문입니다! 나는 멍청하고 내 약점은 if 또는 amoungst 루프 및 if if 문 내에서의 진술이다.작성 방법 : X를 제외하고 테이블에 삽입, 문구 포함

여기 내 시나리오가 있습니다. 이 메서드는 데이터베이스에 아무 것도 삽입하지만 뭔가를 확인하려고합니다. 데이터베이스에 아무 것도 추가하는 대신, "LIFT"로 시작하는 항목을 입력하고 싶지 않습니다.이 메서드는 해당 줄을 건너 뛰고 다음 줄로 넘어가 길 원합니다. 이 방법으로 이것을 프로그램 할 수있는 방법이 있습니까? 아니면 새로운 방법을 써야합니까? 무리 감사! 당신의 목표는 '리프트'와 해당 컬럼의 손길이 닿지 않은로 시작하는 값을 떠나, '값'의 컬렉션을 반복하는 경우

 public bool BatchInsert(string table, string[] values) 
{ 
    string statement = "INSERT INTO " + table + " VALUES("; 
    for (var i = 0; i < values.Length - 1; i++) 
    { 
     if(values[i].Contains("'")){ 
      values[i] = values[i].Replace("'", "''"); 
     } 
     statement += "'"+values[i]+"', "; 
    } 
    statement += "'" + values[values.Length - 1] + "');"; 

    SqlCommand comm = new SqlCommand(statement, connectionPCICUSTOM); 
    try 
    { 
     comm.Connection.Open(); 
     comm.ExecuteNonQuery(); 
    } 
    catch (Exception e) 
    { 
     KaplanFTP.errorMsg = "Database error: " + e.Message; 
    } 
    finally 
    { 
     comm.Connection.Close(); 
    } 

    return true; 

} 
+1

SQL 주입 취약점에주의하십시오. 이 코드는 해당 코드에 영향을 받기 쉽습니다. – JohnFx

+1

자신을 멍청한 짓이라고 말하지 마십시오. 나는 누군가가 자신에 대해 그렇게 말할 때마다 나는 신음한다. 네가 여기에 온 이유는 배우고 자신을 쏘지 않기 위해서다! ;) –

+0

나는 조지를 안다! : D 나는 모욕적 인 것으로 멍청이를 보지 않고, 초보자를위한 속어 xD 지금부터는 초보자를 사용합니다. – javasocute

답변

1

몇 가지 힌트가 있습니다. 성능을 저하 시키므로 + = 문자열 유형을 사용하지 마십시오. foreach 루프는 코드가 깨끗하고 읽기 쉽기 때문에 인덱스를 망칠 가능성이 적습니다. 또한 적절한 처분을 위해 using 문을 사용하십시오.

System.Linq에 대한 참조가 있다고 가정하면 다음을 사용할 수 있습니다. 나는 그것을 테스트하지는 않았지만 작동해야합니다 :

public bool BatchInsert(string table, IEnumerable<string> values) 
    { 
     var sql = new StringBuilder(); 
     sql.Append("INSERT INTO " + table + " VALUES("); 

     var newValues = values.Where(x => !x.StartsWith("LIFT")).Select(x => string.Format("'{0}'", x.Replace("'", "''"))); 
     sql.Append(string.Join("","", newValues.ToArray())); 
     sql.Append(")"); 

     using (var comm = new SqlCommand(statement, connectionPCICUSTOM)) 
     { 
      try 
      { 
       comm.Connection.Open(); 
       comm.ExecuteNonQuery(); 
      } 
      catch (Exception e) 
      { 
       KaplanFTP.errorMsg = "Database error: " + e.Message; 
      } 
      finally 
      { 
       comm.Connection.Close(); 
      } 
     } 
     return true; 
    } 
+0

안녕 루크, 고마워. System.Linq을 사용하고 있습니다. 내일 체크인 할 생각이 없다면 조정 된 방법을 테스트 할 것입니다. 관심이 있으시면 무엇이 오는지 알려 드리겠습니다. 무리 감사! – javasocute

0

, 당신은 당신의 INSERT 쿼리가 구성되는 방식을 수정해야 할 수도 있습니다. 각 값을 고려해야하는 대신 필요에 따라 열을 추가합니다. 기본적으로, 당신은 양식을 사용해야합니다 예를 들어

INSERT INTO tablename (col1, col2...) VALUES (val1, val2...) 

: 주석의 일부처럼

string statement = "INSERT INTO tablename "; 
string columns = "("; 
string values = "("; 
for (var i = 0; i < values.Length - 1; i++) 
{ 
    //if values doesn't contain lift, add it to the statement 
    if(!values[i].contains("LIFT")){ 
      //columnName is a collection of your db column names 
      columns += "'"+columnName[i]+"'"; 
      values += "'"+values[i]+"'"; 
    } 
} 
columns += ")"; 
values += ")"; 
statement += columns +" VALUES " + values; 

언급 한을,이 방법은 SQL 주입에 당신을 엽니 다. 주의해서 사용하십시오.

편집 : 죄송합니다. 'LIFT'로 시작하는 부분을 놓쳤습니다. .contains() 줄을 다음과 같이 수정하십시오.

if(!values[i].StartsWith("LIFT")){