Esempio n. 1
0
        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (rbSrez.Checked)
            {
                dataTable = new DataTable("SrezTable");
                SrezAdapter sa = new SrezAdapter();
                sa.FileName = txtFileName.Text;
                sa.Fill(dataTable);
            }
            else if (rbEvent.Checked)
            {
                dataTable = new DataTable("EventTable");
                EventAdapter ea = new EventAdapter();
                ea.FileName = txtFileName.Text;
                ea.Fill(dataTable);
            }
            else // rbBase.Checked
            {
                dataTable = new DataTable("BaseTable");
                BaseAdapter ba = new BaseAdapter();
                ba.FileName = txtFileName.Text;
                ba.Fill(dataTable, true);
            }

            dataGridView.DataSource = dataTable;
        }
Esempio n. 2
0
 /// <summary>
 /// Загрузить таблицу базы конфигурации
 /// </summary>
 private static bool LoadDataTable(BaseAdapter baseAdapter, Log errLog, ref DataTable dataTable)
 {
     try
     {
         baseAdapter.Fill(dataTable, true);
         return true;
     }
     catch (Exception ex)
     {
         string errMsg = AppPhrases.IncorrectFilter + ":\r\n" + ex.Message;
         if (errLog != null)
             errLog.WriteAction(errMsg, Log.ActTypes.Exception);
         ScadaUtils.ShowError(errMsg);
         return false;
     }
 }
Esempio n. 3
0
        /// <summary>
        /// Загрузить данные базы конфигурации
        /// </summary>
        private void LoadBase()
        {
            try
            {
                tblInCnl.Clear();
                tblCtrlCnl.Clear();
                tblObj.Clear();
                tblKP.Clear();

                BaseAdapter adapter = new BaseAdapter();
                adapter.Directory = baseDATDir;

                adapter.TableName = "incnl.dat";
                adapter.Fill(tblInCnl, false);

                adapter.TableName = "ctrlcnl.dat";
                adapter.Fill(tblCtrlCnl, false);

                adapter.TableName = "obj.dat";
                adapter.Fill(tblObj, false);

                DataRow row = tblObj.NewRow();
                row["ObjNum"] = 0;
                row["Name"] = AppPhrases.AllObjItem;
                tblObj.Rows.InsertAt(row, 0);

                adapter.TableName = "kp.dat";
                adapter.Fill(tblKP, false);

                row = tblKP.NewRow();
                row["KPNum"] = 0;
                row["Name"] = AppPhrases.AllKPItem;
                row["KPTypeID"] = 0;
                tblKP.Rows.InsertAt(row, 0);

                baseLoaded = true;
            }
            catch (Exception ex)
            {
                ScadaUtils.ShowError(AppPhrases.LoadBaseError + ":\n" + ex.Message);
                baseLoaded = false;
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Считать пользователей из базы конфигурации
        /// </summary>
        private bool ReadUsers()
        {
            try
            {
                lock (users)
                {
                    users.Clear();
                    DataTable tblUser = new DataTable();
                    BaseAdapter adapter = new BaseAdapter();
                    adapter.FileName = Settings.BaseDATDir + "user.dat";
                    adapter.Fill(tblUser, false);

                    foreach (DataRow dataRow in tblUser.Rows)
                    {
                        User user = new User();
                        user.Name = (string)dataRow["Name"];
                        user.Password = (string)dataRow["Password"];
                        user.RoleID = (int)dataRow["RoleID"];
                        users[user.Name.Trim().ToLowerInvariant()] = user;
                    }
                }

                AppLog.WriteAction(Localization.UseRussian ? "Пользователи считаны из базы конфигурации" :
                    "Users are read from the configuration database", Log.ActTypes.Action);
                return true;
            }
            catch (Exception ex)
            {
                AppLog.WriteAction((Localization.UseRussian ?
                    "Ошибка при считывании пользователей из базы конфигурации: " :
                    "Error reading users from the configuration database: ") +
                    ex.Message, Log.ActTypes.Exception);
                return false;
            }
        }
Esempio n. 5
0
        /// <summary>
        /// Считать входные каналы из базы конфигурации
        /// </summary>
        private bool ReadInCnls()
        {
            try
            {
                lock (inCnls)
                {
                    // очистка информации о каналах
                    inCnls.Clear();
                    drCnls = new List<InCnl>();
                    drmCnls = new List<InCnl>();
                    drhCnls = new List<InCnl>();
                    drCnlNums = null;
                    drmCnlNums = null;
                    drhCnlNums = null;
                    avgCnlInds = new List<int>();

                    // заполнение информации о каналах
                    DataTable tblInCnl = new DataTable();
                    BaseAdapter adapter = new BaseAdapter();
                    adapter.FileName = Settings.BaseDATDir + "incnl.dat";
                    adapter.Fill(tblInCnl, false);

                    foreach (DataRow dataRow in tblInCnl.Rows)
                    {
                        if ((bool)dataRow["Active"])
                        {
                            // заполняются только свойства, используемые приложением
                            InCnl inCnl = new InCnl();
                            inCnl.CnlNum = (int)dataRow["CnlNum"];
                            inCnl.CnlTypeID = (int)dataRow["CnlTypeID"];
                            inCnl.ObjNum = (int)dataRow["ObjNum"];
                            inCnl.KPNum = (int)dataRow["KPNum"];
                            inCnl.FormulaUsed = (bool)dataRow["FormulaUsed"];
                            inCnl.Formula = (string)dataRow["Formula"];
                            inCnl.Averaging = (bool)dataRow["Averaging"];
                            inCnl.ParamID = (int)dataRow["ParamID"];
                            inCnl.EvEnabled = (bool)dataRow["EvEnabled"];
                            inCnl.EvOnChange = (bool)dataRow["EvOnChange"];
                            inCnl.EvOnUndef = (bool)dataRow["EvOnUndef"];
                            inCnl.LimLowCrash = (double)dataRow["LimLowCrash"];
                            inCnl.LimLow = (double)dataRow["LimLow"];
                            inCnl.LimHigh = (double)dataRow["LimHigh"];
                            inCnl.LimHighCrash = (double)dataRow["LimHighCrash"];

                            int cnlTypeID = inCnl.CnlTypeID;
                            if (BaseValues.CnlTypes.MinCnlTypeID <= cnlTypeID &&
                                cnlTypeID <= BaseValues.CnlTypes.MaxCnlTypeID)
                                inCnls.Add(inCnl.CnlNum, inCnl);

                            if (cnlTypeID == BaseValues.CnlTypes.TSDR || cnlTypeID == BaseValues.CnlTypes.TIDR ||
                                cnlTypeID == BaseValues.CnlTypes.SWCNT)
                                drCnls.Add(inCnl);
                            else if (cnlTypeID == BaseValues.CnlTypes.TSDRM || cnlTypeID == BaseValues.CnlTypes.TIDRM)
                                drmCnls.Add(inCnl);
                            else if (cnlTypeID == BaseValues.CnlTypes.TSDRH || cnlTypeID == BaseValues.CnlTypes.TIDRH)
                                drhCnls.Add(inCnl);

                            if (inCnl.Averaging && cnlTypeID == BaseValues.CnlTypes.TI)
                                avgCnlInds.Add(inCnls.Count - 1);
                        }
                    }

                    // заполнение номеров дорасчётных каналов
                    int cnt = drCnls.Count;
                    drCnlNums = new int[cnt];
                    for (int i = 0; i < cnt; i++)
                        drCnlNums[i] = drCnls[i].CnlNum;

                    cnt = drmCnls.Count;
                    drmCnlNums = new int[cnt];
                    for (int i = 0; i < cnt; i++)
                        drmCnlNums[i] = drmCnls[i].CnlNum;

                    cnt = drhCnls.Count;
                    drhCnlNums = new int[cnt];
                    for (int i = 0; i < cnt; i++)
                        drhCnlNums[i] = drhCnls[i].CnlNum;

                    // определение результата
                    if (inCnls.Count > 0)
                    {
                        AppLog.WriteAction(string.Format(Localization.UseRussian ?
                            "Входные каналы считаны из базы конфигурации. Количество активных каналов: {0}" :
                            "Input channels are read from the configuration database. Active channel count: {0}",
                            inCnls.Count), Log.ActTypes.Action);
                        return true;
                    }
                    else
                    {
                        AppLog.WriteAction(Localization.UseRussian ?
                            "В базе конфигурации отсутствуют активные входные каналы" :
                            "No active input channels in the configuration database", Log.ActTypes.Error);
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                AppLog.WriteAction((Localization.UseRussian ?
                    "Ошибка при считывании входных каналов из базы конфигурации: " :
                    "Error reading input channels from the configuration database: ") +
                    ex.Message, Log.ActTypes.Exception);
                return false;
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Считать формулы из базы конфигурации
        /// </summary>
        private bool ReadFormulas()
        {
            try
            {
                formulas.Clear();
                DataTable tblFormula = new DataTable();
                BaseAdapter adapter = new BaseAdapter();
                adapter.FileName = Settings.BaseDATDir + "formula.dat";
                adapter.Fill(tblFormula, false);

                foreach (DataRow dataRow in tblFormula.Rows)
                    formulas.Add((string)dataRow["Source"]);

                AppLog.WriteAction(Localization.UseRussian ? "Формулы считаны из базы конфигурации" :
                    "Formulas are read from the configuration database", Log.ActTypes.Action);
                return true;
            }
            catch (Exception ex)
            {
                AppLog.WriteAction((Localization.UseRussian ? "Ошибка при считывании формул из базы конфигурации: " :
                    "Error reading formulas from the configuration database: ") + ex.Message, Log.ActTypes.Exception);
                return false;
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Считать каналы управления из базы конфигурации
        /// </summary>
        private bool ReadCtrlCnls()
        {
            try
            {
                lock (ctrlCnls)
                {
                    ctrlCnls.Clear();
                    DataTable tblCtrlCnl = new DataTable();
                    BaseAdapter adapter = new BaseAdapter();
                    adapter.FileName = Settings.BaseDATDir + "ctrlcnl.dat";
                    adapter.Fill(tblCtrlCnl, false);

                    foreach (DataRow dataRow in tblCtrlCnl.Rows)
                    {
                        if ((bool)dataRow["Active"])
                        {
                            // заполняются только свойства, используемые приложением
                            CtrlCnl ctrlCnl = new CtrlCnl();
                            ctrlCnl.CtrlCnlNum = (int)dataRow["CtrlCnlNum"];
                            ctrlCnl.CmdTypeID = (int)dataRow["CmdTypeID"];
                            ctrlCnl.ObjNum = (int)dataRow["ObjNum"];
                            ctrlCnl.KPNum = (int)dataRow["KPNum"];
                            ctrlCnl.CmdNum = (int)dataRow["CmdNum"];
                            ctrlCnl.FormulaUsed = (bool)dataRow["FormulaUsed"];
                            ctrlCnl.Formula = (string)dataRow["Formula"];
                            ctrlCnl.EvEnabled = (bool)dataRow["EvEnabled"];
                            ctrlCnls.Add(ctrlCnl.CtrlCnlNum, ctrlCnl);
                        }
                    }
                }

                AppLog.WriteAction(Localization.UseRussian ? "Каналы управления считаны из базы конфигурации" :
                    "Ouput channels are read from the configuration database", Log.ActTypes.Action);
                return true;
            }
            catch (Exception ex)
            {
                AppLog.WriteAction((Localization.UseRussian ?
                    "Ошибка при считывании каналов управления из базы конфигурации: " :
                    "Error reading ouput channels from the configuration database: ") +
                    ex.Message, Log.ActTypes.Exception);
                return false;
            }
        }
Esempio n. 8
0
        /// <summary>
        /// Принять таблицу базы конфигурации от SCADA-Сервера
        /// </summary>
        public bool ReceiveBaseTable(string tableName, DataTable dataTable)
        {
            Monitor.Enter(tcpLock);
            bool result = false;
            errMsg = "";

            try
            {
                try
                {
                    if (RestoreConnection())
                    {
                        using (MemoryStream memStream = new MemoryStream())
                        {
                            if (ReceiveFile(Dirs.BaseDAT, tableName, memStream))
                            {
                                BaseAdapter adapter = new BaseAdapter();
                                adapter.Stream = memStream;
                                adapter.TableName = tableName;
                                adapter.Fill(dataTable, false);
                                result = true;
                            }
                        }
                    }
                }
                finally
                {
                    // очистка таблицы, если не удалось получить новые данные
                    if (!result)
                        dataTable.Rows.Clear();
                }
            }
            catch (Exception ex)
            {
                errMsg = (Localization.UseRussian ? "Ошибка при приёме таблицы базы конфигурации от SCADA-Сервера: " : 
                    "Error receiving configuration database table from SCADA-Server: ") + ex.Message;
                WriteAction(errMsg, Log.ActTypes.Exception);
            }
            finally
            {
                Monitor.Exit(tcpLock);
            }

            return result;
        }
Esempio n. 9
0
        private void btnImport_Click(object sender, EventArgs e)
        {
            // импорт выбранной таблицы из формата DAT
            StreamWriter writer = null;
            bool writeLog = chkImportLog.Checked;
            bool logCreated = false;
            string logFileName = AppData.ExeDir + "ScadaAdminImport.txt";

            try
            {
                Tables.TableInfo tableInfo = cbTable.SelectedItem as Tables.TableInfo;

                if (tableInfo != null && AppData.Connected)
                {
                    string fileName = txtFileName.Text.Trim();

                    if (writeLog)
                    {
                        writer = new StreamWriter(logFileName, false, Encoding.Default);
                        logCreated = true;

                        string title = DateTime.Now.ToString("G", Localization.Culture) + " " + AppPhrases.ImportTitle;
                        writer.WriteLine(title);
                        writer.WriteLine(new string('-', title.Length));
                        writer.WriteLine(AppPhrases.ImportTable + tableInfo.Name + " (" + tableInfo.Header + ")");
                        writer.WriteLine(AppPhrases.ImportFile + fileName);
                        writer.WriteLine();
                    }

                    // загрузка импортируемой таблицы
                    BaseAdapter baseAdapter = new BaseAdapter();
                    DataTable srcTable = new DataTable();
                    baseAdapter.FileName = fileName;

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

                    if (writeLog)
                    {
                        writer.WriteLine(AppPhrases.SrcTableFields);
                        writer.WriteLine(new string('-', AppPhrases.SrcTableFields.Length));
                        if (srcTable.Columns.Count > 0)
                        {
                            foreach (DataColumn column in srcTable.Columns)
                                writer.WriteLine(column.ColumnName + " (" + column.DataType + ")");
                        }
                        else
                        {
                            writer.WriteLine(AppPhrases.NoFields);
                        }
                        writer.WriteLine();
                    }

                    // определение схемы таблицы БД
                    DataTable destTable = new DataTable(tableInfo.Name);
                    Tables.FillTableSchema(destTable);

                    if (writeLog)
                    {
                        writer.WriteLine(AppPhrases.DestTableFields);
                        writer.WriteLine(new string('-', AppPhrases.DestTableFields.Length));
                        if (destTable.Columns.Count > 0)
                        {
                            foreach (DataColumn column in destTable.Columns)
                                writer.WriteLine(column.ColumnName + " (" + column.DataType + ")");
                        }
                        else
                        {
                            writer.WriteLine(AppPhrases.NoFields);
                        }
                        writer.WriteLine();
                    }

                    // установка контроля идентификаторов
                    string firstColumnName = destTable.Columns.Count > 0 ? destTable.Columns[0].ColumnName : "";
                    bool firstColumnIsID = gbIDs.Enabled && (firstColumnName.EndsWith("ID") ||
                        firstColumnName.EndsWith("Num") || firstColumnName == "CnlStatus") &&
                        destTable.Columns[0].DataType == typeof(int);

                    bool checkMinID = chkStartID.Checked && firstColumnIsID;
                    bool checkMaxID = chkFinalID.Checked && firstColumnIsID;
                    bool shiftID = chkNewStartID.Checked && firstColumnIsID;
                    bool shiftDef = false; // смещение определено
                    bool checkID = checkMaxID || checkMinID || shiftID;

                    int minID = checkMinID ? Convert.ToInt32(numStartID.Value) : 0;
                    int maxID = checkMaxID ? Convert.ToInt32(numFinalID.Value) : 0;
                    int newStartID = shiftID ? Convert.ToInt32(numNewStartID.Value) : 0;
                    int shift = 0;

                    // заполнение таблицы БД
                    foreach (DataRow row in srcTable.Rows)
                    {
                        DataRow newRow = destTable.NewRow();
                        bool rowIsOk = true;

                        foreach (DataColumn column in destTable.Columns)
                        {
                            int ind = srcTable.Columns.IndexOf(column.ColumnName);
                            if (ind >= 0 && column.DataType == srcTable.Columns[ind].DataType)
                            {
                                object val = row[ind];
                                if (ind == 0 && checkID && val != null && val != DBNull.Value)
                                {
                                    // проверка идентификатора
                                    int id = (int)val;
                                    if (checkMinID && id < minID || checkMaxID && id > maxID)
                                    {
                                        rowIsOk = false;
                                        break;
                                    }

                                    if (shiftID && !shiftDef)
                                    {
                                        shift = newStartID - id;
                                        shiftDef = true;
                                    }

                                    newRow[column] = id + shift;
                                }
                                else
                                    newRow[column] = val;
                            }
                        }

                        if (rowIsOk)
                            destTable.Rows.Add(newRow);
                    }

                    // сохранение информации в БД
                    int updRows = 0;
                    int errRows = 0;
                    DataRow[] rowsInError = null;

                    try
                    {
                        SqlCeDataAdapter sqlAdapter = destTable.ExtendedProperties["DataAdapter"] as SqlCeDataAdapter;
                        updRows = sqlAdapter.Update(destTable);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(AppPhrases.WriteDBError + ":\r\n" + ex.Message);
                    }

                    if (destTable.HasErrors)
                    {
                        rowsInError = destTable.GetErrors();
                        errRows = rowsInError.Length;
                    }

                    string msg;
                    if (errRows == 0)
                    {
                        msg = string.Format(AppPhrases.ImportCompleted,  updRows);
                        ScadaUtils.ShowInfo(updRows > 0 ? msg + AppPhrases.RefreshRequired : msg);
                    }
                    else
                    {
                        msg = string.Format(AppPhrases.ImportCompletedWithErr, updRows, errRows);
                        AppData.ErrLog.WriteAction(msg, Log.ActTypes.Error);
                        ScadaUtils.ShowError(updRows > 0 ? msg + AppPhrases.RefreshRequired : msg);
                    }

                    if (writeLog)
                    {
                        writer.WriteLine(AppPhrases.ImportResult);
                        writer.WriteLine(new string('-', AppPhrases.ImportResult.Length));
                        writer.WriteLine(msg);

                        if (errRows > 0)
                        {
                            writer.WriteLine();
                            writer.WriteLine(AppPhrases.ImportErrors);
                            writer.WriteLine(new string('-', AppPhrases.ImportErrors.Length));

                            foreach (DataRow row in rowsInError)
                            {
                                if (firstColumnIsID)
                                {
                                    object objVal = row[0];
                                    string strVal = objVal == null || objVal == DBNull.Value ? "NULL" : objVal.ToString();
                                    writer.Write(firstColumnName + " = " + strVal + " : ");
                                }
                                writer.WriteLine(row.RowError);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string errMsg = AppPhrases.ImportError + ":\r\n" + ex.Message;
                try { if (writeLog) writer.WriteLine(errMsg); }
                catch { }
                AppUtils.ProcError(errMsg);
            }
            finally
            {
                try { writer.Close(); }
                catch { }
            }

            if (writeLog && logCreated)
                Process.Start(logFileName);
        }
Esempio n. 10
0
        /// <summary>
        /// Импортировать архив базы конфигурации (патч)
        /// </summary>
        public static bool ImportArchive(string srcFileName, List<Tables.TableInfo> destTableInfoList,
            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 (destTableInfoList == null)
                throw new ArgumentNullException("destTableInfoList");

            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);
                }

                using (ZipFile zipFile = ZipFile.Read(srcFileName))
                {
                    // получение словаря всех файлов архива с именами в нижнем регистре
                    Dictionary<string, ZipEntry> zipEntries = new Dictionary<string, ZipEntry>(zipFile.Count);
                    foreach (ZipEntry zipEntry in zipFile)
                        zipEntries.Add(zipEntry.FileName.ToLowerInvariant(), 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);

                    // вывод результата в журнал импорта
                    if (logCreated)
                    {
                        writer.WriteLine();
                        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 { }
            }
        }
Esempio n. 11
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 (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 { }
            }
        }