/// <summary> /// Удаление модели данных командой /// </summary> /// <returns></returns> public virtual Exception Delete() { object keyValue = GetProperty <object>(SchemaTableManager.GetPrimaryKeyField(this.GetType())); if (_dataAdapter != null && _dataAdapter.DeleteCommand != null) { UniDbCommand deleteCmd = new UniDbCommand(_dataAdapter.DeleteCommand.CommandText, this.Connection); if (_dataAdapter.DeleteCommand.Parameters.Count > 0) { UniParameter p = _dataAdapter.DeleteCommand.Parameters[0]; deleteCmd.Parameters.Add(p.ParameterName, p.UniDbType, keyValue); } else { deleteCmd.Parameters.Add("p_" + SchemaTableManager.GetPrimaryKeyField(this.GetType()), UniDbType.Decimal, keyValue); } return(ExecuteDeleteCommand(deleteCmd)); } else { UniDbCommand deleteCmd = UniCommandBuilder.GetDeleteCommand(SchemaTable, TableName, SchemaTableManager.GetUpdatedColumns(TableName, DataTable)); deleteCmd.Parameters[0].Value = keyValue; deleteCmd.Parameters[0].SourceColumn = string.Empty; return(ExecuteDeleteCommand(deleteCmd)); } }
/// <summary> /// Получаем класс и данные (если существуют) /// </summary> /// <typeparam name="T">Тип создаваемых данных</typeparam> /// <param name="primaryKeyValue">Значение первичного ключа</param> /// <param name="ds">Набор данных если требуется</param> /// <returns>Возвращает элемент созданный</returns> public static T GetOrCreate <T>(object primaryKeyValue, DataSet ds = null) where T : UniDbModel, new() { if (ds == null) { ds = new DataSet(); } string tableName = SchemaTableManager.GetDbTableName(typeof(T)); string schemaName = SchemaTableManager.GetSchemaName(typeof(T)); DataTable table = null; if (!ds.Tables.Contains(tableName)) // если таблицы нету, то надо создать с структурой указанной в модели таблицу. { table = SchemaTableManager.CreateTable(tableName, schemaName); ds.Tables.Add(table); } else { table = ds.Tables[tableName]; } T res = new T(); res.DataTable = table; res.GetDbRowData(primaryKeyValue); if (res.DataRow == null) { DataRow row = res.DataTable.NewRow(); res.DataTable.Rows.Add(row); res.DataRow = row; } return(res); }
public UniDbModel() : base() { _connection = UniDbConnection.Current; if (string.IsNullOrWhiteSpace(TableName)) { TableName = SchemaTableManager.GetDbTableName(this.GetType()); } if (string.IsNullOrWhiteSpace(SchemaTable)) { SchemaTable = SchemaTableManager.GetSchemaName(this.GetType()); } }
/// <summary> /// Инициализация адаптера сохранения данных /// </summary> public virtual void InitializeAdapter() { _dataAdapter = new UniDbAdapter(); UniSchemaColumn[] cols = SchemaTableManager.GetUpdatedColumns(TableName, DataTable).ToArray(); if (cols == null) { return; } _dataAdapter.AcceptChangesDuringUpdate = false; _dataAdapter.InsertCommand = UniCommandBuilder.GetInsertCommand(SchemaTable, TableName, cols); _dataAdapter.UpdateCommand = UniCommandBuilder.GetUpdateCommand(SchemaTable, TableName, cols); _dataAdapter.DeleteCommand = UniCommandBuilder.GetDeleteCommand(SchemaTable, TableName, cols); }
/// <summary> /// Метод получения столбцов для обновления или добавления данных /// </summary> /// <returns>Возвращает список столбцов которые терубется обновлять в базе данных</returns> public static IEnumerable <UniSchemaColumn> GetUpdatedColumns(string tableName, DataTable table = null) { UniSchemaTable stable = SchemaTableManager.GetTable(tableName); //здесь требуется реализовать чтение схемы таблицы из текстового файла Реализую позже кажется реализовал if (stable != null) { return(stable.Columns); } else { return(table.Columns.Cast <DataColumn>().Select(r => new UniSchemaColumn() { ColumnName = r.ColumnName, DbColumnName = r.ColumnName, ColumnType = r.DataType, DbColumnType = UniDbTypeHelper.GetUniDbType(r.DataType), IsPrimaryKey = (r.ColumnName).Equals(tableName + "_ID", StringComparison.OrdinalIgnoreCase) })); } }