如何在ASP.NET中防止数据库数据重复插入?

ASP.NET 数据库数据不能重复插入

在ASP.NET应用程序中,确保数据库中的数据不会重复插入是一个常见的需求,本文将详细介绍如何实现这一功能,包括使用SQL Server数据库和Entity Framework来实现数据的查重与插入。

如何在ASP.NET中防止数据库数据重复插入?

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文件中添加数据库连接字符串:

如何在ASP.NET中防止数据库数据重复插入?

<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文件中,创建一个简单的表单用于输入产品信息:

如何在ASP.NET中防止数据库数据重复插入?

@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 数据库数据不能重复插入 代码”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。