如图,一个按钮,批量更新整个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分钟的