- 技术栈简介:解释各个角色的作用。
- 环境搭建:准备工作。
- 核心步骤:如何连接和操作数据库。
- 代码示例:提供从简单到完整的代码。
- 最佳实践与安全:如何写出健壮、安全的代码。
- 进阶主题:如使用 Entity Framework。
技术栈简介
我们明确一下“ASP网站”在这里的含义,在当前的技术语境下,它通常指的是使用 ASP.NET 框架开发的网站,主要使用 C# 语言作为后端编程语言。

整个技术栈由以下几个关键部分组成:
- 前端:HTML, CSS, JavaScript,这是用户在浏览器中直接看到和交互的部分。
- 后端:ASP.NET (通常是 ASP.NET MVC 或 ASP.NET Core),这是网站的大脑,负责处理业务逻辑、接收用户请求、与数据库交互并生成响应。
- 数据库:MySQL,这是网站的数据仓库,负责存储所有信息,如用户数据、文章、商品等。
- 连接器/驱动:MySQL Connector/NET,这是一个关键的“翻译官”,它是一个 ADO.NET 提供程序,允许 ASP.NET 应用程序通过标准化的接口与 MySQL 数据库进行通信。
工作流程:
- 用户在浏览器中访问你的 ASP.NET 网站。
- ASP.NET 后端接收到请求。
- 后端代码通过 MySQL Connector/NET 向 MySQL 数据库发送查询指令(“获取所有用户列表”)。
- MySQL 数据库执行指令,并将结果返回给 ASP.NET 后端。
- 后端代码处理这些数据,并将其渲染成 HTML 页面。
- 最终的 HTML 页面被发送回用户的浏览器进行显示。
环境搭建
在开始编码之前,你需要准备好以下环境:
-
开发工具:
(图片来源网络,侵删)- Visual Studio 2025 (推荐社区版,免费),这是微软官方的集成开发环境,对 ASP.NET 开发支持最好。
- Visual Studio Code 也可以,但配置相对复杂一些。
-
.NET SDK:
- 从 .NET 官网 下载并安装最新的 .NET SDK(.NET 6, 7, 8),Visual Studio 2025 安装程序通常会引导你安装它。
-
数据库服务器:
- 从 MySQL 官网 下载并安装 MySQL Server,安装过程中,请务必记住你设置的 root 用户密码。
-
MySQL Connector/NET:
- 好消息:如果你使用 Visual Studio 创建项目并从 NuGet 包管理器添加 MySQL 引用,通常会自动安装最新版本的连接器,所以这一步可以跳过,在需要时再安装。
核心步骤:连接与操作数据库
下面我们通过一个经典的“增删改查”(CRUD)示例来演示整个过程。

步骤 1:创建项目和数据库
-
创建 ASP.NET Web 项目:
- 打开 Visual Studio,选择“创建新项目”。
- 搜索并选择“ASP.NET Web 应用程序”模板(建议选择 MVC 模板,它结构清晰)。
- 给项目命名,
MyWebApp。 - 在下一个窗口中,选择“Web 应用程序”(MVC) 模板,然后点击“创建”。
-
创建 MySQL 数据库和表:
-
你可以使用 MySQL Workbench、Navicat 等图形化工具,或者使用命令行。
-
这里我们用命令行示例:
-- 登录到 MySQL mysql -u root -p -- 创建一个新数据库 CREATE DATABASE mywebapp_db; -- 使用这个数据库 USE mywebapp_db; -- 创建一个用户表 CREATE TABLE Users ( Id INT AUTO_INCREMENT PRIMARY KEY, Username VARCHAR(50) NOT NULL UNIQUE, Email VARCHAR(100) NOT NULL UNIQUE, PasswordHash VARCHAR(255) NOT NULL, CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 插入一条测试数据 (密码是 "123456" 的哈希值,实际开发中请勿用明文) INSERT INTO Users (Username, Email, PasswordHash) VALUES ('admin', 'admin@example.com', 'some_hashed_password_here');
-
步骤 2:在项目中安装 MySQL 连接器
- 在 Visual Studio 的“解决方案资源管理器”中,右键点击你的项目。
- 选择“管理 NuGet 程序包”。
- 在“浏览”选项卡中,搜索
MySql.Data。 - 找到
MySql.Data包(由 Oracle 提供),点击“安装”,这会自动安装所有必要的依赖项。
步骤 3:编写连接字符串
连接字符串是告诉应用程序如何连接到数据库的一串特殊字符。
- 在 Visual Studio 的“解决方案资源管理器”中,找到
Web.config文件(对于 .NET Core/5+ 是appsettings.json)。 - 在
<configuration>节点下,添加<connectionStrings>节点。
对于 Web.config (ASP.NET Framework):
<configuration>
<connectionStrings>
<add name="DefaultConnection"
connectionString="Server=127.0.0.1;Port=3306;Database=mywebapp_db;Uid=root;Pwd=你的密码;"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
...
</configuration>
对于 appsettings.json (ASP.NET Core):
{
"ConnectionStrings": {
"DefaultConnection": "Server=127.0.0.1;Port=3306;Database=mywebapp_db;Uid=root;Pwd=你的密码;"
},
...
}
连接字符串参数说明:
Server: 你的 MySQL 服务器地址,本地通常是0.0.1或localhost。Port: MySQL 的端口号,默认是3306。Database: 你要连接的数据库名称。Uid: 数据库用户名。Pwd: 数据库密码。
步骤 4:创建数据访问层
为了代码清晰,我们创建一个专门的类来处理数据库操作。
- 在项目中创建一个新文件夹,
DAL(Data Access Layer)。 - 在
DAL文件夹中,添加一个类UserRepository.cs。
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
namespace MyWebApp.DAL
{
public class UserRepository
{
private readonly string _connectionString;
// 构造函数,从配置文件中获取连接字符串
public UserRepository(string connectionString)
{
_connectionString = connectionString;
}
// 获取所有用户
public List<string> GetAllUsers()
{
var users = new List<string>();
using (var connection = new MySqlConnection(_connectionString))
{
string query = "SELECT Username FROM Users";
using (var command = new MySqlCommand(query, connection))
{
try
{
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
users.Add(reader["Username"].ToString());
}
}
}
catch (Exception ex)
{
// 记录错误日志
Console.WriteLine("数据库查询出错: " + ex.Message);
}
}
}
return users;
}
}
}
步骤 5:在 Controller 中使用数据访问层
- 打开
Controllers/HomeController.cs文件。 - 修改
IndexAction,来获取用户列表并传递给视图。
using System.Web.Mvc;
using MyWebApp.DAL; // 引入我们的数据访问层命名空间
namespace MyWebApp.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
// 从 Web.config 读取连接字符串
string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
// 创建 UserRepository 实例
var userRepo = new UserRepository(connStr);
// 获取用户列表
var userList = userRepo.GetAllUsers();
// 将数据传递给视图
ViewBag.Users = userList;
return View();
}
}
}
步骤 6:在 View 中显示数据
- 打开
Views/Home/Index.cshtml文件。 - ,使用
ViewBag来显示用户列表。
@{
ViewBag.Title = "Home Page";
}
<div class="jumbotron">
<h1>ASP.NET + MySQL 示例</h1>
<p class="lead">这是一个展示如何从 MySQL 数据库读取数据并显示在 ASP.NET 网站上的简单示例。</p>
</div>
<div class="row">
<div class="col-md-4">
<h2>用户列表</h2>
<ul>
@if (ViewBag.Users != null)
{
foreach (var user in ViewBag.Users)
{
<li>@user</li>
}
}
else
{
<li>没有找到用户或连接数据库失败。</li>
}
</ul>
</div>
</div>
运行你的项目,你应该就能在首页看到从 MySQL 数据库中读取到的 "admin" 用户名了。
最佳实践与安全
直接使用 MySqlCommand 和 MySqlConnection 是可以的,但为了安全和可维护性,请务必遵循以下最佳实践:
-
永远不要使用字符串拼接来构建 SQL 查询!
- 错误示范:
string query = "SELECT * FROM Users WHERE Username = '" + username + "';"; - 后果: 极易受到 SQL 注入 攻击,导致数据泄露或被篡改。
- 错误示范:
-
始终使用参数化查询
- 这是防止 SQL 注入攻击的唯一有效方法,你将用户输入作为参数传递,而不是直接拼接到 SQL 语句中。
// 安全的参数化查询示例 string query = "SELECT * FROM Users WHERE Username = @username AND PasswordHash = @password"; using (var command = new MySqlCommand(query, connection)) { command.Parameters.AddWithValue("@username", userInput); command.Parameters.AddWithValue("@password", passwordInput); // ... 执行查询 } -
使用
using语句MySqlConnection和MySqlCommand等对象都实现了IDisposable接口,使用using语句可以确保它们在使用完毕后自动释放资源,避免数据库连接泄露。
-
不要在代码中硬编码密码
- 像连接字符串这样的敏感信息,一定要存储在配置文件(
Web.config/appsettings.json)中,并通过服务器的安全机制(如受保护的配置)进行加密。
- 像连接字符串这样的敏感信息,一定要存储在配置文件(
进阶主题:使用 Entity Framework (EF) Core
对于大型项目,手动编写 SQL 语句会变得非常繁琐且容易出错。Entity Framework Core (EF Core) 是一个强大的对象关系映射器,可以让你:
- 用 C# 类(模型)来表示数据库表。
- 用 LINQ 查询语言来代替手写 SQL。
- EF Core 会自动将你的 LINQ 查询翻译成高效的 SQL 语句,并负责参数化查询,极大地提高了开发效率和安全性。
如何使用 EF Core with MySQL:
-
安装 NuGet 包:
Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.DesignPomelo.EntityFrameworkCore.MySql(这是社区为 MySQL 提供的高性能 EF Core Provider)
-
创建数据模型:
// Models/User.cs public class User { public int Id { get; set; } public string Username { get; set; } public string Email { get; set; } public string PasswordHash { get; set; } public DateTime CreatedAt { get; set; } } -
创建数据库上下文:
// Data/ApplicationDbContext.cs using Microsoft.EntityFrameworkCore; using MyWebApp.Models; public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<User> Users { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置表名和列名等 modelBuilder.Entity<User>(entity => { entity.ToTable("Users"); entity.HasKey(e => e.Id); }); } } -
在
Startup.cs(或Program.cs) 中配置服务:// 从 appsettings.json 读取连接字符串 var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); // 注册 DbContext builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString))); -
在 Controller 中使用:
// Controller private readonly ApplicationDbContext _context; public HomeController(ApplicationDbContext context) { _context = context; } public IActionResult Index() { // 使用 LINQ 查询,无需手写 SQL! var users = _context.Users.Select(u => u.Username).ToList(); ViewBag.Users = users; return View(); }
使用 EF Core 可以让你从繁琐的 SQL 和数据库连接管理中解放出来,更专注于业务逻辑的实现,是目前 ASP.NET 应用程序与数据库交互的主流方式。
| 特性 | 原生 ADO.NET (MySql Connector) | Entity Framework Core |
|---|---|---|
| 性能 | 最高,直接控制 SQL 和连接。 | 稍有开销,但现代 EF Core 已非常高效。 |
| 控制力 | 最强,可以写出任何复杂的 SQL 和优化。 | 控制力相对较弱,依赖 EF Core 的翻译能力。 |
| 开发效率 | 较低,需要手动编写大量样板代码。 | 极高,通过模型和 LINQ 快速开发。 |
| 学习曲线 | 较平缓,基础概念简单。 | 较陡峭,需要理解 EF Core 的概念(如 Change Tracking)。 |
| 适用场景 | 性能要求极高的底层模块、执行复杂存储过程。 | 绝大多数 Web 应用程序、快速原型开发。 |
对于初学者和大多数项目,强烈推荐从 Entity Framework Core 开始,它提供了更好的开发体验和安全性,让你能更快地构建出功能完善的网站,当你遇到 EF Core 无法解决的极端性能问题时,再考虑回归到原生 ADO.NET。
