示例#1
0
        /// <summary>
        /// 记录 Sql 执行过程。
        /// </summary>
        /// <param name="sql">The SQL.</param>
        /// <param name="parameters">The parameters.</param>
        /// <param name="connectionSchema">The connection schema.</param>
        public static void LogDbAccessed(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema)
        {
            _dbAccessedCount++;
            _threadDbAccessedCount++;

            lock (_lock)
            {
                try
                {
                    _impl.LogDbAccessed(sql, parameters, connectionSchema);
                }
                catch { }
            }

            if (EnableSqlObervation)
            {
                var handler1 = _threadDbAccessedHandler;
                var handler2 = DbAccessed;
                if (handler1 != null || handler2 != null)
                {
                    var args = new DbAccessedEventArgs(sql, parameters, connectionSchema);

                    if (handler1 != null)
                    {
                        handler1(null, new DbAccessedEventArgs(sql, parameters, connectionSchema));
                    }
                    if (handler2 != null)
                    {
                        handler2(null, new DbAccessedEventArgs(sql, parameters, connectionSchema));
                    }
                }
            }
        }
        public static DbMigrationProvider GetProvider(DbSetting dbSetting)
        {
            DbMigrationProvider provider = null;

            switch (dbSetting.ProviderName)
            {
            case DbConnectionSchema.Provider_SqlClient:
                provider = new SqlServerMigrationProvider();
                break;

            case DbConnectionSchema.Provider_SqlCe:
                provider = new SqlServerCeMigrationProvider();
                break;

            case DbConnectionSchema.Provider_MySql:
                provider = new MySqlMigrationProvider();
                break;

            default:
                if (DbConnectionSchema.IsOracleProvider(dbSetting))
                {
                    provider = new OracleMigrationProvider();
                    break;
                }
                throw new NotSupportedException("This type of database is not supportted now:" + dbSetting.ProviderName);
            }

            provider.DbSetting = dbSetting;

            return(provider);
        }
示例#3
0
        /// <summary>
        /// 记录 Sql 执行过程。
        /// </summary>
        /// <param name="sql">The SQL.</param>
        /// <param name="parameters">The parameters.</param>
        /// <param name="connectionSchema">The connection schema.</param>
        /// <param name="connection">The connection.</param>
        public static void LogDbAccessed(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema, IDbConnection connection)
        {
            if (EnableSqlObervation)
            {
                _dbAccessedCount++;
                _threadDbAccessedCount++;
            }

            try
            {
                _impl.LogDbAccessed(sql, parameters, connectionSchema, connection);
            }
            catch { }

            if (EnableSqlObervation)
            {
                var threadHandler = _threadDbAccessedHandler;
                var handler       = DbAccessed;
                if (threadHandler != null || handler != null)
                {
                    var args = new DbAccessedEventArgs(sql, parameters, connectionSchema);

                    if (threadHandler != null)
                    {
                        threadHandler(null, args);
                    }
                    if (handler != null)
                    {
                        handler(null, args);
                    }
                }
            }
        }
示例#4
0
        /// <summary>
        /// 为所有的实体生成 Id。
        /// </summary>
        /// <param name="batch"></param>
        private void GenerateId(EntityBatch batch)
        {
            var dba      = batch.DBA;
            var entities = batch.InsertBatch;

            //如果批量生成 Id 使用的序列号太低,则需要抛出异常。
            var seqName     = OracleMigrationProvider.SequenceName(batch.Table.Name, batch.Table.IdentityColumn.Name);
            var incrementBy = Convert.ToInt32(dba.QueryValue(
                                                  "SELECT INCREMENT_BY FROM ALL_SEQUENCES WHERE SEQUENCE_NAME = {0} AND SEQUENCE_OWNER = {1}",
                                                  seqName,
                                                  DbConnectionSchema.GetOracleUserId(dba.ConnectionSchema).ToUpper()
                                                  ));

            if (incrementBy < 100)
            {
                throw new InvalidOperationException(string.Format("使用批量保存,表 {0} 的序列 {1} 的每次递增数不能少于 100。建议在数据库生成完成后使用 Rafy.Domain.ORM.BatchSubmit.Oracle.OracleBatchImporter.EnableBatchSequence() 来变更序列的每次递增数以批量生成实体聚合中的所有 Id 标识。", batch.Table.Name, seqName));
            }

            //由于每次生成的 Id 号数有限,所以需要分批生成 Id
            var nextSeqValueSql = string.Format("SELECT {0}.NEXTVAL FROM DUAL", seqName);

            foreach (var section in EnumerateAllBatches(batch.InsertBatch, incrementBy))
            {
                var nextValue = Convert.ToInt64(dba.QueryValue(nextSeqValueSql));
                var startId   = nextValue - incrementBy + 1;
                for (int i = 0, c = section.Count; i < c; i++)
                {
                    var item = section[i];
                    item.Id = startId++;
                }
            }
        }
示例#5
0
        public static DbMigrationProvider GetProvider(DbSetting dbSetting)
        {
            DbMigrationProvider provider = null;

            //ISqlConverter Factory
            switch (dbSetting.ProviderName)
            {
            case DbConnectionSchema.Provider_SqlClient:
                provider = new SqlServerMigrationProvider();
                break;

            case DbConnectionSchema.Provider_SqlCe:
                provider = new SqlServerCeMigrationProvider();
                break;

            //Patrickliu增加的代码块
            case DbConnectionSchema.Provider_MySql:
                provider = new MySqlMigrationProvider();
                break;

            //case "System.Data.Odbc":
            //    return new ODBCProvider();
            default:
                if (DbConnectionSchema.IsOracleProvider(dbSetting))
                {
                    provider = new OracleMigrationProvider();
                    break;
                }
                throw new NotSupportedException("This type of database is not supportted now:" + dbSetting.ProviderName);
            }

            provider.DbSetting = dbSetting;

            return(provider);
        }
示例#6
0
        protected virtual RdbTable CreateRdbTableCore(IRepositoryInternal repo, string dbProvider)
        {
            switch (dbProvider)
            {
            case DbSetting.Provider_SqlClient:
                return(new SqlServerTable(repo, dbProvider));

            case DbSetting.Provider_SqlCe:
                return(new SqlCeTable(repo, dbProvider));

            case DbSetting.Provider_SQLite:
                return(new SQLiteTable(repo, dbProvider));

            case DbSetting.Provider_MySql:
                return(new MySqlTable(repo, dbProvider));

            default:
                if (DbConnectionSchema.IsOracleProvider(dbProvider))
                {
                    return(new OracleTable(repo, dbProvider));
                }
                break;
            }

            throw new NotSupportedException();
        }
示例#7
0
        /// <summary>
        /// 为某个指定的仓库对象构造一个 DbTable
        /// </summary>
        /// <param name="repo"></param>
        /// <returns></returns>
        internal static RdbTable CreateORMTable(IRepositoryInternal repo)
        {
            RdbTable table = null;

            var provider = RdbDataProvider.Get(repo).DbSetting.ProviderName;

            switch (provider)
            {
            case DbSetting.Provider_SqlClient:
                table = new SqlServerTable(repo);
                break;

            case DbSetting.Provider_SqlCe:
                table = new SqlCeTable(repo);
                break;

            case DbSetting.Provider_MySql:
                table = new MySqlTable(repo);
                break;

            default:
                if (DbConnectionSchema.IsOracleProvider(provider))
                {
                    table = new OracleTable(repo);
                    break;
                }
                throw new NotSupportedException();
            }

            table.IdentifierProvider = DbMigrationProviderFactory.GetIdentifierProvider(provider);
            table.DbTypeConverter    = DbMigrationProviderFactory.GetDbTypeConverter(provider);

            var em = repo.EntityMeta;

            foreach (var columnInfo in table.Info.Columns)
            {
                var epm = em.Property(columnInfo.Property);
                if (epm == null)
                {
                    throw new ArgumentNullException(string.Format("{0}.{1} 属性需要使用托管属性进行编写。", table.Info.Class.FullName, columnInfo.Property.Name));
                }

                var column = table.CreateColumn(columnInfo);

                table.Add(column);
            }

            return(table);
        }
示例#8
0
        /// <summary>
        /// 把 Sql 和 参数写入到 content 中。
        /// </summary>
        /// <param name="content"></param>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <param name="connectionSchema"></param>
        protected virtual void WriteSqlAndParameters(StringBuilder content, string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema)
        {
            var isOracle = DbConnectionSchema.IsOracleProvider(connectionSchema);

            var pValues = parameters.Select(p =>
            {
                var value = p.Value;
                if (p.DbType == DbType.DateTime || p.DbType == DbType.Date)
                {
                    if (isOracle)
                    {
                        value = string.Format("to_date('{0}', 'yyyy-MM-dd hh24:mi:ss')", value);
                    }
                    else
                    {
                        value = '\'' + value.ToString() + '\'';
                    }
                }
                else if (value is string)
                {
                    value = '\'' + value.ToString() + '\'';
                    //value = '"' + value.ToString() + '"';
                }
                else if (p.DbType == DbType.Boolean)
                {
                    value = Convert.ToByte(value);
                }
                else if (value == null)
                {
                    value = "null";
                }
                return(value);
            }).ToArray();

            if (this.EmbadParameters)
            {
                var toReplace    = isOracle ? @"\:" : "@";
                var formattedSql = Regex.Replace(sql, toReplace + @"p(?<number>\d+)", @"{${number}}");
                content.AppendFormat(formattedSql, pValues);
            }
            else
            {
                content.Append(sql);
                content.AppendLine();
                content.Append("Parameters:").Append(string.Join(",", pValues));
            }
        }
        public static DbIdentifierQuoter GetIdentifierProvider(string providerName)
        {
            switch (providerName)
            {
            case DbConnectionSchema.Provider_SqlClient:
            case DbConnectionSchema.Provider_SqlCe:
                return(SqlServerIdentifierQuoter.Instance);

            case DbConnectionSchema.Provider_MySql:
                return(MySqlIdentifierQuoter.Instance);

            default:
                if (DbConnectionSchema.IsOracleProvider(providerName))
                {
                    return(OracleIdentifierQuoter.Instance);
                }
                throw new NotSupportedException("This type of database is not supportted now:" + providerName);
            }
        }
        protected override void RunCore(IDbAccesser db)
        {
            var count = Convert.ToInt32(db.QueryValue(
                                            "SELECT COUNT(0) FROM ALL_SEQUENCES WHERE SEQUENCE_NAME = {0} AND SEQUENCE_OWNER = {1}",
                                            this.SequenceName,
                                            DbConnectionSchema.GetOracleUserId(db.ConnectionSchema).ToUpper()
                                            ));

            if (count <= 0)
            {
                db.ExecuteText(string.Format(
                                   @"CREATE SEQUENCE {0}
MINVALUE 1
MAXVALUE 99999999999999999
START WITH 1
INCREMENT BY 1
NOCACHE
ORDER", this.SequenceName));
            }

            //            var sql = string.Format(@"DECLARE T_COUNT NUMBER;
            //BEGIN
            //    SELECT COUNT(*) INTO T_COUNT FROM DUAL WHERE EXISTS(SELECT * FROM ALL_SEQUENCES WHERE SEQUENCE_NAME='{0}');
            //    IF T_COUNT = 0 THEN
            //        EXECUTE IMMEDIATE '
            //        CREATE SEQUENCE {0}
            //        MINVALUE 1
            //        MAXVALUE 99999999999999999
            //        START WITH 1
            //        INCREMENT BY 1
            //        NOCACHE
            //        ORDER
            //        ';
            //    END IF;
            //END;", this.SEQName(op));
        }
示例#11
0
 public DbAccessedEventArgs(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema)
 {
     this.Sql              = sql;
     this.Parameters       = parameters;
     this.ConnectionSchema = connectionSchema;
 }
示例#12
0
        /// <summary>
        /// 记录 Sql 执行过程。
        ///
        /// 把 SQL 语句及参数,写到 SQL_TRACE_FILE 配置所对应的文件中。
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <param name="connectionSchema"></param>
        public override void LogDbAccessed(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema)
        {
            if (_sqlTraceFile == null)
            {
                _sqlTraceFile = ConfigurationHelper.GetAppSettingOrDefault("SQL_TRACE_FILE", string.Empty);
            }

            if (_sqlTraceFile.Length > 0)
            {
                var content = sql;

                if (parameters.Length > 0)
                {
                    var pValues = parameters.Select(p =>
                    {
                        var value = p.Value;
                        if (value is string)
                        {
                            value = '"' + value.ToString() + '"';
                        }
                        return(value);
                    });
                    content += Environment.NewLine + "Parameters:" + string.Join(",", pValues);
                }

                content = DateTime.Now +
                          //"\r\nDatabase:  " + connectionSchema.Database +
                          "\r\nConnectionString:  " + connectionSchema.ConnectionString +
                          "\r\n" + content + "\r\n\r\n\r\n";

                File.AppendAllText(_sqlTraceFile, content, Encoding.UTF8);
            }
        }
示例#13
0
 /// <summary>
 /// 记录 Sql 执行过程。
 /// </summary>
 /// <param name="sql">The SQL.</param>
 /// <param name="parameters">The parameters.</param>
 /// <param name="connectionSchema">The connection schema.</param>
 /// <param name="connection">The connection.</param>
 public virtual void LogDbAccessed(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema, IDbConnection connection)
 {
 }
示例#14
0
        /// <summary>
        /// 记录 Sql 执行过程。
        /// 把 SQL 语句及参数,写到 'Rafy.FileLogger.SqlTraceFileName' 配置所对应的文件中。
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <param name="connectionSchema"></param>
        /// <param name="connection"></param>
        public override void LogDbAccessed(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema, IDbConnection connection)
        {
            if (string.IsNullOrEmpty(this.SqlTraceFileName))
            {
                return;
            }

            var content = new StringBuilder();

            content.AppendLine().AppendLine().AppendLine()
            .Append("--").Append(DateTime.Now).AppendLine();

            var sqlConnection = connection as SqlConnection;

            if (sqlConnection != null)
            {
                content.Append("--ClientConnectionId: ").Append(sqlConnection.ClientConnectionId).AppendLine();
            }

            //"--Database:  " + connectionSchema.Database +
            content.Append("--ConnectionString: ").Append(connectionSchema.ConnectionString).AppendLine();

            if (parameters?.Length > 0)
            {
                this.WriteSqlAndParameters(content, sql, parameters, connectionSchema);
            }
            else
            {
                content.Append(sql);
            }

            content.Append(';');

            lock (this)
            {
                File.AppendAllText(this.SqlTraceFileName, content.ToString(), Encoding.UTF8);
            }
        }
示例#15
0
        public override void LogDbAccessed(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema)
        {
            var content = sql;

            if (parameters.Length > 0)
            {
                var pValues = parameters.Select(p =>
                {
                    var value = p.Value;
                    if (value is string)
                    {
                        value = '"' + value.ToString() + '"';
                    }
                    return(value);
                });
                content += Environment.NewLine + "Parameters:" + string.Join(",", pValues);
            }
            content = DateTime.Now + "\r\nDatabase:  " + connectionSchema.Database + "\r\n" + content + "\r\n\r\n\r\n";
            TraceMessage(content);
        }