public virtual int Insert(IDb db, ICollection items) { ErrorIfSPResult(); int result = 0; string sql = GetInsertSql(); IDbCommand cmd = null; IDbDataParameter idP = null; FireTriggers(items, new TriggerEventArgs(db, Timing.BeforeInsert)); try { cmd = db.Connection.CreateCommand(); cmd.CommandText = sql; cmd.CommandType = CommandType.Text; cmd.Transaction = db.Transaction; foreach (SqlColumn column in columns) { // add parameters if (column.IsReadable && !column.IsID) { IDbDataParameter p = cmd.CreateParameter(); p.ParameterName = string.Format("@{0}", column.Ordinal); SqlUtils.PrepParam(p, column.DataType); cmd.Parameters.Add(p); } } if (identity != null) { // add output parameter for identity column idP = cmd.CreateParameter(); idP.ParameterName = "@id"; SqlUtils.PrepParam(idP, identity.DataType); idP.Direction = ParameterDirection.Output; cmd.Parameters.Add(idP); } cmd.Prepare(); foreach (object item in items) { if (item == null) { continue; } foreach (SqlColumn column in columns) { // assign values to all parameters if (column.IsReadable && !column.IsID) { string pname = string.Format("@{0}", column.Ordinal); IDbDataParameter p = (IDbDataParameter)cmd.Parameters[pname]; column.SetParameterValue(p, item); } } TraceObject.Instance.TraceCommand(cmd); result += cmd.ExecuteNonQuery(); if (identity != null) { // write generated identity value back into the object identity.SetValue(item, idP.Value); } } } finally { if (cmd != null) { cmd.Dispose(); cmd = null; } } FireTriggers(items, new TriggerEventArgs(db, Timing.AfterInsert)); return(result); }