Exemple #1
0
        /// <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);
                    }
                }
            }
        }
Exemple #2
0
        /// <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;
            }
        }