Пример #1
0
        /// <summary>
        /// 执行查询
        /// </summary>
        /// <param name="sqls"></param>
        /// <returns></returns>
        public int ExecuteNonQuery(params SqlQuery[] sqls)
        {
            if (sqls.Length == 0)
            {
                throw new ArgumentOutOfRangeException("sqls", "SQLEntity至少应指定一个!");
            }

            DbTransaction trans = null;
            DbCommand     cmd;
            int           result = 0;

            DbConnection conn = this.createNewConnection();

            //打开连接并设置事务
            trans = conn.BeginTransaction();


            SqlEntityHandler sh = s =>
            {
                //创建Command,并设置连接
                cmd = this.CreateCommand(s.Sql);

                cmd.Connection = conn;
                //自动判断是T-SQL还是存储过程
                cmd.CommandType = procedureRegex.IsMatch(s.Sql)
                    ? CommandType.Text
                    : CommandType.StoredProcedure;
                //添加参数
                if (s.Parameters != null)
                {
                    cmd.Parameters.AddRange(s.Parameters);
                }
                //使用事务
                cmd.Transaction = trans;

                try
                {
                    //SQLite不支持并发写入
                    if (this.DbType == DataBaseType.SQLite)
                    {
                        Monitor.Enter(locker);
                        result += cmd.ExecuteNonQuery();
                        Monitor.Exit(locker);
                    }
                    else
                    {
                        result += cmd.ExecuteNonQuery();
                    }
                    cmd.Dispose();
                    this.callMiddleware("ExecuteNonQuery", s.Sql, s.Parameters, null);
                }
                catch (Exception ex)
                {
                    this.callMiddleware("ExecuteNonQuery", s.Sql, s.Parameters, ex);
                    cmd.Dispose();
                    throw ex;
                }
            };

            try
            {
                foreach (SqlQuery sql in sqls)
                {
                    sql.Parse(this.GetAdapter());
                    sh(sql);
                }
                //提交事务
                trans.Commit();
            }
            catch (DbException ex)
            {
                //如果用事务执行,则回滚
                trans.Rollback();

                //重新抛出异常
                throw ex;
            }
            finally
            {
                //关闭连接
                conn.Close();
            }
            return(result);
        }
Пример #2
0
        /// <summary>
        /// 执行查询
        /// </summary>
        /// <param name="sqls"></param>
        /// <returns></returns>
        public int ExecuteNonQuery(params SqlQuery[] sqls)
        {
            if (this._totalOpen)
            {
                foreach (SqlQuery sql in sqls)
                {
                    this.AddTotalSql(sql.Sql);
                }
            }

            if (sqls.Length == 0)
            {
                throw new ArgumentOutOfRangeException("sqls", "SQLEntity至少应指定一个!");
            }

            DbTransaction trans = null;
            DbCommand     cmd;
            int           result = 0;

            DbConnection conn = this.CreateOpenedConnection();

            //打开连接并设置事务
            trans = conn.BeginTransaction();


            SqlEntityHandler sh = s =>
            {
                //创建Command,并设置连接
                cmd            = this.CreateCommand(s.Sql);
                cmd.Connection = conn;

                //自动判断是T-SQL还是存储过程
                cmd.CommandType = procedureRegex.IsMatch(s.Sql)
                    ? CommandType.Text
                    : CommandType.StoredProcedure;

                //添加参数
                if (s.Parameters != null)
                {
                    cmd.Parameters.AddRange(s.ToParams(dbFactory));
                }

                //使用事务

                cmd.Transaction = trans;

                result += cmd.ExecuteNonQuery();
            };

            try
            {
                foreach (SqlQuery sql in sqls)
                {
                    sh(sql);
                }

                //提交事务

                trans.Commit();
            }
            catch (DbException ex)
            {
                //如果用事务执行,则回滚
                trans.Rollback();

                //重新抛出异常
                throw ex;
            }
            finally
            {
                //关闭连接
                conn.Close();
            }


            return(result);
        }