c# - Sql 异常没有显示在消息框中
问题描述
尝试插入重复项时出现 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");
}
}
}
}
调试的错误是
捕获的异常异常:AccountManager.exe 中的“System.Data.SqlClient.SqlException”(“违反 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; } = "";
}
}
}
}
解决方案
尝试这个
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 是重复键行错误
我希望这能帮到您!
推荐阅读
- jupyter-lab - 如何在 jupyterlab 启动器中添加自定义文件类型?
- c# - 如何对连接的 TPL 数据流块进行错误处理?
- node.js - AWS MSK 触发器 - Lambda(消费者)无限运行
- java - 映射外键 JPA
- javascript - 无法让 Google Sheets Node.js API 从工作表中获取值并将它们返回到数组中
- python - 如何使用 pyautogui 添加开和关按钮?
- python-3.x - 将数据从一个视图传递到另一个视图:Django
- android - 在最新版本的 android studio 中哪里可以找到 r.java
- git - 如何在所有 git 提交中搜索涉及多个字符串的更改,并对未更改的内容有一定的限制?
- flutter - flutter pub get : - fstore 依赖于来自依赖 async 2.8.1 的路径中的激发 UI,需要 async 2.8.1