私は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();
}
}