/// <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; } }
/// <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 ImportTable(string srcFileName, Tables.TableInfo destTableInfo, int minID, int maxID, int newMinID, string logFileName, out bool logCreated, out string msg) { // проверка аргументов метода if (string.IsNullOrWhiteSpace(srcFileName)) throw new ArgumentException(AppPhrases.ImportFileUndefied); if (!File.Exists(srcFileName)) throw new FileNotFoundException(AppPhrases.ImportFileNotExist); if (destTableInfo == null) throw new ArgumentNullException("destTableInfo"); logCreated = false; StreamWriter writer = null; try { // создание журнала импорта и вывод параметров импорта if (!string.IsNullOrEmpty(logFileName)) { writer = new StreamWriter(logFileName, false, Encoding.UTF8); logCreated = true; WriteTitle(writer, DateTime.Now.ToString("G", Localization.Culture) + " " + AppPhrases.ImportTitle); writer.WriteLine(AppPhrases.ImportSource + srcFileName); } // загрузка импортируемой таблицы в формате DAT BaseAdapter baseAdapter = new BaseAdapter(); DataTable srcTable = new DataTable(); baseAdapter.FileName = srcFileName; try { baseAdapter.Fill(srcTable, true); } catch (Exception ex) { throw new Exception(AppPhrases.LoadTableError + ":\r\n" + ex.Message); } // ограничение диапазона идентификаторов string idColName = destTableInfo.IDColName; if ((0 < minID || maxID < int.MaxValue) && idColName != "") srcTable.DefaultView.RowFilter = string.Format("{0} <= {2} and {2} <= {1}", minID, maxID, idColName); int shiftID = newMinID > 0 ? newMinID - minID : 0; // импорт таблицы int updRowCnt; int errRowCnt; ImportTable(srcTable, destTableInfo, shiftID, writer, out updRowCnt, out errRowCnt, out msg); if (updRowCnt > 0) msg += AppPhrases.RefreshRequired; return errRowCnt == 0; } catch (Exception ex) { msg = AppPhrases.ImportTableError + ":\r\n" + ex.Message; try { if (logCreated) writer.WriteLine(msg); } catch { } return false; } finally { try { writer.Close(); } catch { } } }