2011-12-21 10 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 

私はMethodeのは、すでに私はCSVファイルにこれを比較することができますどのようにSQL Server 2008の にインポートしたデータを収集するために作りますか?事前に

/// <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 {}

関連する問題