2011-12-21 3 views
2

CSV 파일에서 SQL Server 2008로 삽입 할 때 중복 데이터가 발생하지 않도록하려면 어떻게해야합니까? CSV에서 SQL INSERT를 수행 할 때 중복 데이터를 방지하는 방법

#region Put to SQL 
       string line = null; 
       bool IsFirst = true; 

       string SqlSyntax = "INSERT INTO ORDRE "; 
       string sqlkey = ""; 
       string sqlvalSELECT = ""; 

       using (StreamReader sr = File.OpenText(filePath + "\\" + downloadname)) 
       { 
        while ((line = sr.ReadLine()) != null) 
        { 
         string[] data = line.Split(';'); 

         if (!String.IsNullOrEmpty(sqlvalSELECT)) sqlvalSELECT += "\nUNION ALL "; 

         if (data.Length > 0) 
         { 
          string sqlval = ""; 
          foreach (object item in data) 
          { 
           if (IsFirst) 
           { 
            if (!String.IsNullOrWhiteSpace(sqlkey)) sqlkey += ","; 
            sqlkey += item.ToString(); 

           } 
           else 
           { 
            if (!String.IsNullOrEmpty(sqlval)) sqlval += ","; 
            sqlval += item.ToString(); 
           } 
          } 
          if (!String.IsNullOrEmpty(sqlval)) sqlvalSELECT += "SELECT " + sqlval; 

          IsFirst = false; 

         } 
        } 
       } 


       string sqlTOTAL = SqlSyntax + "(" + sqlkey + ")" + sqlvalSELECT; 
       //lbl_Message.Text = sqlTOTAL; 

       try 
       { 
        using (var connectionWrapper = new Connexion()) 
        { 
         var connectedConnection = connectionWrapper.GetConnected(); 
         SqlCommand comm_Ftp_Insert = new SqlCommand(sqlTOTAL, connectionWrapper.conn); 
         comm_Ftp_Insert.ExecuteNonQuery(); 

        } 
       } 
       catch (Exception ex) 
       { 
        throw new Exception(ex.Message); 
       } 

       #endregion 

는 내가 2008 년 은 내가 어떻게 CSV 파일이 비교할 수 있습니다 이미 SQL 서버로 가져온 데이터를 수집 메도을? 사전에

/// <summary> 
     /// Get the existed data on SQL 
     /// </summary> 
     /// <returns>Return List of Pers_Ordre with key OrdreId and ClientID</returns> 
     public List<Pers_Ordre> Get_Existed() 
     { 
      try 
      { 
       using (var connectionWrapper = new Connexion()) 
       { 
        var connectedConnection = connectionWrapper.GetConnected(); 
        List<Pers_Ordre> oListOdr = new List<Pers_Ordre>(); 

        string sql_Syntax = Outils.LoadFileToString(HttpContext.Current.Server.MapPath("~/SQL/OrdreFTP_GetExist.sql")); 
        SqlCommand comm_Command = new SqlCommand(sql_Syntax, connectionWrapper.conn); 

        SqlDataReader readerOne = comm_Command.ExecuteReader(); 
        while (readerOne.Read()) 
        { 
         Pers_Ordre oPersOrdre = new Pers_Ordre(); 
         oPersOrdre.OrdreId = Convert.ToInt32(readerOne["NO_ORDRE"]); 
         oPersOrdre.ClientID = readerOne["CODE_CLIENT"].ToString();     
         oListOdr.Add(oPersOrdre); 
        } 
        return oListOdr; 
       } 
      } 
      catch (Exception excThrown) 
      { 
       throw new Exception(excThrown.Message); 
      } 

     } 

감사를, Stev

+1

몇 가지 제안 사항이 있습니다. 'filePath + "\\"+ downloadname'이 아닌'Path.Combine (filePath, downloadname)'을 사용하십시오. 그리고 사용자가'downloadname'의 내용을 변경하는 방법이 있다면 코드는 SQL 삽입에 취약합니다. –

+0

팁 주셔서 감사합니다. – user609511

+0

이 코드에는 몇 가지 이상한 점이 있습니다. 더 많은 것을 배우고 싶다면 http://codereview.stackexchange.com/에 게시하십시오. –

답변

3

이유는 단지 임시 테이블에 CSV에서 데이터를 삽입하고 중복 행을 제거 할 대상 테이블에 삽입 무엇을 필터링하지. 그렇게하면 데이터베이스가 어쨌든 더 빨리 작업 할 수 있습니다.

이것은 당신이 당신이 복제하지 않으려는 DB에있는 컬럼에 고유 제한 조건을 추가 할 수

+0

좋은 생각 ... 난 그냥 그것에 대해 생각하고있어. * – user609511

+0

당신은 삽입하고 실제 테이블에없는 항목을 선택 proc을 작성하는 지주 테이블을 만들 수 있습니다,이 proc을 보유 테이블에 데이터를 TRUNCATE 기억하십시오. –

+0

또한이 http://stackoverflow.com/questions/83471을 보시면 도움이 될만한 몇 가지 아이디어가 있습니다. –

0

희망이 도움

insert into Order 
    select * from Order_Temp 
    WHERE NOT EXISTS 
    (
    SELECT X 
    FROM Order o 
    WHERE o.NO_ORDRE = Order_Temp.NO_ORDRE 
    AND o.CODE_CLIENT = Order_Temp.CODE_CLIENT 
) 

을 필요 가장 쉬운 SQL이다. 그런 다음에 코드를 래핑하십시오. try {} catch {}