关于循环读取txt表内数据到数据库中

野鼻孔 2016-07-11 12:22:55
Hi,各位大神,
想实现这样一个逻辑,假设:文件夹内有10个txt文本文档,里面每个对应一个sql内的表,且每个文本文档(以及sql中的表)列数均不同。
这边我读取了每个txt的路径。然后每个字段用"|"符号隔开。

我想实现每个txt文本文件自动匹配sql里的表,且列也自动匹配,而不是写10个case.每个case需要写几十个columns.add.放在datatable 中。有什么好办法吗?

private void button1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
//dt.Columns.Add("a");
//dt.Columns.Add("b");
//dt.Columns.Add("c");
//dt.Columns.Add("d");

foreach (string filename in Directory.GetFiles("D:\\InstinctData", "*.txt", SearchOption.AllDirectories))
{
Console.WriteLine(filename);
string strFilePath = filename;
FileStream fs = new FileStream(strFilePath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Unicode);

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source =.;Database=~;Uid=~;Pwd=~";
conn.Open();

string strLine = sr.ReadLine();

while (strLine != null)
{
string[] strArray = new string[4];
strArray = strLine.Split('|');
DataRow dr = dt.NewRow();
dr[0] = strArray[0];
dr[1] = strArray[1];
dr[2] = strArray[2];
dr[3] = strArray[3];
string sql = "insert into A_Test values('" + dr[0] + "','" + dr[1] + "','" + dr[2] + "','" + dr[3] + "')";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
dt.Rows.Add(dr);
strLine = sr.ReadLine();
}


sr.Close();
fs.Close();
conn.Close();
//string filecontent = string.Join("\r\n", System.IO.File.ReadAllLines(filename));
//Console.WriteLine(filecontent);
}

}

求大神给点小代码启发一下。因为这边是insert 语句,必须注明列的。。。很困难。
或者先把sql表中的列读取到gridview中?然后循环列写在insert语句中??

我这边假设有100个columns怎么办?

谢谢
...全文
191 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
D56233577 2016-07-11
  • 打赏
  • 举报
回复
如果你txt的文件名包含表名,那么表就能匹配了,如果你txt内容的第一行存字段名,那么列也能匹配。不管多少列,用一个循环来建DataTable,不需要 case。
野鼻孔 2016-07-11
  • 打赏
  • 举报
回复
引用 1 楼 D56233577 的回复:
省掉你的DataTable,这样就不用纠结了。可以直接写数据库或者建一个Model来承载你的数据。
再给点提示吧,比如用什么model,怎么写数据库,谢谢
D56233577 2016-07-11
  • 打赏
  • 举报
回复
省掉你的DataTable,这样就不用纠结了。可以直接写数据库或者建一个Model来承载你的数据。
  • 打赏
  • 举报
回复
你全部string进去肯定要错的
  • 打赏
  • 举报
回复
sqlbulkcopy是看你的datatable的列类型是否一致的
野鼻孔 2016-07-11
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
1、CSVHelper读取成实体集合(看你这描述txt数据格式就是csv格式) 2、ORM映射 3、循环插入数据库 其实说白了就是怎么读,然后ORM怎么来做插入数据库的事情 如果txt数据量很大,但要求读取时间又很短的话,那还真必须DataTable,然后通过SqlBulkCopy插入数据库
另外我想到个问题,如果进去datatable都是string形式,那么sqlbulkcopy到数据库表中,可否自动匹配不同的类型,因为表中有很多类型,int nvarchar datetime money 等等
bacac131 2016-07-11
  • 打赏
  • 举报
回复
用datatable的话表数据量太大很容易内存溢出 数据文件要包含表名,数据流方法如下: int iBufferSize = 10240;//10mb byte[] buffer = new byte[iBufferSize]; using (FileStream stream = new FileStream(argument.FullPath, FileMode.Open, FileAccess.Read)) { StreamReader fileReader = new StreamReader(stream); long iFileSize = stream.Length; int iTotalCount = (int)Math.Ceiling((double)(iFileSize / iBufferSize)); string[] strRows; string[] strCells; string tmpHalfRow = ""; DataRow dr; int readBytes; while ((readBytes = stream.Read(buffer, 0, iBufferSize)) > 0) { string xx = tmpHalfRow + Encoding.Default.GetString(buffer); strRows = xx.Replace("\n", "#").Split('#'); for (int i = 0; i < strRows.Length; i++) { if (i == strRows.Length - 1) { tmpHalfRow = strRows[i]; continue; } strCells = strRows[i].Split('|'); dr = dt.NewRow(); for (int j = 0; j < strCells.Length - 1; j++) { dr[j] = strCells[j]; } dt.Rows.Add(dr); } if (dt.Rows.Count > 20000 || readBytes < iBufferSize) { ExportToExcel(dt,rowHeight, splitTimes, outPutName,styleList); dt.Clear(); GC.Collect(); splitTimes++; } }
野鼻孔 2016-07-11
  • 打赏
  • 举报
回复
引用 3 楼 D56233577 的回复:
如果你txt的文件名包含表名,那么表就能匹配了,如果你txt内容的第一行存字段名,那么列也能匹配。不管多少列,用一个循环来建DataTable,不需要 case。
能不能给点代码,循环建datatable.谢谢
野鼻孔 2016-07-11
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
1、CSVHelper读取成实体集合(看你这描述txt数据格式就是csv格式) 2、ORM映射 3、循环插入数据库 其实说白了就是怎么读,然后ORM怎么来做插入数据库的事情 如果txt数据量很大,但要求读取时间又很短的话,那还真必须DataTable,然后通过SqlBulkCopy插入数据库
太难了。。。
  • 打赏
  • 举报
回复
1、CSVHelper读取成实体集合(看你这描述txt数据格式就是csv格式) 2、ORM映射 3、循环插入数据库 其实说白了就是怎么读,然后ORM怎么来做插入数据库的事情 如果txt数据量很大,但要求读取时间又很短的话,那还真必须DataTable,然后通过SqlBulkCopy插入数据库

110,539

社区成员

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

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

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