Ejemplo n.º 1
0
        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);
        }