private IDataReader GetReader <T>() { string sql = string.Empty; try { if (Capacity < 0 || _filter == null || _schema == null) { TraceLog.WriteError("The {0} schema config is empty.", typeof(T).FullName); return(null); } string tableName = _schema.GetTableName(); if (string.IsNullOrEmpty(tableName)) { TraceLog.WriteError("The {0} schema table name is empty.", _schema.EntityType.FullName); return(null); } DbBaseProvider dbprovider = DbConnectionProvider.CreateDbProvider(_schema); if (dbprovider == null) { TraceLog.WriteError("The {0} ConnectKey:{1} is empty.", _schema.EntityType.FullName, _schema.ConnectKey); return(null); } var command = dbprovider.CreateCommandStruct(tableName, CommandMode.Inquiry); var columns = _schema.GetColumnNames(); command.Columns = string.Join(",", columns); command.OrderBy = (string.IsNullOrEmpty(_filter.OrderColumn) ? _schema.OrderColumn : _filter.OrderColumn) ?? ""; if (Capacity < int.MaxValue && Capacity > 0) { command.Top = Capacity; if (string.IsNullOrEmpty(command.OrderBy)) { string orderStr = ""; foreach (var key in _schema.Keys) { if (orderStr.Length > 0) { orderStr += ","; } orderStr += string.Format("{0}", dbprovider.FormatName(key)); } command.OrderBy = orderStr; } } command.Filter = dbprovider.CreateCommandFilter(); command.Filter.Condition = MergerCondition(_filter.Condition, _schema.Condition); ParseDataParameter(command.Filter); command.Parser(); sql = command.Sql; return(dbprovider.ExecuteReader(CommandType.Text, command.Sql, command.Parameters)); } catch (Exception ex) { TraceLog.WriteError("DB execute reader sql:\"{0}\" error:{1}", sql, ex); } return(null); }
private CommandStruct GenerateCommand <T>(DbBaseProvider dbProvider, T data, SchemaTable schemaTable, EntityPropertyGetFunc <T> getFunc, EnttiyPostColumnFunc <T> postColumnFunc) where T : ISqlEntity { CommandStruct command; if (!(schemaTable.StorageType.HasFlag(StorageType.ReadOnlyDB) || schemaTable.StorageType.HasFlag(StorageType.ReadWriteDB) || schemaTable.StorageType.HasFlag(StorageType.WriteOnlyDB)) || (string.IsNullOrEmpty(schemaTable.ConnectKey) && string.IsNullOrEmpty(schemaTable.ConnectionString))) { return(null); } if (getFunc == null) { getFunc = GetPropertyValue; } IList <string> columns = postColumnFunc != null ? postColumnFunc(data, schemaTable, _isChange) : schemaTable.GetColumnNames(); if (columns == null || columns.Count == 0) { TraceLog.WriteError("Class:{0} is not change column.", data.GetType().FullName); return(null); } string tableName = schemaTable.GetTableName(data.GetCreateTime()); if (data.IsDelete) { command = dbProvider.CreateCommandStruct(tableName, CommandMode.Delete); } else if (schemaTable.AccessLevel == AccessLevel.WriteOnly) { command = dbProvider.CreateCommandStruct(tableName, CommandMode.Insert); } else { command = dbProvider.CreateCommandStruct(tableName, CommandMode.ModifyInsert); } //StringBuilder changeLog = new StringBuilder(); //changeLog.AppendFormat("\"Keys\":\"{0}\"", data.GetKeyCode()); //处理列 foreach (string columnName in columns) { if (columnName.IsEmpty()) { continue; } try { SchemaColumn schemaColumn; if (schemaTable.Columns.TryGetValue(columnName, out schemaColumn)) { if (schemaColumn.Disable || schemaColumn.IsIdentity) { continue; } object value = getFunc(data, schemaColumn); IDataParameter parameter = CreateParameter(dbProvider, columnName, schemaColumn.DbType, value); command.AddParameter(parameter); } } catch (Exception ex) { throw new Exception(string.Format("get {0} column val error.", columnName), ex); } } //处理条件 string[] keyList = schemaTable.Keys; if (keyList.Length == 0) { throw new ArgumentNullException(string.Format("Table:{0} key is empty.", schemaTable.EntityName)); } string condition = string.Empty; command.Filter = dbProvider.CreateCommandFilter(); foreach (string columnName in keyList) { try { SchemaColumn schemaColumn; if (schemaTable.Columns.TryGetValue(columnName, out schemaColumn)) { string keyName = columnName; string paramName = "F_" + columnName; if (condition.Length > 0) { condition += " AND "; } condition += dbProvider.FormatFilterParam(schemaColumn.Name, "", paramName); object value = getFunc(data, schemaColumn); IDataParameter parameter = CreateParameter(dbProvider, paramName, schemaColumn.DbType, value); command.Filter.AddParam(parameter); //主键且自增列更新时,MSSQL与MySql处理不同,MySql需要有主键列 command.AddKey(CreateParameter(dbProvider, keyName, schemaColumn.DbType, value), schemaColumn.IsIdentity); } } catch (Exception ex) { throw new Exception(string.Format("get {0} column val error.", columnName), ex); } } command.Filter.Condition = condition; command.Parser(); return(command); }
private CommandStruct GenerateCommand <T>(DbBaseProvider dbProvider, T data, SchemaTable schemaTable, bool isChange, EntityBeforeProcess handle) where T : AbstractEntity { CommandStruct command = null; if (!schemaTable.IsStoreInDb || (string.IsNullOrEmpty(schemaTable.ConnectKey) && string.IsNullOrEmpty(schemaTable.ConnectionString))) { return(null); } string[] columns = GetColumns(schemaTable, data, isChange); if (columns == null || columns.Length == 0) { TraceLog.WriteError("Class:{0} is not change column.", data.GetType().FullName); return(null); } string tableName = schemaTable.GetTableName(); if (data.IsDelete) { command = dbProvider.CreateCommandStruct(tableName, CommandMode.Delete); } else if (schemaTable.AccessLevel == AccessLevel.WriteOnly) { command = dbProvider.CreateCommandStruct(tableName, CommandMode.Insert); } else { command = dbProvider.CreateCommandStruct(tableName, CommandMode.ModifyInsert); } //StringBuilder changeLog = new StringBuilder(); //changeLog.AppendFormat("\"Keys\":\"{0}\"", data.GetKeyCode()); //处理列 foreach (string columnName in columns) { if (columnName.IsEmpty()) { continue; } SchemaColumn schemaColumn; if (schemaTable.Columns.TryGetValue(columnName, out schemaColumn)) { if (schemaColumn.Disable || schemaColumn.IsIdentity) { continue; } object value = data.GetPropertyValue(schemaColumn.CanRead, columnName); if (handle != null) { var e = new EntityEvent() { Data = data, FieldName = columnName, FieldValue = value }; value = handle(e); } if (CovertDataValue(schemaTable, schemaColumn, ref value)) { //changeLog.AppendFormat(",\"{0}\":\"{1}\"", columnName, value); IDataParameter parameter = CreateParameter(dbProvider, columnName, schemaColumn.DbType, value); command.AddParameter(parameter); } } } //处理条件 string[] keyList = schemaTable.Keys; if (keyList.Length == 0) { throw new ArgumentNullException(string.Format("Table:{0} key is empty.", schemaTable.EntityName)); } string condition = string.Empty; command.Filter = dbProvider.CreateCommandFilter(); foreach (string columnName in keyList) { SchemaColumn schemaColumn; if (schemaTable.Columns.TryGetValue(columnName, out schemaColumn)) { string keyName = columnName; string paramName = "F_" + columnName; if (condition.Length > 0) { condition += " AND "; } condition += dbProvider.FormatFilterParam(schemaColumn.Name, "", paramName); object value = data.GetPropertyValue(schemaColumn.CanRead, columnName); if (handle != null) { var e = new EntityEvent() { Data = data, FieldName = columnName, FieldValue = value }; value = handle(e); } if (CovertDataValue(schemaTable, schemaColumn, ref value)) { IDataParameter parameter = CreateParameter(dbProvider, paramName, schemaColumn.DbType, value); command.Filter.AddParam(parameter); if (!schemaColumn.IsIdentity) { command.AddKey(CreateParameter(dbProvider, keyName, schemaColumn.DbType, value)); } } } } command.Filter.Condition = condition; command.Parser(); return(command); }