Beispiel #1
0
        public IEnumerable <TResult> ExecuteSqlString <TResult>(string commandText, Mapper.IRowMapper <TResult> rowMapper, IDictionary <string, object> dbParameters)
        {
            rowMapper.TablesInfo = this.DatabaseInfo.TablesInfo;
            DbCommand command = this.CreateCommand(commandText);

            if (dbParameters != null && dbParameters.Count != 0)
            {
                //IDictionary<string, object> dbParameters = this.databaseInfo.DbTypeConverter.ToDicParams(parameterValues);
                this.databaseInfo.DbTypeConverter.AddParams(command, dbParameters);
                Logger.Log(Level.Debug, this.sqlLog.GetLogSql(commandText, dbParameters));
            }
            else
            {
                Logger.Log(Level.Debug, commandText);
            }
            List <TResult> data = new List <TResult>();

            if (null != Transaction.Current)
            {
                command.Connection  = Transaction.Current.DbTransactionWrapper.DbTransaction.Connection;
                command.Transaction = Transaction.Current.DbTransactionWrapper.DbTransaction;
                using (var reader = command.ExecuteReader() as OracleDataReader)
                {
                    //reader.FetchSize = reader.RowSize * 2000;
                    if (reader.HasRows)
                    {
                        var r = reader.Cast <IDataRecord>();
                        foreach (var dataRecord in r)
                        {
                            var t = rowMapper.MapRow(dataRecord);
                            data.Add(t);
                        }
                    }
                }
            }
            else
            {
                //由企业库处理分布式事务
                using (var conn = OpenConnection())
                {
                    command.Connection = conn;
                    using (var reader = command.ExecuteReader() as OracleDataReader)
                    {
                        Log.Logger.Log(Level.Debug, reader.RowSize.ToString());
                        Log.Logger.Log(Level.Debug, reader.FetchSize.ToString());
                        //reader.FetchSize = reader.RowSize * 2000;
                        if (reader.HasRows)
                        {
                            var r = reader.Cast <IDataRecord>();
                            foreach (var dataRecord in r)
                            {
                                var t = rowMapper.MapRow(dataRecord);
                                data.Add(t);
                            }
                        }
                    }
                }
            }
            return(data);
        }
Beispiel #2
0
 public IEnumerable <TResult> ExecuteSqlString <TResult>(string commandText, IDictionary <string, object> dbParameters)
     where TResult : new()
 {
     //commandText = commandText.Replace(":", databaseInfo.SqlDialect.DbParameterConstant);
     Mapper.IRowMapper <TResult> rowMapper = this.GetRowMapper <TResult>();
     return(this.ExecuteSqlString(commandText, rowMapper, dbParameters));
 }
Beispiel #3
0
        /// <summary>
        /// 批量查询。where不允许空
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="domains"></param>
        /// <param name="where">where 子句 绑定索引从0 开始</param>
        /// <param name="rowMapper"></param>
        /// <param name="cols"></param>
        /// <returns></returns>
        public virtual List <TResult> Query <TResult>(List <TDomain> domains, string where, Mapper.IRowMapper <TResult> rowMapper, params Expression <Func <TDomain, object> >[] cols)
        {
            if (domains.Count == 0)
            {
                return(null);
            }
            Expression <Func <TDomain, object> >[] selectCols = new Expression <Func <TDomain, object> > [20];
            Expression <Func <TDomain, object> >[] whereCols  = new Expression <Func <TDomain, object> > [20];
            if (!string.IsNullOrEmpty(where))
            {
                var whereCount = Regex.Matches(where, @":\d+");
                Ensure.That(whereCount.Count != 0).IsTrue();
                var t = int.Parse(whereCount[whereCount.Count - 1].Value.TrimStart(':')) + 1;
                int s = cols.Length - t;
                selectCols = cols.Take(s).ToArray();
                whereCols  = cols.Skip(s).ToArray();
            }
            else
            {
                //苗建龙 添加System.前缀
                throw new System.Exception("where 条件不允许为空");
            }

            BatchOracleHelper oracleHelper = new BatchOracleHelper(QuerySession);
            var columnRowData = GetData(domains, whereCols);

            string[] usedProperies = selectCols.Select(expression => expression.PropertyName()).ToArray();//性能不高
            Table    table         = GetTable(this.DefaultColumnMapperStrategy);
            SelectBuilder <TDomain> selectBuilder = new SelectBuilder <TDomain>(table, QuerySession.DatabaseInfo.SqlDialect, usedProperies);
            // private string updateTemplate = "UPDATE {0} SET {1} WHERE {2} ";
            var sql = selectBuilder.CreateSql() + where;

            if (string.IsNullOrEmpty(where))
            {
                sql = sql.Substring(0, sql.Length - 7);
            }

            return(oracleHelper.Query(sql, columnRowData, rowMapper));
            // throw new NotImplementedException();
        }
Beispiel #4
0
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="columnRowData"></param>
        /// <returns></returns>
        public List <TResult> Query <TResult>(string sql, Dictionary <int, object[]> columnRowData, Mapper.IRowMapper <TResult> rowMapper)
        {
            // var iResult = 0;
            List <TResult> data = new List <TResult>();

            rowMapper.TablesInfo = qs.DatabaseInfo.TablesInfo;
            if (columnRowData.Count > 0)
            {
                //columnRowData = ConvertNullValues(columnRowData);
                using (var cmd = this.GetOracleCommand(sql))
                {
                    // 绑定批处理的行数
                    cmd.ArrayBindCount = columnRowData.Values.First().Length; // 很重要
                    cmd.BindByName     = true;
                    cmd.CommandType    = CommandType.Text;
                    cmd.CommandText    = sql;
                    cmd.CommandTimeout = 600; // 10分钟

                    foreach (var objectse in columnRowData)
                    {
                        cmd.Parameters.Add(GetOracleParameter2(objectse));
                    }

                    // 执行批处理
                    if (null != Transaction.Current)
                    {
                        cmd.Connection  = Transaction.Current.DbTransactionWrapper.DbTransaction.Connection as OracleConnection;
                        cmd.Transaction = Transaction.Current.DbTransactionWrapper.DbTransaction as OracleTransaction;
                        using (var reader = cmd.ExecuteReader())
                        {
                            //
                            reader.FetchSize = reader.RowSize * 2000;
                            if (reader.HasRows)
                            {
                                var r = reader.Cast <IDataRecord>();
                                foreach (var dataRecord in r)
                                {
                                    var t = rowMapper.MapRow(dataRecord);
                                    data.Add(t);
                                }
                            }
                        }
                    }
                    else
                    {
                        using (var conn = qs.OpenConnection())
                        {
                            cmd.Connection = conn;
                            using (var reader = cmd.ExecuteReader())
                            {
                                if (reader.HasRows)
                                {
                                    var r = reader.Cast <IDataRecord>();
                                    foreach (var dataRecord in r)
                                    {
                                        var t = rowMapper.MapRow(dataRecord);
                                        data.Add(t);
                                    }
                                }
                            }
                        }
                    }
#if DEBUG
                    LogOperateDone(cmd);
#endif
                    WriteLog(Level.Debug, cmd);

                    return(data);
                }
            }

            return(data);
        }
Beispiel #5
0
        public IEnumerable <TResult> ExecuteSqlString <TResult>(string commandText, Mapper.IRowMapper <TResult> rowMapper, params object[] parameterValues)
        {
            IDictionary <string, object> dbp = this.databaseInfo.DbTypeConverter.ToDicParams(parameterValues);

            return(ExecuteSqlString(commandText, rowMapper, dbp));
        }