【问题标题】:Sql Exception no displaying in messageboxSql 异常没有显示在消息框中
【发布时间】:2018-10-08 12:52:54
【问题描述】:

我在尝试插入副本时遇到 SQL 异常,但 SQL 错误未发送到消息框。我可以在调试中看到错误。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using static AccountManager.productinsert.BusinessLogic;

namespace AccountManager
{
  public partial class ProductAdd : Form
  {
    public ProductAdd()
    {
      InitializeComponent();
    }

    public void CleartextBoxes1()
    {
      ProductId.Clear();
      ProductName.Clear();            
      ProductPrice.Clear();
    }

    private void BtnClose_Click(object sender, EventArgs e)
    {
      this.Close();
    }

    private void BtnSubmit_Click(object sender, EventArgs e)
    {
      try
      {
        var product = new ProductDetails();
        product.ProductId = ProductId.Text;
        product.ProductName = ProductName.Text;
        product.ProductPrice = ProductPrice.Text;
        AddProduct(product);

        MessageBox.Show("Product Created!");
        CleartextBoxes1();
      }
      catch (SqlException)
      {
          MessageBox.Show("Product Already Exists");
      }
    }
  }
}

调试的错误是

捕获的异常异常:“System.Data.SqlClient.SqlException”在 AccountManager.exe ("违反 UNIQUE KEY 约束 'UQ__Products__B40CC6CC7010A856'。无法插入重复键 对象'dbo.Products'。重复键值为 (1)。该声明 已终止。") System.Data.SqlClient.SqlException

按要求添加产品的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace AccountManager
{
    class productinsert
    {

        public class BusinessLogic
        {
            public static void AddProduct(ProductDetails details)
            {
                using (SqlConnection openCon = new SqlConnection("Data Source=.;Initial Catalog=AccountMGR;Integrated Security=True;"))
                {
                    var statement = "insert into Products(" +
                           "  ProductId, ProductName, Price)" +
                           " values(" +
                           "  @ProductId," +
                           "  @ProductName," +
                           "  @Price)";



                    using (SqlCommand queryInsert = new SqlCommand(statement))
                    {
                        queryInsert.Connection = openCon;

                        queryInsert.Parameters.Add("@ProductId", SqlDbType.VarChar, 30).Value = details.ProductId;
                        queryInsert.Parameters.Add("@ProductName", SqlDbType.VarChar, 30).Value = details.ProductName;
                        queryInsert.Parameters.Add("@Price", SqlDbType.VarChar, 30).Value = details.ProductPrice;



                        openCon.Open();
                        try
                        {
                            queryInsert.ExecuteNonQuery();
                        }
                        catch (SqlException)
                        {

                        }
                    }
                }


            }




            public class ProductDetails
            {

                public string ProductId { get; set; } = "";
                public string ProductName { get; set; } = "";
                public string ProductPrice { get; set; } = "";


            }
        }
    }
}

【问题讨论】:

  • 如果你按 F5 继续调试会发生什么?
  • catch (SqlException ex) { MessageBox.Show("产品已经存在。" + ex.Message); }
  • @Kevin 你应该把这个作为答案发布,这样它就可以被接受,你可以赢得有趣和惊人的东西!
  • 可以发一下AddProduct的出处吗?它可能正在包装或隐藏异常。
  • 如果您想在 UI 中捕获并显示异常,您必须删除业务逻辑类中的空 try/catch 块

标签: c# sql messagebox


【解决方案1】:

试试这个

try
{
     SaveData();
}
catch (Exception ex)
{
     var sqlException = ex.InnerException as System.Data.SqlClient.SqlException;

     if (sqlException.Number == 2601)
     {
         MessageBox.show("Product Already Exists");
     }
     else
     {
         MessageBox.show(ex.Message());
     }
}

2627 是唯一约束错误

2601 表示重复键行错误

希望对你有帮助!

【讨论】:

    【解决方案2】:

    您应该在通用Exception 之前找到SqlException。并定义您的SqlException 的对象实例,下面的代码将解决您的问题:

    try
    {
        queryInsert.ExecuteNonQuery();
    }
    catch (SqlException e)
    {
    
        if (exc.Number == 2601)
        {
            MessageBox.show("Your Record is already exists");
        }
        else
        {
            MessageBox.show(e.Message());
        }
    }
    catch(Exception e)
    {
        // other kind of exception
    }
    

    注意事项:

    2601 表示重复键行错误

    2627 表示唯一约束错误

    【讨论】:

      【解决方案3】:

      如果你使用了try catch,你应该抛出异常来捕捉

      try
      {
          queryInsert.ExecuteNonQuery();
      }
      catch 
      {
         throw;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多