基于强类型DataSet的批量数据导入的优化算法

针对使用强类型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());
            



        }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值