c#里边如何批量执行参数化的update,insert语句,因为有多条update或者insert语句,每条语句的参数都是一样的,只是参数值不一样,现在有没有好的办法把这些sql放在一起一起提交给数据库执行,现在是一条条的执行的,如果不用参数化是完全可以组装sql的,但是那样反而有sql注入的问题,求大神解答?
我记得参数化的时候,参数是可以重复使用的。也就是一样可以拼好SQL语句,因为你每条的参数都是一样的。
是的,参数化的时候允许有多个一样的参数传递.
存储过程,把你实参拼接后带进去在split开搞
怎么找准对应的insert,update呢
@tuohaibei: 这个是你的逻辑了啊。你把逻辑从代码中移到tsql中。
@Daniel Cai: 那还是不优雅,哈哈。
如果这些操作互相影响最好还是用触发器或者事务,安全可靠
触发器怎么去解决呢?
@tuohaibei: 前提是这些操作要互相影响的,比如你的更新操作会影响到插入操作
一条一条执行也是很快的,前提是你不要把connection给关掉,你要让他一直开着
忍不住写一发给你,假如我们一个有对象是SqlModel,它有属性Sql,InParas等,这是用来存sql语句和其对应的参数的。
public long ExecuteTrans(List<SqlModel> listSqlModel) { long count = 0; string sql1 = ""; DbParameter[] paras1 = null; using (OracleConnection orclCon = new OracleConnection(ConnectionStringReady)) { if (orclCon.State == ConnectionState.Closed) { orclCon.Open(); } using (OracleCommand cmd = orclCon.CreateCommand()) { OracleTransaction trans = orclCon.BeginTransaction(); cmd.Transaction = trans; try { foreach (SqlModel m in listSqlModel) { sql1 = m.Sql; paras1 = m.InParas; if (m.IsProcedure) { cmd.CommandType = CommandType.StoredProcedure; } else { cmd.CommandType = CommandType.Text; } cmd.CommandText = m.Sql.Trim(); cmd.Parameters.Clear(); if (m.InParas != null) { for (int i = 0; i < m.InParas.Length; i++) { if (m.InParas[i].Value == null) { m.InParas[i].Value = DBNull.Value; } cmd.Parameters.Add(m.InParas[i]); } } if (m.IsProcedure&&m.OutParas != null) { for (int i = 0; i < m.OutParas.Length; i++) { if (m.OutParas[i].Value == null) { m.OutParas[i].Value = DBNull.Value; } m.OutParas[i].Direction = ParameterDirection.Output; cmd.Parameters.Add(m.OutParas[i]); } } count +=cmd.ExecuteNonQuery(); } trans.Commit(); return count; } catch (Exception ex) { trans.Rollback(); throw ex; } } } }