/// <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); }
/// <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); } } } }
/// <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++; } } }
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); }
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(); }
/// <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); }
/// <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)); }
public DbAccessedEventArgs(string sql, IDbDataParameter[] parameters, DbConnectionSchema connectionSchema) { this.Sql = sql; this.Parameters = parameters; this.ConnectionSchema = connectionSchema; }
/// <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); } }
/// <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) { }
/// <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); } }
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); }