應用環境:visual studio 2010開發工具,Database為Sql2008以上版本

最近在生產環境中需要開發一款應用程式,上傳電子檔(.csv)資料至Database

最初方案:

以txt方式打開Csv檔案,逐行進行數據上傳處理,代碼見下文。因為需要上傳N台機器產生的檔案,每天數據量非常龐大,並且在上傳時要進行篩選去重,并保留最新的(以測試時間為準)測試記錄,導致以上方案在執行時,當天的資料無法在當天上傳完成,嚴重影響第二天的資料匯總和報表的生成。

改善方案:

因為資料太多太慢被老闆不知道K了多少次。本來想要使用多線程解決,但是考慮到線程間的安全問題,最終還是放棄額。後來思考為什麼不能把整個Csv檔案用放入Table中進行上傳,減少Database的訪問次數,并降低佔用網絡帶寬。

話不多少,先上改善前後的效果圖相差竟然有12秒之多.效率提升43倍之多。

詳細代碼如下:

獲取檔案并逐行讀取資料代碼

private void Readlog()

{

state = false;

foreach (string a in Directory.GetFiles(logfile, "*.csv"))

{

if (GetDataSet.FileCopy(a, logbak + "\\" + a.Substring(a.LastIndexOf("\\") + 1)) == true)

{

string[] read = File.ReadAllLines(a, Encoding.GetEncoding("GB18030"));

for (int i = 1; i < read.Length; i++)

{

if (DataSave(a.Substring(a.LastIndexOf("\\") + 1), read[i].ToString()) == false)

{

ErrorWrite(a.Substring(a.LastIndexOf("\\") + 1) + ":LINE(" + i + ")Write Error");

continue;

}

}

GetDataSet.DeleteFile(a);

}

}

}

上傳資料代碼

private bool DataSave(string a, string sr)

{

try

{

f = false;

SqlConnection con = new SqlConnection();

SqlCommand com = new SqlCommand();

string sql;

con.ConnectionString = "#####";

//ArrayList Panel = new ArrayList();

string[] Panel;

Panel = sr.ToString().Split(',');

com.CommandType = CommandType.Text;

sql = "Insert Avi_Data " +

"([CreateMachine No],[Machie Model],[Model no],[Panel Barcode],[MCH],[Board ID],[Pin NO],[Bad board result],[Pitch FINGER]" +

",[Pitch FINGER(Spec)],[Width FINGER],[Width FINGER (Spec)],[FINGER to Board EDGE SMALL],[FINGER to Board EDGE SMALL(Spec)],[FINGER to Board EDGE LARGE],[FINGER to Board EDGE LARGE(Spec)]" +

",[PCB Width_Finger Area],[PCB Width_Finger Airea (Spec)],[CreateDatetime],[FileName]) values(";

for (int i = 0; i < Panel.Length; i++)

{

sql = sql + "'" + Strings.StrConv(Panel[i].ToString().Trim(), VbStrConv.TraditionalChinese, 0) + "',";

}

sql = sql + "Getdate(),'" + a + "')";

com.CommandText = sql;

com.Connection = con;

con.Open();

com.ExecuteNonQuery();

con.Close();

AddItem(Panel[3].ToString() + ":" + Panel[5].ToString()+"測試資料已上傳!");

return true;

}

catch(Exception ex)

{

ErrorWrite(ex.ToString());

return false;

}

}

改善后方案實施步驟:

1、 在DataBase中創建table變量。

CREATE TYPE [dbo].[MultiRowsInsert] AS TABLE

2、 創建對應的數據保存的存儲過程。

CREATE PROCEDURE [dbo].[InsertMultiRow]

@DataTable dbo.MultiRowsInsert readonly

as

declare @ID int,@MaxID int

set @ID=1

set @MaxID=(Select max(ID) from @DataTable)

while @ID<=@MaxID

begin

insert Avi_Data

select[CreateMachine No],[Machie Model],[Model no],[Panel Barcode],[MCH],[Board ID],[Pin NO],[Bad board result]

,[Pitch FINGER],[Pitch FINGER(Spec)],[Width FINGER],[Width FINGER (Spec)],[FINGER to Board EDGE SMALL]

,[FINGER to Board EDGE SMALL(Spec)],[FINGER to Board EDGE LARGE],[FINGER to Board EDGE LARGE(Spec)]

,[PCB Width_Finger Area],[PCB Width_Finger Airea (Spec)],GETDATE(),[FileName]

from @DataTable

where ID=@ID

set @ID=@ID+1

end

3、 修改程式代碼。

以下為讀取Csv檔案代碼

private void Readlog()

{

state = false;

foreach (string a in Directory.GetFiles(logfile, "*.csv"))

{

if (GetDataSet.FileCopy(a, logbak + "\\" + a.Substring(a.LastIndexOf("\\") + 1)) == true)

{

string[] read = File.ReadAllLines(a, Encoding.GetEncoding("GB18030"));

DataTable TableInsert = new DataTable();

TableInsert.Columns.Add("ID", typeof(int));

TableInsert.Columns.Add("CreateMachine No", typeof(string));

TableInsert.Columns.Add("Machie Model", typeof(string));

TableInsert.Columns.Add("Model no", typeof(string));

TableInsert.Columns.Add("Panel Barcode", typeof(string));

TableInsert.Columns.Add("MCH", typeof(string));

TableInsert.Columns.Add("Board ID", typeof(string));

TableInsert.Columns.Add("Pin NO", typeof(string));

TableInsert.Columns.Add("Bad board result", typeof(string));

TableInsert.Columns.Add("Pitch FINGER", typeof(string));

TableInsert.Columns.Add("Pitch FINGER(Spec)", typeof(string));

TableInsert.Columns.Add("Width FINGER", typeof(string));

TableInsert.Columns.Add("Width FINGER (Spec)", typeof(string));

TableInsert.Columns.Add("FINGER to Board EDGE SMALL", typeof(string));

TableInsert.Columns.Add("FINGER to Board EDGE SMALL(Spec)", typeof(string));

TableInsert.Columns.Add("FINGER to Board EDGE LARGE", typeof(string));

TableInsert.Columns.Add("FINGER to Board EDGE LARGE(Spec)", typeof(string));

TableInsert.Columns.Add("PCB Width_Finger Area", typeof(string));

TableInsert.Columns.Add("PCB Width_Finger Airea (Spec)", typeof(string));

TableInsert.Columns.Add("FileName", typeof(string));

for (int i = 1; i < read.Length; i++)

{

string[] ReadCloumn;

int c=1;

ReadCloumn=read[i].Split(',');

DataRow dr = TableInsert.NewRow();

dr[0] = i;

while (c <= ReadCloumn.Length)

{

dr[c] = ReadCloumn[c-1].Trim();

c++;

}

dr[c] = a.Substring(a.LastIndexOf("\\") + 1);

TableInsert.Rows.Add(dr);

}

if (SaveData(TableInsert) == false)

{

int sn = a.Split('_').Length - 2;

ErrorWrite(a.Split('_')[sn] + ":Write Error");

continue;

}

else

{

int sn=a.Split('_').Length-2;

AddItem( a.Split('_')[sn]+ "測試資料已上傳!");

GetDataSet.DeleteFile(a);

}

}

}

}

數據保存代碼

private bool SaveData(DataTable dt)

{

try

{

SqlConnection con = new SqlConnection();

SqlCommand com = new SqlCommand();

con.ConnectionString = "######";

SqlParameter[] paras = new SqlParameter[]

{

new SqlParameter("@DataTable",dt)

};

string msg= GetDataSet.RunSqlProdurce("InsertMultiRow", paras, con);

if (msg == "ok")

return true;

else

{

return false;

}

}

catch (Exception ex)

{

return false;

}

}

以上為完整代碼,如有更好的方案,還請各方大神不吝賜教……

.net批量上傳Csv檔資料應用程序開發總結的更多相关文章

  1. 將UNITY作品上傳到Facebook App!

    前言 大家好,今天要來介紹如何用UNITY 將製作好的遊戲上傳到Facebook,也就是Facebook App.近期Facebook與Unity合作而推出了新的插件,利用插件可上傳分數.邀請好友.P ...

  2. Active Record: 資料庫遷移(Migration) (转)

    Active Record: 資料庫遷移(Migration) Programming today is a race between software engineers striving to b ...

  3. Delphi APP 開發入門(八)SQLite資料庫

    Delphi APP 開發入門(八)SQLite資料庫 分享: Share on facebookShare on twitterShare on google_plusone_share   閲讀次 ...

  4. [Xamarin] 開啟另外一個Activity 並且帶資料 (转帖)

    每隻App是透過許多畫面所組成的,當然可能主畫面之外,都會有許多其他的頁面 再Android 設計中畫面會有配合的Activity 當然在這之前,最好事先了解一下,Android 關於生命週期的規劃 ...

  5. [转]SQL Server 安全性概論與無法刪除資料庫使用者的解決辦法

    經常有人來問我特定 SQL Server 資料庫裡的使用者無法刪除的問題,這問題其實跟 SQL Server 的安全性架構有很大關係,解決這個問題當然還是瞭解觀念的重要性大於知道如何解決問題.除了講解 ...

  6. 如何將 MySQL 資料庫轉移到 Microsoft SQL Server 與 Azure SQL Database

    MySQL 是相當常用之資料庫伺服器,而微軟雲端服務 Microsoft Azure 上 Azure SQL Database 是一個功能強大且經濟實惠的選擇,透過本篇文章,使用 SQL Server ...

  7. jQuery無刷新上傳之uploadify簡單試用

    先簡單的侃兩句:貌似已經有兩個月的時間沒有寫過文章了,不過仍會像以前那样每天至少有一至兩個小時是泡在园子裏看各位大神的文章.前些天在研究“ajax無刷新上傳”方面的一些插件,用SWFUpload實現了 ...

  8. C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem

    原帖:https://tokyo.zxproxy.com/browse.php?u=uG7kXsFlW1ZmaxKEvCzu8HrCJ0bXIAddA1s5dtIUZ%2FYzM1u9JI7jjKLT ...

  9. [ASP.NET] 如何利用Javascript分割檔案上傳至後端合併

    最近研究了一下如何利用javascript進行檔案分割上傳並且透過後端.特地記錄一下相關的用法 先寫限制跟本篇的一些陷阱 1.就是瀏覽器的支援了 因為本篇有用到blob跟webworker 在ie中需 ...

随机推荐

  1. CSS hack前传——背景图片全屏

    在之前的博客CSS hack中我有提到,一个问题的解决让我对CSS hack的态度从不屑一顾,到认真研究了实验一下,事情是这样的,最近产品发布,向来狂妄的我被一个bug纠缠住了,甚至丧气的表示我做不出 ...

  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明

    这里所说的高级接口是指面向通过认证的服务号开通的高级功能. 高级功能大致可以分类为: 用户接口 分组接口 客服接口(有别于之前介绍的多客服) 群发接口 多媒体接口 二维码接口 模板消息接口(不是所有账 ...

  3. IOS UIView 01-View开始深入 绘制像素到屏幕上

    注:本人是翻译过来,并且加上本人的一点见解. 前言 一个像素是如何绘制到屏幕上去的?有很多种方式将一些东西映射到显示屏上,他们需要调用不同的框架.许多功能和方法的结合体.这里我们大概的看一下屏幕之后发 ...

  4. IOS Animation-CAKeyframeAnimation例子(简单动画实现)

    在阅读本文之前,可以看看 CABasicAnimation的例子 也可以看看IOS Animation-CABasicAnimation.CAKeyframeAnimation详解&区别&am ...

  5. 腾讯Ubuntu云虚拟主机设置ftp服务器

    刚申请了免费的腾讯云主机, 发现还要想办法自己的服务器代码传到云主机上 在网上搜了很多方法介绍, 照着设置完后都无法正常连接 最后半夜尿醒来睡不着找到一篇站内文章, 提到必须注释掉一行代码 这个是其他 ...

  6. Atitti 跨语言异常的转换抛出 java js

    Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...

  7. 每天一个linux命令(21):find命令之xargs

    在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...

  8. Java基础-接口中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,

    36.中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产.请编写一个java应用程序描述上述的体制现象. 要求如下: (1)该应用程序中有一个“党中央”接口 ...

  9. 一步一步教你安装openstack

    openstack,安装的门槛比较高,而且相当麻烦,很多的安装文档作者省了不少安装步骤.这对初学的人带来了很大的麻烦,也许作者轻易节省一步,就会创成后面的安装失败.而且初学者由于对openstack不 ...

  10. 为大家分享一个 Ajax Loading —— spin.js

    我们在做Ajax 异步请求的时候,一般都会利用一个动态的 Gif 小图片来制作一个Ajax Loading ,以便增加用户体验. 今天在网上发现了一个 Spin.js ,该 js 脚本压缩后5k,可以 ...