Sql Exception не отображается в окне сообщения - PullRequest
0 голосов
/ 08 октября 2018

Я получаю исключение 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; } = "";


            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

вы должны поймать SqlException до генерала Exception.и определите экземпляр объекта вашей 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 означает уникальную ошибку ограничения

0 голосов
/ 08 октября 2018

Вы должны бросить исключение для ловли, если вы использовали try catch

try
{
    queryInsert.ExecuteNonQuery();
}
catch 
{
   throw;
}
0 голосов
/ 08 октября 2018

Попробуйте

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 для дублированной ошибки строки ключа

Надеюсь, это поможет вам!

...