1,979
社区成员
发帖
与我相关
我的任务
分享DateTime begin = DateTime.Now;
string connectionString = ......;
using(SqlConnection conn = new SqlConnection(connectionString))...{
conn.Open();
SqlDataAdapter sd = new SqlDataAdapter();
sd.SelectCommand = new SqlCommand("select devid,data_time,data_value from CurrentTest", conn);
sd.InsertCommand = new SqlCommand("insert into CurrentTest (devid,data_time,data_value) "
+ " values (@devid,@data_time,@data_value);", conn);
sd.InsertCommand.Parameters.Add("@devid", SqlDbType.Char, 18, "devid");
sd.InsertCommand.Parameters.Add("@data_time", SqlDbType.Char, 19, "data_time");
sd.InsertCommand.Parameters.Add("@data_value", SqlDbType.Int, 8, "data_value");
sd.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
sd.UpdateBatchSize = 0;
DataSet dataset = new DataSet();
sd.Fill(dataset);
Random r = new Random(1000);
for (int i = 0; i < 100000; i++) ...{
object[] row = ...{"DEVID"+i,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),r.Next(1,1000) };
dataset.Tables[0].Rows.Add(row);
if (i % 300 == 0) ...{
sd.Update(dataset.Tables[0]);
dataset.Tables[0].Clear();
}
}
sd.Update(dataset.Tables[0]);
dataset.Tables[0].Clear();
sd.Dispose();
dataset.Dispose();
conn.Close();
}
TimeSpan ts = DateTime.Now - begin;
MessageBox.Show("ts = " + ts.TotalMilliseconds);
对于这个测试我插入10万条数据用时28秒.性能还算可圈可点.但是对于批量更新,搜遍全球的例子,都是把记录Fill到DataSet中然后牧举rows
来更新,就我这个小数据量的测试而言,把10万条数据Fill到DataSet中已经不能工作,如果是百万,千万如何操作?难道一定先把要批操作的记录
先获取到DataSet中?也就是我要更新哪些记录就要选查询这些记录?
DELETE Tb_Name WHERE ID IN()
UPDATE Tb_Name SET [TYPE]='X' WHERE ID IN()
-----------------------------------------------------
如果我新增 涉及到多个表 那样用C# 的事物来处理 应该没关系吧
最多十几个 sql SqlCommand
/// <summary>
/// 用事务执行多个Cmd
/// </summary>
/// <param name="LsCmd">要执行的cmd集合-ListSqlCommand</param>
/// <returns>返回是否执行成功-bool</returns>
public static bool ExecuteTransaction(List<SqlCommand> LsCmd)
{
bool brt = false;
SqlConnection con = GetCon();
OpenCon(con);
SqlTransaction tran = con.BeginTransaction();
try
{
foreach (SqlCommand cmd in LsCmd)
{
cmd.Connection = con;
cmd.Transaction = tran;
cmd.ExecuteNonQuery();
}
tran.Commit();
brt = true;
}
catch (Exception err)
{
tran.Rollback();
brt = false;
throw new Exception(err.Message);
}
finally
{
CloseCon(con);
}
return brt;
}
我在BLL层就会 传一个List<SqlCommand> 如果客户处理数据量大的话 有上千个吧
我自己在想 这样效率肯定不高
怎样进行优化 提高效率 减少服务器负担