Ejemplo n.º 1
0
 /// <summary>
 /// Вывести в журнал столбцы таблицы
 /// </summary>
 private static void WriteColumns(StreamWriter writer, DataTable dataTable, string subTitle)
 {
     AppUtils.WriteTitle(writer, subTitle);
     if (dataTable.Columns.Count > 0)
     {
         foreach (DataColumn column in dataTable.Columns)
         {
             writer.WriteLine(column.ColumnName + " (" + column.DataType + ")");
         }
     }
     else
     {
         writer.WriteLine(AppPhrases.NoColumns);
     }
     writer.WriteLine();
 }
Ejemplo n.º 2
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();
                AppUtils.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)
                {
                    object curID  = srcRow[idColName];
                    object newID  = curID is int?(int)curID + shiftID : curID;
                    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)
            {
                AppUtils.WriteTitle(writer, AppPhrases.ImportTableResult);
                writer.WriteLine(msg);

                if (errRowCnt > 0)
                {
                    writer.WriteLine();
                    AppUtils.WriteTitle(writer, AppPhrases.ImportTableErrors);

                    foreach (DataRow row in errRows)
                    {
                        if (idColName != "")
                        {
                            writer.Write(idColName + " = " + row[idColName] + " : ");
                        }
                        writer.WriteLine(row.RowError);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Импортировать все таблицы базы конфигурации из заданной директории
        /// </summary>
        public static bool ImportAllTables(string srcDir, List <Tables.TableInfo> destTableInfoList,
                                           string logFileName, out bool logCreated, out string msg)
        {
            // проверка аргументов метода
            if (srcDir == null)
            {
                throw new ArgumentNullException("srcDir");
            }

            if (destTableInfoList == null)
            {
                throw new ArgumentNullException("destTableInfoList");
            }

            if (logFileName == null)
            {
                throw new ArgumentNullException("logFileName");
            }

            logCreated = false;
            StreamWriter writer = null;

            try
            {
                // создание журнала импорта и вывод параметров импорта
                writer     = new StreamWriter(logFileName, false, Encoding.UTF8);
                logCreated = true;
                AppUtils.WriteTitle(writer, DateTime.Now.ToString("G", Localization.Culture) + " " +
                                    AppPhrases.ImportTitle);
                writer.WriteLine(AppPhrases.ImportSource + srcDir);

                // проверка существования импортируемой директории
                if (!Directory.Exists(srcDir))
                {
                    throw new DirectoryNotFoundException(AppPhrases.ImportDirNotExist);
                }

                // импорт таблиц, файлы которых существуют в заданной директории
                int totalUpdRowCnt = 0;
                int totalErrRowCnt = 0;
                int updRowCnt;
                int errRowCnt;
                srcDir = ScadaUtils.NormalDir(srcDir);

                foreach (Tables.TableInfo destTableInfo in destTableInfoList)
                {
                    string srcFileName = srcDir + destTableInfo.FileName;

                    if (File.Exists(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 s;
                        ImportTable(srcTable, destTableInfo, 0, writer, out updRowCnt, out errRowCnt, out s);
                        totalUpdRowCnt += updRowCnt;
                        totalErrRowCnt += errRowCnt;
                    }
                }

                msg = totalErrRowCnt == 0 ? string.Format(AppPhrases.ImportCompleted, totalUpdRowCnt) :
                      string.Format(AppPhrases.ImportCompletedWithErr, totalUpdRowCnt, totalErrRowCnt);

                // вывод результата в журнал импорта
                writer.WriteLine();
                AppUtils.WriteTitle(writer, AppPhrases.ImportResult);
                writer.WriteLine(msg);

                if (totalUpdRowCnt > 0)
                {
                    msg += AppPhrases.RefreshRequired;
                }
                return(totalErrRowCnt == 0);
            }
            catch (Exception ex)
            {
                msg = AppPhrases.ImportAllTablesError + ":\r\n" + ex.Message;
                try { if (logCreated)
                      {
                          writer.WriteLine(msg);
                      }
                }
                catch { }
                return(false);
            }
            finally
            {
                try { writer.Close(); }
                catch { }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Импортировать архив базы конфигурации (патч)
        /// </summary>
        public static bool ImportArchive(string srcFileName, List <Tables.TableInfo> destTableInfoList,
                                         string logFileName, out bool logCreated, out string msg)
        {
            // проверка аргументов метода
            if (srcFileName == null)
            {
                throw new ArgumentNullException("srcFileName");
            }

            if (destTableInfoList == null)
            {
                throw new ArgumentNullException("destTableInfoList");
            }

            if (logFileName == null)
            {
                throw new ArgumentNullException("logFileName");
            }

            logCreated = false;
            StreamWriter writer = null;

            try
            {
                // создание журнала импорта и вывод параметров импорта
                writer     = new StreamWriter(logFileName, false, Encoding.UTF8);
                logCreated = true;
                AppUtils.WriteTitle(writer, DateTime.Now.ToString("G", Localization.Culture) + " " +
                                    AppPhrases.ImportTitle);
                writer.WriteLine(AppPhrases.ImportSource + srcFileName);

                // проверка существования импортируемого файла
                if (!File.Exists(srcFileName))
                {
                    throw new FileNotFoundException(AppPhrases.ImportFileNotExist);
                }

                using (ZipFile zipFile = ZipFile.Read(srcFileName))
                {
                    // получение словаря всех файлов архива с именами в нижнем регистре
                    Dictionary <string, ZipEntry> zipEntries = new Dictionary <string, ZipEntry>(zipFile.Count);
                    foreach (ZipEntry zipEntry in zipFile)
                    {
                        string fileName = zipEntry.FileName.ToLowerInvariant();
                        if (fileName.StartsWith("basedat/", StringComparison.Ordinal) ||
                            fileName.StartsWith("basedat\\", StringComparison.Ordinal))
                        {
                            fileName = fileName.Substring("basedat/".Length);
                            zipEntries.Add(fileName, zipEntry);
                        }
                    }

                    // импорт таблиц из тех, которые содержатся в архиве
                    int totalUpdRowCnt = 0;
                    int totalErrRowCnt = 0;
                    int updRowCnt;
                    int errRowCnt;

                    foreach (Tables.TableInfo destTableInfo in destTableInfoList)
                    {
                        if (zipEntries.ContainsKey(destTableInfo.FileName))
                        {
                            using (MemoryStream zipStream = new MemoryStream())
                            {
                                // распаковка архива в поток в памяти
                                ZipEntry zipEntry = zipEntries[destTableInfo.FileName];
                                zipEntry.Extract(zipStream);

                                // загрузка импортируемой таблицы в формате DAT из потока
                                BaseAdapter baseAdapter = new BaseAdapter();
                                DataTable   srcTable    = new DataTable();
                                baseAdapter.Stream          = zipStream;
                                baseAdapter.Stream.Position = 0;

                                try
                                {
                                    baseAdapter.Fill(srcTable, true);
                                }
                                catch (Exception ex)
                                {
                                    throw new Exception(AppPhrases.LoadTableError + ":\r\n" + ex.Message);
                                }

                                // импорт таблицы
                                string s;
                                ImportTable(srcTable, destTableInfo, 0, writer, out updRowCnt, out errRowCnt, out s);
                                totalUpdRowCnt += updRowCnt;
                                totalErrRowCnt += errRowCnt;
                            }
                        }
                    }

                    msg = totalErrRowCnt == 0 ? string.Format(AppPhrases.ImportCompleted, totalUpdRowCnt) :
                          string.Format(AppPhrases.ImportCompletedWithErr, totalUpdRowCnt, totalErrRowCnt);

                    // вывод результата в журнал импорта
                    writer.WriteLine();
                    AppUtils.WriteTitle(writer, AppPhrases.ImportResult);
                    writer.WriteLine(msg);

                    if (totalUpdRowCnt > 0)
                    {
                        msg += AppPhrases.RefreshRequired;
                    }
                    return(totalErrRowCnt == 0);
                }
            }
            catch (Exception ex)
            {
                msg = AppPhrases.ImportArchiveError + ":\r\n" + ex.Message;
                try { if (logCreated)
                      {
                          writer.WriteLine(msg);
                      }
                }
                catch { }
                return(false);
            }
            finally
            {
                try { writer.Close(); }
                catch { }
            }
        }
Ejemplo n.º 5
0
        /// <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 (srcFileName == null)
            {
                throw new ArgumentNullException("srcFileName");
            }

            if (destTableInfo == null)
            {
                throw new ArgumentNullException("destTableInfo");
            }

            if (logFileName == null)
            {
                throw new ArgumentNullException("logFileName");
            }

            logCreated = false;
            StreamWriter writer = null;

            try
            {
                // создание журнала импорта и вывод параметров импорта
                writer     = new StreamWriter(logFileName, false, Encoding.UTF8);
                logCreated = true;
                AppUtils.WriteTitle(writer, DateTime.Now.ToString("G", Localization.Culture) + " " +
                                    AppPhrases.ImportTitle);
                writer.WriteLine(AppPhrases.ImportSource + srcFileName);

                // проверка существования импортируемого файла
                if (!File.Exists(srcFileName))
                {
                    throw new FileNotFoundException(AppPhrases.ImportFileNotExist);
                }

                // загрузка импортируемой таблицы в формате 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 { }
            }
        }