批量插入或更新数据的时候,如果每条SQL语句都打开关闭一次数据库,如果数据量大的时候,会明显的对数据库造成很大的压力,那么我们能不能使用打开一次数据库,等待所有
语句更新完毕,再关闭数据库呢?
以Oracle数据库为例:
使用如下办法,把SQL语句组合在一起就完成了
但问题又出来了,对于SQL安全,建议一般使用parameter方式,可是如下的语句只能更新一条数据,如何批量更新呢?
语句更新完毕,再关闭数据库呢?
以Oracle数据库为例:
使用如下办法,把SQL语句组合在一起就完成了
update table set class=5 where id=1;
update table set class=6 where id=2;
update table set class=7 where id=3;
update table set class=8 where id=4;
把上述语句放到一个字符串中,可以完成,如下:
string sql=string.Format("update table set class={0} where id={1};update table set class={2} where id={3};update table set class={4} where id=
{5};",5,1,6,2,7,3);
但问题又出来了,对于SQL安全,建议一般使用parameter方式,可是如下的语句只能更新一条数据,如何批量更新呢?
StringBuilder sb = new StringBuilder();
sb.Append("update table set ");
sb.Append(" classid =:classid");
sb.Append(" where id=:id");
OracleParameter[] parameters = {
new OracleParameter(":classid",OracleType.Number,8),
new OracleParameter(":id",OracleType.Number,9)
};
parameters[0].Value = model.classid;
parameters[3].Value = model.ID;
向如上的形式,带parameter参数如何批量插入和更新?
具体的解决办法如下,如果大侠有更好的办法,可以借鉴学习,我的拙法拿出来给没有想出法子的兄弟用一下:
/// <summary>
/// 更新,一次打开数据库批量更新
/// </summary>
/// <param name="list">传入的参数是集合,批量传入</param>
/// <returns>如果更新成功,则返回true</returns>
public static bool Update(List<MO_Model> list) //MO_Model为 model层的用到的类
{
//DB.connectionString,数据库连接,可以调用DB里的connectionString
//打开数据库
using (OracleConnection connection = new OracleConnection(DB.connectionString))
{
int num = 0;//记录更新成功的数量
for (int i = 0; i < list.Count; i++) //循环集合
{
MO_Model model = new MO_Model();
model = list[i];
StringBuilder sb = new StringBuilder();
sb.Append("update table set ");
sb.Append(" classid =:classid");
sb.Append(" where id=:id");
OracleParameter[] parameters = {
new OracleParameter(":classid",OracleType.Number,8),
new OracleParameter(":id",OracleType.Number,9)
};
parameters[0].Value = model.classid;
parameters[3].Value = model.ID;
using (OracleCommand cmd = new OracleCommand())
{
try
{
PrepareCommand(cmd, connection, null, sb.ToString(), parameters); //调用PrepareCommand方法
int obj = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
if (obj>0)
{
num++;
}
}
catch (System.Data.OracleClient.OracleException e)
{
continue;
//throw new Exception(e.Message);
}
}
}
if (num > 0)
{
return true;
}
else
{
return false;
}
}
}
/// <summary>
/// PrepareCommand
/// </summary>
private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = CommandType.Text;
if (cmdParms != null)
{
foreach (OracleParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}