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 IList <string> GetPostColumns(ISqlEntity data, SchemaTable schemaTable, bool isChange) { List <string> columns = null; if (data is AbstractEntity) { var entity = data as AbstractEntity; //修正not change column if (!entity.IsNew && !entity.IsDelete && entity.HasChangePropertys && isChange && schemaTable.Columns.Keys.Count > schemaTable.Keys.Length) { columns = entity.DequeueChangePropertys().ToList(); } else { if (entity.HasChangePropertys) { entity.ResetChangePropertys(); } columns = schemaTable.GetColumnNames(); } } return(columns); }
private void SetEntityValue(SchemaTable schemaTable, IDataReader reader, AbstractEntity entity) { var columns = schemaTable.GetColumnNames(); foreach (var columnName in columns) { SchemaColumn fieldAttr; if (!schemaTable.Columns.TryGetValue(columnName, out fieldAttr)) { continue; } object fieldValue = null; if (fieldAttr.IsSerialized) { var value = reader[columnName]; //指定序列化方式 if (fieldAttr.DbType == ColumnDbType.LongBlob || fieldAttr.DbType == ColumnDbType.Blob) { fieldValue = DeserializeBinaryObject(schemaTable, entity, value, fieldAttr, columnName); } else { fieldValue = DeserializeJsonObject(schemaTable, entity, value, fieldAttr, columnName); } if (fieldValue is EntityChangeEvent) { ((EntityChangeEvent)fieldValue).PropertyName = columnName; } } else { try { fieldValue = entity.ParseValueType(reader[columnName], fieldAttr.ColumnType); } catch (Exception ex) { TraceLog.WriteError("Table:{0} column:{1} parse value error:\r\n{0}", schemaTable.EntityName, columnName, ex); } } if (fieldAttr.CanWrite) { entity.SetPropertyValue(columnName, fieldValue); } else { entity.SetFieldValue(columnName, fieldValue); } } }
private void SetEntityValue(SchemaTable schemaTable, IDataReader reader, AbstractEntity entity) { var columns = schemaTable.GetColumnNames(); foreach (var columnName in columns) { SchemaColumn fieldAttr; if (!schemaTable.Columns.TryGetValue(columnName, out fieldAttr)) { continue; } object fieldValue = null; if (fieldAttr.IsJson) { var value = reader[columnName]; if (fieldAttr.ColumnType.IsSubclassOf(typeof(Array))) { value = value.ToString().StartsWith("[") ? value : "[" + value + "]"; } try { string tempValue = value.ToNotNullString(); if (!string.IsNullOrEmpty(fieldAttr.JsonDateTimeFormat) && tempValue.IndexOf(@"\/Date(") == -1) { fieldValue = JsonUtils.DeserializeCustom(tempValue, fieldAttr.ColumnType, fieldAttr.JsonDateTimeFormat); } else { fieldValue = JsonUtils.Deserialize(tempValue, fieldAttr.ColumnType); } } catch (Exception ex) { TraceLog.WriteError("Table:{0} key:{1} column:{2} deserialize json error:{3} to {4}\r\nException:{5}", schemaTable.Name, entity.GetKeyCode(), columnName, fieldValue, fieldAttr.ColumnType.FullName, ex); } if (fieldValue is EntityChangeEvent) { ((EntityChangeEvent)fieldValue).PropertyName = columnName; } } else { try { fieldValue = entity.ParseValueType(reader[columnName], fieldAttr.ColumnType); } catch (Exception ex) { TraceLog.WriteError("Table:{0} column:{1} parse value error:\r\n{0}", schemaTable.Name, columnName, ex); } } if (fieldAttr.CanWrite) { entity.SetPropertyValue(columnName, fieldValue); } else { entity.SetFieldValue(columnName, fieldValue); } } }
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); }