public int NewUserId(bool isPerson = true) { int?untn = isPerson ? QM.QueryInteger(Connection, "select untn from v_kadr_fin k where not exists(select null from user_name u where u.untn = k.untn) and k.r_u = 'Работает' and rownum < 2", null) : null; var username = RandomString(10); using (var fsis = new OracleConnection("Direct=True;User Id = fsis;Password=fs;Host=testfin;SID=B;Port=1521;Pooling=false")) { fsis.Open(); var command = new OracleCommand { Connection = fsis, CommandType = System.Data.CommandType.StoredProcedure, CommandText = "create_username" }; command.Parameters.Add("p_username", username); command.Parameters.Add("p_untn", untn); command.ExecuteNonQuery(); fsis.Commit(); } Commit(); return(NUserPack.GetUserId(Connection, username)); }
/// <summary>Обрабатывает поступивший запрос на пересчёт транзакций</summary> void ProcessRequest(OracleConnection Connection) { SendResponse(Connection, ResponseType.Start); // отправляет ответ: мы взялись за обработку запроса ChangeStatus("Request processing started"); try { var SharedData = DataLoader.Allocate(); // получаем действующие в этот момент ОРД GetTransactions(Connection, SharedData); // получаем список неотменённых ранее транзакций для корректировки try { // начинаем обработку транзакций Log.Message("Транзакций для пересчёта: {0}", Request.Transactions.Count); Request.Counter.Start(); Request.LastContract = null; foreach (RecalculationTransactionItem Item in Request.Transactions) { using (var TransactionConnection = OpenedConnection) { if (ProcessTransactionItem(TransactionConnection, Item, SharedData)) Request.SuccessCount++; else Request.FailedCount++; /*if (!ProcessTransactionItem(Connection, Item, SharedData)) throw new Exception("Ошибка транзакции. Обработка прекращена.");*/ // пишем в лог информацию о транзакции try { OraQuery.ExecuteNonQuery(Connection, "insert into RecalculationLog (RecalcID, TransactionID, State, Message) values (:RecalcID, :TransactionID, :State, :Message)", new string[] { "RecalcID", "TransactionID", "State", "Message" }, new object[] { Request.ID, Item.ID, Item.State, Item.ErrorMessage }); } catch (OracleException e) { if (e.Code == 1) // ORA-00001: unique constraint { OraQuery.ExecuteNonQuery(Connection, "update RecalculationLog set State = :State, Message = :Message where RecalcID = :RecalcID and TransactionID = :TransactionID", new string[] { "RecalcID", "TransactionID", "State", "Message" }, new object[] { Request.ID, Item.ID, Item.State, Item.ErrorMessage }); } } } if (Item.IsChanged) Request.ChangedCount++; // у нас одной изменённой после пересчета транзакцией больше Request.ProcessedCount++; SendResponse(Connection, ResponseType.Progress); ChangeStatus(string.Format("Processing: {0}/{1}", Request.ProcessedCount, Request.TotalCount)); } // помечаем запрос как обработанный OraQuery.ExecuteNonQuery(Connection, "update Recalculations set Processed = 1 where ID = :ID", new string[] { "ID" }, new object[] { Request.ID }); Request.Processed = true; Connection.Commit(); // сохраняем результат Request.Counter.Stop(); SendResponse(Connection, ResponseType.Finish); Log.Message("Транзакций изменено по итогам пересчёта: {0}", Request.ChangedCount); Log.Message("Обработка запроса завершена успешно"); ChangeStatus("Finished successfully"); } finally { DataLoader.Release(SharedData); } } catch (Exception e) { if (e is OracleException && (e as OracleException).Code == 54) // ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired LogError(Connection, "Не удаётся заблокировать транзакции для обработки"); else LogError(Connection, "Ошибка обработки:\n" + e.Message + "\n" + e.StackTrace); Connection.Rollback(); // отменяем изменения ChangeStatus("Finished with an error"); } }
private void CheckNotifier() { try { NotifierCheckState = NotifierCheckStates.Idle; while (true) { //Log.Message("Check Notifier state: {0}", NotifierCheckState); switch (NotifierCheckState) { case NotifierCheckStates.Idle: var StartWaitTime = DateTime.Now; ShowFullStatus("Sleeping..."); while (DateTime.Now - StartWaitTime <= CheckChangeNotifierInterval) { Thread.Sleep(1000); if (NotifierCheckState != NotifierCheckStates.Idle) break; } if (NotifierCheckState != NotifierCheckStates.CheckSuccess) NotifierCheckState = NotifierCheckStates.StartCheck; break; case NotifierCheckStates.StartCheck: using (var c = new OracleConnection(ConnectionString)) { c.AutoCommit = false; c.Open(); NotifierCheckState = NotifierCheckStates.CheckStarted; // must be set before, because notification can come right away NotifierCheckStartTime = DateTime.Now; int RowsUpdated = OraQuery.ExecuteNonQuery(c, string.Format("update {0} set id = id + 1 where rownum = 1", NotifierCheckTable)); if (RowsUpdated > 0) c.Commit(); else c.Rollback(); } break; case NotifierCheckStates.CheckStarted: // started, in processes if (DateTime.Now - NotifierCheckStartTime >= CheckChangeNotifierTimeout) // if no answer after starting NotifierCheckState = NotifierCheckStates.CheckFailed; else Thread.Sleep(1000); break; case NotifierCheckStates.CheckSuccess: case NotifierCheckStates.WasRestarted: NotifierCheckState = NotifierCheckStates.Idle; break; case NotifierCheckStates.CheckFailed: // need restart Log.Message("Check Notifier state: {0}", NotifierCheckState); // It is important state EventHandle.Set(); // wake up thread for restart Thread.Sleep(1000); break; default: Log.Message("Unknown status: {0}", NotifierCheckState); break; } } } catch (Exception e) { if (e is ThreadAbortException || e is ThreadInterruptedException) return; else Log.Message("Ошибка потока проверки нотификатора: {0}\n{1}", e.Message, e.StackTrace); } }
internal void Commit() { Connection.Commit(); GRPOConnection.Commit(); }
public void Show(OracleConnection connection, PassportInfo info) { if (Functions.IsNull(info)) return; Splash.ProgressInit(2); try { string HostName = Dns.GetHostName(); string IPAddress = Functions.GetCurrentIPAddress(); string TemporaryFileName; // запрос для получения вида паспорта (pdf файл) Splash.Message("Получение вида паспорта..."); MemoryStream PassportStream = GetPassport(connection, info.PlantID, info.OrderID, info.LanguageID); Splash.ProgressAdd(); if (!Functions.IsNull(PassportStream)) // нашли вид паспорта { Splash.ProgressMaximum(4); Splash.Message("Маркировка паспорта..."); PassportStream = MarkPassport(PassportStream); // маркируем документ - добавляем слова "Копия" и разную информацию if (Functions.IsNull(PassportStream)) { MessageBox.Show("Ошибка при маркировке паспорта. Паспорт без маркировке 'COPY' выдать нельзя", "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } TemporaryFileName = GetTempFilePath(".pdf"); FileStream FS = new FileStream(TemporaryFileName, FileMode.Create, FileAccess.Write); PassportStream.WriteTo(FS); FS.Close(); Splash.ProgressAdd(); } else { Splash.ProgressMaximum(6); // запрос для получения данных паспорта Splash.Message("Получение данных паспорта..."); OracleCommand DataCommand = OracleProc.Execute(connection, "DataAccessPKG.GetPassportData", new object[] { info.PlantID, info.OrderID, info.LanguageID, null }); QueryResult Data = new QueryResult(DataCommand.Parameters["rc"].Value); Splash.ProgressAdd(); Splash.Message("Загрузка шаблона паспорта..."); MemoryStream TemplateStream = GetPassportTemplate(connection, info.PlantID, info.ProductID, info.LanguageID); Splash.ProgressAdd(); Splash.Message("Формирование документа..."); //PassportTemplate CurrentTemplate = plant.PassportTemplates.FindLanguage(LanguageID); if (TemplateStream == null) { MessageBox.Show(string.Format("Отсутствует шаблон паспорта продукта {0} (ID предприятия: {1}) для языка {2}. Обратитесь в тех.поддержку за помощью", info.ProductID, info.PlantID, info.LanguageID), "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (Data.Rows.Count == 0) { MessageBox.Show("Отсутствуют данные по выбранному паспорту. Попробуйте обновить данные за текущий период", "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } MSWordReport word = new MSWordReport(TemplateStream); QueryResult PassportData = FormatPassportData(Data); word.Execute(PassportData); // добавляем информацию о пользователе Data.AddColumn("UserInfo", typeof(string), string.Format("Пользователь: {0} ({1}). Компьютер: {2} ({3})", Program.StartForm.current.User.name, Common.PZUsers.Current.WindowsDomainName(), HostName, IPAddress)); Data.AddColumn("CreationDate", typeof(DateTime), DateTime.Now); word.Document.MailMerge.Execute(Data.Rows[0]); word.PrepareToSave(); word.Document.Protect(Aspose.Words.ProtectionType.ReadOnly); // вставляем знак "Копия" Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(word.Document); builder.MoveToHeaderFooter(Aspose.Words.HeaderFooterType.HeaderPrimary); System.Drawing.Image image = System.Drawing.Image.FromFile(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "Images\\Exclamation.gif")); double useablePageWidth = builder.PageSetup.PageWidth - builder.PageSetup.LeftMargin - builder.PageSetup.RightMargin; double useablePageHeight = builder.PageSetup.PageHeight - builder.PageSetup.TopMargin - builder.PageSetup.BottomMargin; const int PointsPerInch = 72; double imageWidth = (image.Width / image.HorizontalResolution) * PointsPerInch; double imageHeight = (image.Height / image.VerticalResolution) * PointsPerInch; double imageLeft = (useablePageWidth - imageWidth) / 2; double imageTop = (useablePageHeight - imageHeight) / 2; builder.InsertImage(image, Aspose.Words.RelativeHorizontalPosition.Margin, imageLeft, Aspose.Words.RelativeVerticalPosition.Margin, imageTop, imageWidth, imageHeight, Aspose.Words.WrapType.None, Aspose.Words.WrapSide.Both, true, null); TemporaryFileName = GetTempFilePath(".doc"); word.Document.Save(TemporaryFileName); Splash.ProgressAdd(); } // логирование паспорта Splash.Message("Запись в журнал операций..."); OracleProc.Execute(connection, "LogPKG.LogPassport", new object[] { info.PlantID, info.CertificateID, info.OrderID, Program.StartForm.current.Program.id, Program.StartForm.current.User.id, HostName, IPAddress, Common.PZUsers.Current.WindowsDomainName() }); connection.Commit(); Splash.ProgressAdd(); Splash.Message(TemporaryFileName.EndsWith(".doc") ? "Запуск Microsoft Word..." : "Запуск Adobe Acrobat Reader..."); //PrintDocumentFromWord(TemporaryFileName); OpenDocument(TemporaryFileName); Splash.ProgressAdd(); } finally { Splash.Close(); } /*System.Diagnostics.Process.Start(TemporaryFileName); Splash.ProgressAdd(); */ }