C# CSV 导入数据库

Kevin_Jay_24 2015-02-02 09:54:50
做个导入CSV到MSSQL数据库的工具,数据每行都要处理验证,使用的线程池,但是发现只有一个线程的效果,不明为何,求大神指点
这是button点击事件
for (int i = 0; i < 5; i++)
{
string[] files = list[i].ToArray<string>();

ThreadPool.QueueUserWorkItem(p =>
{
foreach (string file in files)
{
string[] temp = file.Split('\\');
string name = temp[temp.Length - 1].Replace(".csv", "");
int count = 0;
operateCSV.readCsvTxt(file, name, dataType, "Quotes", out count);
//MessageShow(name + " " + count.ToString() + " " + fileCount++);
}
});
}


这是数据处理和写入数据库方法
/// <summary>
/// 读取CSV文件通过文本格式
/// </summary>
/// <param name="strpath"></param>
/// <returns></returns>
public static void readCsvTxt(string strpath, string code, string dataType, string tableName, out int count)
{
string strline;
string[] aryline;


System.IO.StreamReader mysr = new System.IO.StreamReader(strpath);
string sqlStr = "Data Source=localhost;Initial Catalog=StockDataDB;Integrated Security=True";
//数据库
SqlConnection conn = new SqlConnection(sqlStr);
conn.Open();
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
count = 0;
while ((strline = mysr.ReadLine()) != null)
{
aryline = strline.Split(',');
if(aryline[0] == "\"\"")
{
continue;
}
bool isNull = HasNull(aryline);
if (!isNull)
{
continue;
}

string Code = code;
string DataType = dataType;
DateTime dtime = Convert.ToDateTime(aryline[1]);
int Year = dtime.Year;
int Quarter = GetQuarterByMonth(dtime.Month);
int Month = dtime.Month;
int Week = WeekOfYear(dtime);
int Day = dtime.Day;
DateTime DATETIME = dtime;
double OPEN = Convert.ToDouble(aryline[2]);
double HIGH = Convert.ToDouble(aryline[3]);
double LOW = Convert.ToDouble(aryline[4]);
double CLOSE = Convert.ToDouble(aryline[5]);
double VOLUME = Convert.ToDouble(aryline[6]);
double Amount = Convert.ToDouble(aryline[7]);

//Data Source=KOBE;Initial Catalog=StockDataDB;Integrated Security=True


SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO [" + tableName + "] ([Code],[DataType], [Year], [Quarter], [Month], [Week], [Day], [DATETIME], [OPEN], [HIGH], [LOW], [CLOSE], [VOLUME], [Amount]) VALUES (@Code,@DataType, @Year, @Quarter, @Month, @Week, @Day, @DATETIME, @OPEN, @HIGH, @LOW, @CLOSE, @VOLUME, @Amount)";
//添加参数
SqlParameter p = cmd.Parameters.Add("Code", SqlDbType.Char);
p.Value = Code;
p = cmd.Parameters.Add("DataType", SqlDbType.Char);
p.Value = DataType;
p = cmd.Parameters.Add("Year", SqlDbType.Int);
p.Value = Year;
p = cmd.Parameters.Add("Quarter", SqlDbType.Int);
p.Value = Quarter;
p = cmd.Parameters.Add("Month", SqlDbType.Int);
p.Value = Month;
p = cmd.Parameters.Add("Week", SqlDbType.Int);
p.Value = Week;
p = cmd.Parameters.Add("Day", SqlDbType.Int);
p.Value = Day;
p = cmd.Parameters.Add("DATETIME", SqlDbType.DateTime);
p.Value = DATETIME;
p = cmd.Parameters.Add("OPEN", SqlDbType.Float);
p.Value = OPEN;
p = cmd.Parameters.Add("HIGH", SqlDbType.Float);
p.Value = HIGH;
p = cmd.Parameters.Add("LOW", SqlDbType.Float);
p.Value = LOW;
p = cmd.Parameters.Add("CLOSE", SqlDbType.Float);
p.Value = CLOSE;
p = cmd.Parameters.Add("VOLUME", SqlDbType.Float);
p.Value = VOLUME;
p = cmd.Parameters.Add("Amount", SqlDbType.Float);
p.Value = Amount;


//执行
count += cmd.ExecuteNonQuery();

}
conn.Close();
mysr.Close();

}
...全文
118 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anymore 2015-02-02
  • 打赏
  • 举报
回复
思路有点问题,数据校验应该单独处理,然后再进行数据库操作。如果按你这个操作一个csv中间有错误,还得做数据库回滚,要不下次再修改数据导入就重复了。
Kevin_Jay_24 2015-02-02
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
报错了,线程退出了呗 一次只能有一个线程对文件进行打开并读取的操作 2个线程同时执行打开,当然是打不开的,会抛错的 你应该先读取,读完了再开多线程进行验证 而且纯内存操作,你只应该开CPU核数个线程,开多了没有意义
没有报错,我的代码是一个个文件读,现在是线程池多线程不起作用,我U是i7的,那也不至于才一个线程个效果。。。
於黾 2015-02-02
  • 打赏
  • 举报
回复
多核CPU,你可以想象成多个员工 而多线程,就是多任务 你可以把发快件的任务放到列表里,让两个员工分别去执行,虽然仅仅只有2个员工,却可以很快处理100个快件 但是你不能让他俩同时处理同一个快件,那不打起来了 而且只是发快件,真正的操作都是由快递公司去做,他俩不过是填个表 而如果你想让他俩处理搬箱子,拖地之类的跟外部无关的工作,你一次性分100个工作给他俩,他俩也只能一个一个的去做
於黾 2015-02-02
  • 打赏
  • 举报
回复
报错了,线程退出了呗 一次只能有一个线程对文件进行打开并读取的操作 2个线程同时执行打开,当然是打不开的,会抛错的 你应该先读取,读完了再开多线程进行验证 而且纯内存操作,你只应该开CPU核数个线程,开多了没有意义

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧