针对使用强类型DataSet批量数据导入效率低的问题,提出了一种优化算法。在兼顾强类型DataSet节省开发时间特性的同时,在分析强类型DataSet内部方法的工作原理基础上,对数据库连接的状态加以控制,使对离线数据集中的所有数据操作处于连接状态,从而避免了数据库连接的频繁开关操作。实验结果表明,数据的提取所耗费的时间远小于数据导入所用时间,有效提高了批量数据导入效率。
public virtual int Insert(string userName, string password) {
if ((userName == null)) {
this.Adapter.InsertCommand.Parameters[0].Value = global::System.DBNull.Value;
}
else {
this.Adapter.InsertCommand.Parameters[0].Value = ((string)(userName));
}
if ((password == null)) {
this.Adapter.InsertCommand.Parameters[1].Value = global::System.DBNull.Value;
}
else {
this.Adapter.InsertCommand.Parameters[1].Value = ((string)(password));
}
global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State;
if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open)
!= global::System.Data.ConnectionState.Open))//如果之前的连接状态不是Open()
{
this.Adapter.InsertCommand.Connection.Open();//打开连接
}
try {
int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();
return returnValue;
}
finally {
if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) //如果之前的连接状态是close()
{
this.Adapter.InsertCommand.Connection.Close();//关闭连接
}
}
}
它的原理就是说。在我执行一个方法(insert,delete,select)前,如果我我这个连接之前不是打开的,那么就给我打开。
等我这个方法执行完毕之后,就再判断,如果我这个连接之前是关闭的,那么我就关闭。(反而言之,如果之前的状态不是关闭的话,那么它就不会执行关闭连接语句)
根据这个原理。那么我们在插入大数据量的时候(因为每插入一条数据就要打开和关闭数据库连接,所以比较耗时,所以我们在插入大数据量的时候就让所有的插入在一个连接里完成。也就是打开和关闭连接一次,这样的话就省了很多时间了)我们就可以根据这个原理来进行优化
如果我让数据库连接之前就先自己开打,那么它执行
if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open)
!= global::System.Data.ConnectionState.Open))//如果之前的连接状态不是Open()
{
this.Adapter.InsertCommand.Connection.Open();//打开连接
}
语句判断语句的时候就认为连接已经打开了。就不会再次打开了
而在执行完我的方法之后,因为我之前数据库连接是打开的状态而不是关闭状态,所以那么它在执行
if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) //如果之前的连接状态是close()
{
this.Adapter.InsertCommand.Connection.Close();//关闭连接
}
语句的时候就不会给连接关闭了
</pre><p></p><p></p><p></p><p></p><p></p><p><span style="font-size:24px;color:#ff0000;">具体优化代码如下:我已经将T_us表拖入到数据集里了。自动生成了T_usTableAdapter方法</span></p><pre class="csharp" name="code" snippet_file_name="blog_20140316_4_4560963" code_snippet_id="239007"> //插入3000条数据到T_us数据库表
private void button7_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
T_usTableAdapter adapter = new T_usTableAdapter();
sw.Start();
for (int i = 0; i < 3000; i++)
{
adapter.Insert("abc" + i, "123456"); //每插入一条数据就会打开一次数据库连接,插入完毕后又会关闭连接,知道3000条数据插入完毕为止。所以数据库open()colse()也会有3000次
}
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());
//***********************基于强类型DataSet的批量数据导入的优化算法
sw.Start();
adapter.Connection.Open(); //在执行下面的插入语句的时候我就先打开连接
for (int i = 0; i < 3000; i++)
{
adapter.Insert("abc" + i, "123456");
}
adapter.Connection.Close(); //等3000条循环插入语句都插入完毕之后我再自己关闭连接,以达到这3000条数据在同一个连接里插入。节约时间。
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());
}