多条一起插入,例如5000条数据一起插入,语句为“Insert into xx values(...);Insert into xx values(...);...”,5000条数据组合好后,提交一次。 具体的数字根据你程序来定,注意不过超过string对象的最大长度
如果你是从txt里面导入数据库的话,SQL语句:LOAD DATA LOCAL INFILE txt路径 INTO TABLE 表名 FIELDS TERMINATED BY ',' 注:txt路径必须加转义符'\',@"C\\123.txt" FIELDS TERMINATED BY ',' 这里的意思是逗号分割
用数据库连接池,插入
所谓bulk copy它就是“先删除所有键、约束、触发器等等,然后拷贝记录,然后再重新启用这些东西”。这跟你自己向一个“没有任何键、约束、触发器的新数据库表”完成插入数据,是一样的。自己懂一些编程机制,可以免得被简单的东西给忽悠了,简单的东西你完全可以自己去实现并测试其效率。
具体的数字根据你程序来定,注意不过超过string对象的最大长度
注:txt路径必须加转义符'\',@"C\\123.txt" FIELDS TERMINATED BY ',' 这里的意思是逗号分割
MSSQL SERVER自带功能 先导进去 然后再更新密码字段实现加密吧!
http://www.hanwangtx.com/sql/201209_26516.html
private void btLoadData_Click(object sender, EventArgs e)
{
string dataFile = "CustomersData.xml";
ds.ReadXml(dataFile);
bindingSource1.DataSource = ds;
bindingSource1.DataMember = "Customers";
dataGridView1.DataSource = bindingSource1;
}
/// <summary>
/// 使用新的API,批量导入,这个速度很快,大约26毫秒,很显然,这种方式只写一次日志,不会为每一行写日志
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btBCP_Click(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
SqlBulkCopy bcp = new SqlBulkCopy(conn);
bcp.DestinationTableName = "Customers";
bcp.BatchSize = 100;//这是批尺寸可以调整
for (int i = 0; i < 11; i++)
{
bcp.ColumnMappings.Add(i, i);
}
TimeSpan startTime = System.Diagnostics.Process.GetCurrentProcess().UserProcessorTime;
conn.Open();
bcp.WriteToServer(ds.Tables[0]);
TimeSpan duration = System.Diagnostics.Process.GetCurrentProcess().UserProcessorTime.Subtract(startTime);
MessageBox.Show("已经全部插入成功,所用时间为" + duration.Milliseconds.ToString() + "毫秒"); }
}
字段与txt中对应顺序一致bulk insert 表名
from 'c:\1.txt'
with(
fieldterminator='\t',--tab分隔
rowterminator='\n'--回车换行
)
50多g的文件,就是单纯从C硬盘copy到D硬盘,也需20分钟左右,sql server是否有对如此大文件的快速处理能力,
如果中途出错,将前功尽弃.
所以建议先分为多个小txt文件,对小文件试用楼上的各种导入方法,找出最优方法.
全部文件数据导入后,再处理数据重复问题
sql server可以用批处理bcp导入,速度很快,字段以tab分割
单纯插入数据库,我之前试过,当时的配置不记得了,好像一秒只能插入1000条左右记录。如果是一百万条,那就是要1000秒,也就是16分钟。
所以估计差不多半个小时就可以完成了。