实际的开发可能会遇到数据大批量插入数据的问题,若是一条条的循环倒数效率非常低下,这个较好的解决方案
1
2
protected
void
Button1_Click(
object
sender, EventArgs e)
3
{
4
5
DateTime beginTime
=
DateTime.Now;
6
Response.Write(
"
开始时间:
"
+
beginTime.ToString(
"
yyyy年MM月dd日:HH:mm:ss:fff
"
));
7
8
//
构造一个Datatable存储将要批量导入的数据
9
DataTable dt
=
new
DataTable();
10
dt.Columns.Add(
"
id
"
,
typeof
(
string
));
11
dt.Columns.Add(
"
name
"
,
typeof
(
string
));
12
13
//
见识下SqlBulkCopy强悍之处,来个十万条数数据试验
14
int
i;
15
for
(i
=
0
; i
<
100000
; i
++
)
16
{
17
DataRow dr
=
dt.NewRow();
18
dr[
"
name
"
]
=
i.ToString();
19
dt.Rows.Add(dr);
20
}
21
22
string
str
=
ConfigurationManager.ConnectionStrings[
"
connStr
"
].ConnectionString.ToString();
23
//
声明数据库连接
24
SqlConnection conn
=
new
SqlConnection(str);
25
26
conn.Open();
27
//
声明SqlBulkCopy ,using释放非托管资源
28
using
(SqlBulkCopy sqlBC
=
new
SqlBulkCopy(conn))
29
{
30
//
一次批量的插入的数据量
31
sqlBC.BatchSize
=
1000
;
32
//
超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
33
sqlBC.BulkCopyTimeout
=
60
;
34
35
//
設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。
36
sqlBC.NotifyAfter
=
10000
;
37
sqlBC.SqlRowsCopied
+=
new
SqlRowsCopiedEventHandler(OnSqlRowsCopied);
38
39
//
设置要批量写入的表
40
sqlBC.DestinationTableName
=
"
dbo.text
"
;
41
42
//
自定义的datatable和数据库的字段进行对应
43
sqlBC.ColumnMappings.Add(
"
id
"
,
"
tel
"
);
44
sqlBC.ColumnMappings.Add(
"
name
"
,
"
neirong
"
);
45
46
//
批量写入
47
sqlBC.WriteToServer(dt);
48
}
49
conn.Dispose();
50
Response.Write(
"
<br/>
"
);
51
52
53
54
DateTime endTime
=
DateTime.Now;
55
Response.Write(
"
结束时间:
"
+
endTime.ToString(
"
yyyy年MM月dd日:HH:mm:ss:fff
"
));
56
TimeSpan useTime
=
endTime
-
beginTime;
//
使用时间
57
Response.Write(
"
<br/>插入时间:
"
+
useTime.TotalSeconds.ToString()
+
"
秒
"
);
58
59
}
60
//
响应时事件
61
void
OnSqlRowsCopied(
object
sender, SqlRowsCopiedEventArgs e)
62
{
63
Response.Write(
"
<br/> OK!
"
);
64
}
65
66
67
68
这个是程序的运行结果: