protected DataModel(ToolStripProgressBar progressBar, int incrementor, string selectQuery, string tableName) { var context = SynchronizationContext.Current; DmLoadType = DataModelLoadSyncType.Asyncronize; ThreadPool.QueueUserWorkItem((progress) => { try { DmLoadState = DataModelLoadState.Loading; using (var connection = new DBConnection()) using (var command = DBConnection.CreateCommand()) { command.CommandText = selectQuery; DbAccessSemaphore.WaitOne(); Interlocked.Exchange(ref _table, connection.SqlSelectTable(tableName, command)); } DbAccessSemaphore.Release(); ConfigureTable(); lock (LockObj) { DataSetManager.AddTable(Table); } DmLoadState = DataModelLoadState.SuccessLoad; if (progress != null) { context.Post(_ => { progressBar.Value += incrementor; if (progressBar.Value == progressBar.Maximum) { progressBar.Visible = false; //Если мы загрузили все данные, то запускаем CallbackUpdater DataModelsCallbackUpdater.GetInstance().Run(); CalcDataModelsUpdater.GetInstance().Run(); } }, null); } } catch (SqlException e) { lock (LockObj) { MessageBox.Show(String.Format(CultureInfo.InvariantCulture, "Произошла ошибка при загрузке данных из базы данных. Подробная ошибка: {0}", e.Message), "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); DmLoadState = DataModelLoadState.ErrorLoad; Application.Exit(); } } catch (DataModelException e) { MessageBox.Show(e.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); DmLoadState = DataModelLoadState.ErrorLoad; } }, progressBar); }
protected override void Calculate(object sender, System.ComponentModel.DoWorkEventArgs e) { DmLoadState = DataModelLoadState.Loading; if (e == null) { throw new DataModelException("Не передана ссылка на объект DoWorkEventArgs в классе CalcDataModelLicensesConcat"); } var config = (CalcAsyncConfig)e.Argument; // Фильтруем удаленные строки var licenses = DataModelHelper.FilterRows(SoftLicensesDataModel.GetInstance().Select(), config.Entity, config.IdObject); var licKeys = DataModelHelper.FilterRows(SoftLicKeysDataModel.GetInstance().Select(), config.Entity, config.IdObject); // Вычисляем агрегационную информацию var result = from licensesRow in licenses join licKeyRow in licKeys on licensesRow.Field <int>("ID License") equals licKeyRow.Field <int>("ID License") select new { id_lickey = licKeyRow.Field <int>("ID LicenseKey"), id_license = licensesRow.Field <int>("ID License"), lickey = string.Format("{0} (в/н лицензии: {1}; срок действия: №{2} от {3})", licKeyRow.Field <string>("LicKey"), licensesRow.Field <int>("ID License"), licensesRow.Field <string>("DocNumber") ?? "б/н", licensesRow.Field <DateTime>("BuyLicenseDate").ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) + (licensesRow.Field <DateTime?>("ExpireLicenseDate") == null ? " (бессрочно)" : " по " + licensesRow.Field <DateTime>("ExpireLicenseDate").ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)) ) }; // Заполняем таблицу изменений var table = InitializeTable(); table.BeginLoadData(); result.ToList().ForEach(x => { table.Rows.Add(x.id_lickey, x.id_license, x.lickey); }); table.EndLoadData(); if (!DataSetManager.DataSet.Tables.Contains(TableName)) { DataSetManager.AddTable(table); } else { DataSetManager.DataSet.Merge(table); } // Возвращаем результат e.Result = table; }
protected override void Calculate(object sender, System.ComponentModel.DoWorkEventArgs e) { DmLoadState = DataModelLoadState.Loading; if (e == null) { throw new DataModelException("Не передана ссылка на объект DoWorkEventArgs в классе CalcDataModelSoftwareConcat"); } var config = (CalcAsyncConfig)e.Argument; // Фильтруем удаленные строки IEnumerable <DataRow> software; IEnumerable <DataRow> versions; if (config.Entity == EntityType.Software) { software = DataModelHelper.FilterRows(SoftwareDataModel.GetInstance().Select(), config.Entity, config.IdObject); versions = DataModelHelper.FilterRows(SoftVersionsDataModel.GetInstance().Select(), config.Entity, config.IdObject); } else if (config.Entity == EntityType.SoftVersion) { software = DataModelHelper.FilterRows(SoftwareDataModel.GetInstance().Select(), EntityType.Unknown, null); versions = DataModelHelper.FilterRows(SoftVersionsDataModel.GetInstance().Select(), config.Entity, config.IdObject); } else { software = DataModelHelper.FilterRows(SoftwareDataModel.GetInstance().Select(), EntityType.Unknown, null); versions = DataModelHelper.FilterRows(SoftVersionsDataModel.GetInstance().Select(), EntityType.Unknown, null); } // Вычисляем агрегационную информацию var result = from softwareRow in software join versionRow in versions on softwareRow.Field <int>("ID Software") equals versionRow.Field <int>("ID Software") select new { id_version = versionRow.Field <int>("ID Version"), id_software = versionRow.Field <int>("ID Software"), software = softwareRow.Field <string>("Software") + (versionRow.Field <string>("Version") == null ? "" : " " + versionRow.Field <string>("Version")) }; // Заполняем таблицу изменений var table = InitializeTable(); table.BeginLoadData(); result.ToList().ForEach(x => { table.Rows.Add(x.id_version, x.id_software, x.software); }); table.EndLoadData(); if (!DataSetManager.DataSet.Tables.Contains(TableName)) { DataSetManager.AddTable(table); } else { DataSetManager.DataSet.Merge(table); } // Возвращаем результат e.Result = table; }