/// <summary> /// Импортировать таблицу /// </summary> private static void ImportTable(DataTable srcTable, Tables.TableInfo destTableInfo, int shiftID, StreamWriter writer, out int updRowCnt, out int errRowCnt, out string msg) { // определение режима импорта: только добавление строк или добавление/обновление string idColName = destTableInfo.IDColName; bool tryToUpdate = idColName != "" && srcTable.Columns.Contains(idColName); // получение таблицы, в которую производится импорт DataTable destTable; if (tryToUpdate) { // заполение столбцов и данных таблицы destTable = destTableInfo.GetTable(); } else { // заполение столбцов таблицы destTable = new DataTable(destTableInfo.Name); Tables.FillTableSchema(destTable); } // вывод заголовка и стобцов в журнал импорта if (writer != null) { writer.WriteLine(); WriteTitle(writer, string.Format(AppPhrases.ImportTableTitle, destTableInfo.Name + " (" + destTableInfo.Header + ")")); writer.WriteLine(); WriteColumns(writer, srcTable, AppPhrases.SrcTableColumns); WriteColumns(writer, destTable, AppPhrases.DestTableColumns); } // заполнение таблицы в формате SDF foreach (DataRowView srcRowView in srcTable.DefaultView) { DataRow srcRow = srcRowView.Row; DataRow destRow = null; if (tryToUpdate) { int newID = (int)srcRow[idColName] + shiftID; int rowInd = destTable.DefaultView.Find(newID); // таблица отсортирована по ключу if (rowInd >= 0) destRow = destTable.DefaultView[rowInd].Row; } if (destRow == null) { destRow = destTable.NewRow(); destTable.Rows.Add(destRow); } foreach (DataColumn destColumn in destTable.Columns) { int ind = srcTable.Columns.IndexOf(destColumn.ColumnName); if (ind >= 0 && destColumn.DataType == srcTable.Columns[ind].DataType) { object val = srcRow[ind]; destRow[destColumn] = destColumn.ColumnName == idColName && shiftID > 0 ? (int)val /*ID*/ + shiftID : val; } } } // сохранение информации в базе конфигурации в формате SDF updRowCnt = 0; errRowCnt = 0; DataRow[] errRows = null; try { SqlCeDataAdapter sqlAdapter = destTable.ExtendedProperties["DataAdapter"] as SqlCeDataAdapter; updRowCnt = sqlAdapter.Update(destTable); } catch (Exception ex) { throw new Exception(AppPhrases.WriteDBError + ":\r\n" + ex.Message); } // обработка ошибок if (destTable.HasErrors) { errRows = destTable.GetErrors(); errRowCnt = errRows.Length; } msg = errRowCnt == 0 ? string.Format(AppPhrases.ImportTableCompleted, updRowCnt) : string.Format(AppPhrases.ImportTableCompletedWithErr, updRowCnt, errRowCnt); // вывод результата и ошибок в журнал импорта if (writer != null) { WriteTitle(writer, AppPhrases.ImportTableResult); writer.WriteLine(msg); if (errRowCnt > 0) { writer.WriteLine(); WriteTitle(writer, AppPhrases.ImportTableErrors); foreach (DataRow row in errRows) { if (idColName != "") writer.Write(idColName + " = " + row[idColName] + " : "); writer.WriteLine(row.RowError); } } } }
/// <summary> /// Экспортировать таблицу базы конфигурации в файл формата DAT /// </summary> public static bool ExportTable(Tables.TableInfo srcTableInfo, string destFileName, int minID, int maxID, out string msg) { try { // проверка аргументов метода if (srcTableInfo == null) throw new ArgumentNullException("srcTableInfo"); if (string.IsNullOrWhiteSpace(destFileName)) throw new ArgumentException(AppPhrases.ExportFileUndefied); string dir = Path.GetDirectoryName(destFileName); if (string.IsNullOrWhiteSpace(dir)) throw new DirectoryNotFoundException(AppPhrases.ExportDirUndefied); if (!Directory.Exists(dir)) throw new DirectoryNotFoundException(AppPhrases.ExportDirNotExists); // получение таблицы DataTable srcTable = srcTableInfo.GetTable(); // ограничение диапазона идентификаторов if ((0 < minID || maxID < int.MaxValue) && srcTableInfo.IDColName != "") srcTable.DefaultView.RowFilter = string.Format("{0} <= {2} and {2} <= {1}", minID, maxID, srcTableInfo.IDColName); // сохранение таблицы в формате DAT BaseAdapter adapter = new BaseAdapter(); adapter.FileName = destFileName; adapter.Update(srcTable); msg = AppPhrases.ExportCompleted; return true; } catch (Exception ex) { msg = AppPhrases.ExportError + ":\r\n" + ex.Message; return false; } }