如何在ASP.NET中防止数据库数据重复插入?
ASP.NET 数据库数据不能重复插入
在ASP.NET应用程序中,确保数据库中的数据不会重复插入是一个常见的需求,本文将详细介绍如何实现这一功能,包括使用SQL Server数据库和Entity Framework来实现数据的查重与插入。
1. 创建数据库和表
我们需要创建一个数据库和一张表,用于存储数据,假设我们使用SQL Server数据库,并创建一个名为Products
的表:
CREATE DATABASE TestDB; GO USE TestDB; GO CREATE TABLE Products ( Id INT PRIMARY KEY IDENTITY, Name NVARCHAR(50) NOT NULL, Price DECIMAL(18, 2) NOT NULL, UNIQUE (Name) -确保产品名称唯一 );
2. 配置ASP.NET项目
我们在Visual Studio中创建一个新的ASP.NET Web应用程序(可以选择Web Forms、MVC或Razor Pages),我们选择ASP.NET MVC模板。
安装Entity Framework
在NuGet包管理器中安装Entity Framework:
Install-Package EntityFramework
添加连接字符串
在web.config
文件中添加数据库连接字符串:
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=TestDB;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
创建数据模型
在项目中添加一个新的类库,用于定义数据模型和数据上下文:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Product { [Key] public int Id { get; set; } [Required] [StringLength(50)] public string Name { get; set; } [Required] public decimal Price { get; set; } }
创建数据上下文
在数据模型类库中,创建数据上下文类:
using System.Data.Entity; public class ApplicationDbContext : DbContext { public ApplicationDbContext() : base("DefaultConnection") { } public DbSet<Product> Products { get; set; } }
3. 控制器实现
在MVC项目中,创建一个新的控制器,用于处理产品的增删改查操作:
using System.Linq; using System.Web.Mvc; using TestDB.Models; // 替换为实际命名空间 public class ProductController : Controller { private readonly ApplicationDbContext _context; public ProductController() { _context = new ApplicationDbContext(); } // GET: /Product/Create public ActionResult Create() { return View(); } // POST: /Product/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "Name,Price")] Product product) { if (ModelState.IsValid) { // 检查产品名称是否已存在 if (_context.Products.Any(p => p.Name == product.Name)) { ModelState.AddModelError("Name", "产品名称已存在。"); return View(product); } _context.Products.Add(product); _context.SaveChanges(); return RedirectToAction("Index"); } return View(product); } }
4. 视图实现
在Views/Product/Create.cshtml
文件中,创建一个简单的表单用于输入产品信息:
@model TestDB.Models.Product @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>产品信息</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="创建" class="btn btn-default" /> </div> </div> </div> }
5. 运行项目并测试
启动项目,导航到/Product/Create
页面,尝试添加新的产品,如果产品名称已经存在,系统会提示错误信息,防止重复插入。
常见问题解答
问题1:如何在不使用Entity Framework的情况下实现数据查重?
答:如果不使用Entity Framework,可以使用ADO.NET直接执行SQL查询。
using System; using System.Data.SqlClient; using System.Configuration; using System.Web.Mvc; using TestDB.Models; // 替换为实际命名空间 public class ProductController : Controller { private string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; // POST: /Product/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "Name,Price")] Product product) { if (ModelState.IsValid) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string checkQuery = "SELECT COUNT(*) FROM Products WHERE Name = @Name"; using (SqlCommand cmd = new SqlCommand(checkQuery, conn)) { cmd.Parameters.AddWithValue("@Name", product.Name); int count = Convert.ToInt32(cmd.ExecuteScalar()); if (count > 0) { ModelState.AddModelError("Name", "产品名称已存在。"); return View(product); } } } using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string insertQuery = "INSERT INTO Products (Name, Price) VALUES (@Name, @Price)"; using (SqlCommand cmd = new SqlCommand(insertQuery, conn)) { cmd.Parameters.AddWithValue("@Name", product.Name); cmd.Parameters.AddWithValue("@Price", product.Price); cmd.ExecuteNonQuery(); } } return RedirectToAction("Index"); } return View(product); } }
这种方法直接使用SQL查询来检查数据是否存在,并在不存在时插入新数据。
到此,以上就是小编对于“asp.net 数据库数据不能重复插入 代码”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。