2016-04-19 13 views
0

私はCSVファイルをインポートするようにアプリケーションを設定しました。それは、データテーブルと一時的なSQLテーブルの両方を作成します。コードはCSVを読み込み、それをデータテーブルに格納し、それを一時テーブルに一括インポートします。一時テーブルにインポートすると、今度はそれを実動テーブルにコピーします。私の目的では、.csvファイルをインポートしたときに空の文字列があるため、プロダクションデータベース内でスキップされ、挿入または更新されず、csvにあるものだけを挿入/更新する必要があります。コース)。MySQLは空の文字列クエリをスキップしますか?

PDW0033B50D3、東北営業所、246西ブルバード

そして私に後で言う:例えばだから、

は私が単に次のサイトの情報をインポートインポートするために行く最初の時間を言います場所のアドレスを更新したいので、必要なフィールドだけでcsvファイルを再インポートします。

PDW0033B50D3、290西ブルバード

東北事務所は、データベース内の空白/空の文字列に変わりますので、ときに空今のコードは二行目のデータベースに空の文字列を入れます。どのように私はcsvに空の文字列がある場合、それは私のSQLクエリを介してスキップされるようにするのですか?ここで

は私のコードです:

 public void btnBulkSite_click(object sender, EventArgs e) 
    { 
      //Save File 
     if (FileUpLoad1.HasFile) 
     { 
      FileUpLoad1.SaveAs(@"C:\temp\" + FileUpLoad1.FileName); 
      btnBulkSite.Text = "File Uploaded: " + FileUpLoad1.FileName; 
     } 
     else 
     { 
      btnBulkSite.Text = "No File Uploaded."; 
     } 

      //Create Temporary Table 

     string TmpTable = "CREATE TABLE #TMPBULK (SERVER_ID VARCHAR(13), SITE_NAME VARCHAR(50), SITE_ADDRESS VARCHAR(50))"; 
      //Create DataTable 
     DataTable tblcsv = new DataTable(); 

     tblcsv.Columns.Add(new DataColumn("SERVER_ID", typeof(string))); 
     tblcsv.Columns.Add(new DataColumn("SITE_NAME", typeof(string))); 
     tblcsv.Columns.Add(new DataColumn("SITE_ADDRESS", typeof(string))); 



      //Read in CSV File 
     System.IO.StreamReader stream = new System.IO.StreamReader(FileUpLoad1.PostedFile.InputStream); 

     string ReadCSV = stream.ReadToEnd(); 
     foreach (string csvRow in ReadCSV.Split('\n')) 
      { 

       if (!string.IsNullOrEmpty(csvRow)) 
       { 
       tblcsv.Rows.Add(); 
       int count = 0; 

       foreach (string FileRec in csvRow.Split(',')) 
       { 
        tblcsv.Rows[tblcsv.Rows.Count - 1][count] = FileRec; 

        count++; 
       } 
      } 
     } 

      //SQL CON 
     string conString = ConfigurationManager.ConnectionStrings["css"].ConnectionString; 
     using (SqlConnection con2 = new SqlConnection(conString)) 
     { 
      con2.Open(); 

      //Execute the command to make a temp table 
      SqlCommand cmd = new SqlCommand(TmpTable, con2); 
      cmd.ExecuteNonQuery(); 
      using (BulkOperation bulk = new BulkOperation(con2)) 

      { 


       bulk.DestinationTableName = "#TMPBULK"; 

       bulk.BulkInsert(tblcsv); 
      } 

      //Copy Data from Temp Table to Prod Table 
      string mergeSql = "merge into SITE_INFO as Target " + 
       "using #TMPBULK as Source " + 
       "on " + 
       "Target.SERVER_ID=Source.SERVER_ID " + 
       "and Target.SITE_NAME = Source.SITE_NAME " + 
       "when matched then " + 
       "update set Target.SITE_ADDRESS=Source.SITE_ADDRESS " + 
       "when not matched then " + 
       "insert (SERVER_ID,SITE_NAME,SITE_ADDRESS) values (Source.SERVER_ID,Source.SITE_NAME,Source.SITE_ADDRESS);"; 






      cmd.CommandText = mergeSql; 
      cmd.ExecuteNonQuery(); 
      cmd.CommandText = "drop table #TMPBULK"; 
      cmd.ExecuteNonQuery(); 
     } 
    } 

答えて

0

SITE_NAMEのため
update set Target.SITE_ADDRESS=IF(Source.SITE_ADDRESS='',Target.SITE_ADDRESS,Source.SITE_ADDRESS) 

と同様に

update set Target.SITE_ADDRESS=Source.SITE_ADDRESS 

からあなたSETを変更してみてください。

関連する問題