鉴于C#要插5万条记录到Access很慢,在网上找了好久的资料,终于找到了比较有用的信息(转载自Bach)谢谢!
总结如下:
1、导出TXT: select * into [data.txt] in "E:/DATA" "Text;" from TableName
(存放的TXT名)(存放路径) (表名)
注意:这种方式导出的TXT格式与access中的手动导出的格式不一样,会生成一个schema.ini,相当于设置视图里面的数据
2、导入到新表:SELECT * INTO TableName FR0M [data.txt] IN "E:/data" "Text;"
注意:导入到新表需要schema.ini,且TXT格式必须是用1中的语句导出的格式一样
3、表已经存在, 追加导入:INSERT INTO TableName select * from [data.txt] in "E:/data" "Text;"
注意:TXT格式必须是用1中的语句导出的格式一样,可以没有schema.ini
通过以上方法对access的大量数据的操作,速度快,且不卡。
以下是我CAD二次开发时用到上述技术的代码,懒得整理,如有人看不懂,留言我整理一下
DataTable写入txt
private void DatatableToTxt(System.Data.DataTable dt, string txtPath) { StringBuilder strB = new StringBuilder(); for(int i=0;i<dt.Columns.Count;i++) { if(i!=dt.Columns.Count-1) strB.AppendFormat("\"{0}\",",dt.Columns[i].ColumnName); else strB.AppendFormat("\"{0}\"", dt.Columns[i].ColumnName); } strB.Append("\r\n"); for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { if (dt.Columns[j].DataType == typeof(string) && !string.IsNullOrEmpty(dt.Rows[i][j].ToString())) { if (j != dt.Columns.Count - 1) strB.AppendFormat("\"{0}\",", dt.Rows[i][j].ToString()); else strB.AppendFormat("\"{0}\"", dt.Rows[i][j].ToString()); } else { if (j != dt.Columns.Count - 1) strB.AppendFormat("{0},", dt.Rows[i][j].ToString()); else strB.AppendFormat("{0}", dt.Rows[i][j].ToString()); } } if(i!=dt.Rows.Count-1) strB.Append("\r\n"); } Write(txtPath, strB.ToString()); }
新建TXT
public void Write(string path,string text) { if (File.Exists(path)) File.Delete(path); FileStream fs = new FileStream(path, FileMode.Create); StreamWriter sw = new StreamWriter(fs,System.Text.Encoding.Default); //开始写入 sw.Write(text); //清空缓冲区 sw.Flush(); //关闭流 sw.Close(); fs.Close(); }
调用
DatatableToTxt(dt_new, @"D:\Data.txt"); string strinsert = "INSERT INTO GX_PS_WSP select * from [Data.txt] in \"D:/\" \"Text;\" "; ExecuteSql(strinsert, constr);