Windows窗体程序在运行查询时突然关闭.我如何在它停止/崩溃之前捕获错误
本文关键字:崩溃 错误 查询 运行 程序 窗体 突然 Windows | 更新日期: 2023-09-27 18:12:33
我有一个运行我创建的类似pos程序的3台PC设置。1台作为服务器,2台作为客户端。我在客户端有一个繁重的查询,当执行时,有时会关闭程序。我如何在强制关闭之前捕获问题?
查询通过获取所有输入库存的总和并从已售出的产品、转移到另一个分支的产品和损坏的产品中减去剩余库存来检查剩余库存。因此,每次搜索产品时,它都要通过4个表(库存、销售、转让、损坏)来获取库存,再通过4个表来获取产品描述(产品、类别、子类别、供应商)。
那么,在应用程序关闭之前,我如何记录错误呢?我想得到的形式关闭事件,但我如何记录它只有当它崩溃?
编辑1:我总是把message box的try catch放到我所有的方法中。应用程序关闭前不会弹出任何消息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;
编辑2:这是我的按钮代码(Variables.dgvSearchItemsDataSource
相当于发布的查询):
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;
}
}
虽然您认为您在每个调用周围放置了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);
}
在用于执行查询的代码周围添加一个try catch块
try
{
// Execute query
}
catch (Exception)
{
// Exception handling
throw;
}