2016-10-11 1 views
1

私は作成したPOSのようなプログラムを実行する3台のPCセットアップを持っています。 1サーバとして機能するPCと2クライアントとして機能します。クライアント側では、実行時にプログラムが終了するという重い問い合わせがあります。強制終了する前に問題をどのようにキャッチしますか?Windowsフォームプログラムは、クエリ実行時に突然終了します。停止/クラッシュする前にエラーをどのようにキャッチしますか?

クエリは、入力されたすべての株の合計を取得し、売却された商品、別の支店に移管された商品、および破損した商品から差し引いて残りの株をチェックします。したがって、製品を検索するたびに、在庫を得るために4つのテーブル(在庫、販売、移転、損傷)を通過し、製品の説明(製品、カテゴリ、サブカテゴリ、サプライヤ)を取得するための4つのテーブルが追加されます。

戻って、アプリケーションを閉じる前にエラーをログに記録するにはどうすればよいですか?フォーム閉鎖イベントを取得することを考えていますが、クラッシュした場合にのみどのようにログに記録しますか?

EDIT 1:私はいつも、私のすべてのメソッドにメッセージボックスでキャッチしようとします。アプリケーションは、閉じる前にメッセージをポップアップしません。

SELECT p.Id,p.Product_Name Product,p.Description, 
c.Category_Name Category,sc.Subcategory_Name Subcategory,s.Supplier_Name Supplier,p.Selling_Price `Unit Price`, 
i.Stocks,s.Sales,i.Stocks - IFNULL(s.Sales, 0) - IFNULL(t.Transfer, 0) - IFNULL(d.Damage, 0) AS Remaining 

FROM (SELECT Id, Product_Name, Description, Selling_Price, Category_Id, Subcategory_Id, Supplier_Id FROM product WHERE enable_flag = 1) p 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(quantity), 0) AS Stocks FROM inventory WHERE enable_flag = 1 GROUP BY product_id) i 
ON p.Id = i.product_id 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(quantity), 0) AS Sales FROM sales_detail WHERE enable_flag = 1 GROUP BY product_id) s 
USING(product_id) 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(transfer_quantity), 0) AS Transfer FROM stock_transfer WHERE enable_flag = 1 GROUP BY product_id) t 
USING(product_id) 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(damaged_quantity), 0) AS Damage FROM damaged_product WHERE enable_flag = 1 GROUP BY product_id) d 
USING(product_id) 

JOIN Category c ON p.Category_Id=c.Id 
JOIN Subcategory sc ON p.Subcategory_Id=sc.Id 
JOIN Supplier s ON p.Supplier_Id=s.Id; 

EDIT 2:

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    dgvSearchItems.DataSource = dbConnect.DatabaseToDatagrid(Variables.dgvSearchItemsDataSource + " WHERE p.Product_Name LIKE '" + cmbSrchProd.Text + "%'"); 
    if (dgvSearchItems.Rows.Count != 0) 
    { 
     this.dgvSearchItems.Columns[1].Frozen = true; 
     this.dgvSearchItems.Columns[2].Frozen = true; 
     this.dgvSearchItems.Columns[0].Visible = false; 
     this.dgvSearchItems.Columns[7].Visible = false; 
     this.dgvSearchItems.Columns[8].Visible = false; 
    } 
    txtQuantity.Focus(); 
} 

私は私のデータベースへの接続に使用する方法:

private bool OpenConnection() 
{ 
    try 
    { 
     connection.Open(); 
     return true; 
    } 
    catch (MySqlException ex) 
    { 
     switch (ex.Number) 
     { 
      case 0: 
       myNotification = new frmNotifOk(); 
       myNotification.Show("Cannot connect to server."); 
       break; 

      case 1045: 
       myNotification = new frmNotifOk(); 
       myNotification.Show("Invalid username/password, please try again."); 
       break; 
     } 
     return false; 
    } 
} 

ここに私のボタンのコードは、(Variables.dgvSearchItemsDataSourceが掲載クエリに相当します)です

+0

heckが、なぜそれが負のポイントを得たのは何?私は合法的な質問をしているとそれに十分な詳細を与えても、私はいくつかの意見を得ることができるので、提案をした –

+0

ありがとう男!私は自分の投稿を編集して、自分のすべての方法に 'Try Catch'を入れていることを明確にしました。しかし、閉じてもキャッチしません。 –

答えて

0

クエリの実行に使用しているコードの周りにtry catchブロックを追加します。

+0

接続を開いたり閉じたりするときや、クエリを実行するときに、常にメッセージボックスにキャッチを入れます。強制終了する前にメッセージがポップアップしないという事実は、プログラムの何が間違っているのかを正確に特定するのを困難にします。 –

+0

すべてのデータベース活動を実行するために使用しているコードを提供できますか? – Darthchai

+0

私の投稿を更新しました –

1

あなたはtry/catchブロックをすべての呼び出しの周りに置くと思いますが、どこかで未処理の例外がスローされるようです。

私はhttps:System.AppDomain.UnhandledExceptionが役に立ったと思います。

このイベントは、キャッチされていない例外の通知を提供します。これにより、システムのデフォルトハンドラーが例外をユーザーに報告してアプリケーションを終了する前に、アプリケーションが例外に関する情報を記録することができます。アプリケーションの状態に関する十分な情報がある場合は、後で復旧するためにプログラムデータを保存するなど、他の操作を実行することがあります。

このイベントを処理すると、プログラムが終了する前に問題を記録できます。

用法:

static class Program 
{ 
    private static MyLogger logger = new MyLogger(); 

    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.UnhandledException += UnhandledException; 

     ... 
    } 

    static void UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     var exc = e.ExceptionObject as Exception; 
     if (exc != null) 
     { // log the exception 
      logger.LogException(exc); 
     } 
     // Problem is logged, Can't continue, so quit the application: 
     Environment.Exit(-1); 
    } 
+0

ありがとうございました!これは私が探していたものです!しかし、「MyLogger」には何が含まれていますか? –

+1

あなたは書いています:「だから、どうしたらアプリケーションが終了する前にエラーを記録するのですか?」私はあなたにいくつかのログメカニズムがあると思っていました。そうでない場合は、Common.Loggingのようなナゲットパッケージを検討してください。プロジェクトのソリューションエクスプローラー(プロジェクトがソリューションにグループ化されている)のビジュアルスタジオで、参照 - >ナゲットパッケージの管理を右クリックします。次に、検索文字列ロギングでブラウズし、ロギングパッケージの1つを選択します。 –

関連する問題