首页蓝耳朵|小小蓝耳朵广州图书馆外文室英语儿童读物资源介绍网佛教青年之友旧版收集永硕E盘Phonics Short Vowels Game 
三种方法批量更新数据
所属栏目:ASP.NET(webform)  时间:2010-08-26 18:08  作者:狼子

如图,一个按钮,批量更新整个GridView某一列的所有数据

我用过两个方法:
1、把全部要更新的记录主键编号和每一个要修改的字段记录值,用1.2.3.4.5.的格式分隔,把这些值传到存储过程里,在存储过程里对“.”分割,然后呢,执行update操作

  这个办法很笨蛋,有几个字段要改,就要传几个字段的值,还有就是,因为所有字段的值都用.分割后传给存储过程,所以存储过程的参数定义varchar的长度,就是所有字段的值的长度限制

  这个办法在sql里分割的方法在这里:http://www.nnllok.cn/Read.aspx?id=234

2、循环更新,像这样子:

using (SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnect))
            {
                sqlCommand.Transaction = tran;

                foreach (DataRow dr in dt.Rows)
                {
                    //参数
                    sqlCommand.Parameters.Clear();
                    sqlCommand.Parameters.Add(new SqlParameter("@Price", Convert.ToDecimal(dr["Price"])));
                    sqlCommand.Parameters.Add(new SqlParameter("@ID", Convert.ToInt32(dr["ID"])));
                    //执行命令
                    try
                    {
                        sqlCommand.ExecuteNonQuery();
                    }
                    catch (SqlException ex)
                    {
                        break;
                    }
                }
            }

  这个办法也不好,因为我每循环一次,就向数据库提交一次数据,还有就是,为了在提交数据前做数据检验,我要先对GridView1.Rows做foreach循环,取值,把通过数据有效性检验的数据,添加到一个DataTable里,或者添加到一个Dictionary里记录,最后再对dt或dic循环执行更新操作,就像上面的代码

还有第三种办法,这个方法是刚才看小燕子提交的文件看到的,小燕子好聪明啊,为什么我从来没想过这个办法呢?

下面是小燕子的代码

for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            GridViewRow row = GridView1.Rows[i];
            dRate = Convert.ToDouble(((TextBox)row.Cells[0].FindControl("Txtbili")).Text);
            strId = ((Label)row.Cells[0].FindControl("txtID")).Text;
            strUptsql += "update A_UserRolePrice set Price=" + dRate + " where PayTypeID=" + strId + " and UserRoleID=" + UserRoleId + ";";
        }
        SqlCommand cmd = new SqlCommand(strUptsql, conn);
        cmd.ExecuteNonQuery();

  不管命名规范,不管循环方式,不管string型在循环里拼命累加,不管这里没有判断某一行的数据有没有修改过要不要update,就看这种批量修改数据的办法,用的好好

  这种办法是把每一个需要执行的sql语句,用;分隔后拼接起来,然后一次性提交给数据库,真正批量修改,提交一次,修改一堆

--------------------------

就是,我不确定第2种办法和第3种办法哪一种好,好在哪里,不好在哪里,在什么情况下,应该用哪一种办法,还是不管什么情况下,都用第3种办法更好。。。

第3种办法,要用到sql语句的拼接,如果update的参数值都是数值型的,应该不会有安全性问题和太大的效率差别,sql语句在这种情况下可以拼接的,就是,因为这里是一次性提交数据,如果要修改的记录好多,一次性提交的数据量就会好大,就是,这个数据量不是和第2种办法提交的数据量总和一样子的吗?

如果一个sql语句有300个字符,修改10000个记录,是300 * 10000 = 3000000byte = 2929KB = 2.8M,这个数据量,一次性提交,是完全可以接受的

就是,在MS SQL里,执行2.8M大小的sql语句组,有没有问题?会有什么问题?

对数据库来说,一次执行一个sql语句,肯定比一次执行100个sql语句快,现在的问题是:

如果网页服务器和数据库服务器同机,或者如果windows服务所在服务器和数据库服务器同机,这时候

是传输100次数据到数据库,每次执行一个sql语句好
还是传输一次数据到数据库,一次执行100个sql语句好

这是我用第2种办法操作时windows服务曾经记录的日志:

2010/8/11 13:32:22 开始更新 34591 条数据:2010-08-11 13:32:22

2010/8/11 13:32:15 操作开始:2010-08-11 13:32:15

日志说明更新34591个记录用了166秒。

明天,明天修改服务,测试一下第3种办法

--------------------------------------------------------

今天的测试结果:第三种方法是最好的,效率最高

我重复换着第2、3两种方法测试了很多次,每次更新记录51528条

第2种方法循环一次,提交一次数据,51528个记录平均时间要20多分钟

第3种方法,我把数据写入一个sql文件,再传递到数据库服务器执行,发现数据只有3.9M,一次性在MS SQL里执行的,只是3.9M大小的命令,在这个方法下运行,没有一次时间是超过4分钟的

小楼宝宝的涂鸦花花(Imitater)的博客起名称骨测字皖ICP备06000023号-17