ASP.NET 访问 Access 数据库完整教程
Access 数据库(.accdb 或 .mdb 文件)是一个轻量级的桌面级数据库,非常适合小型应用、个人项目或快速原型开发,在 ASP.NET 中,我们通常使用 ADO.NET 技术来与之交互。

目录
- 准备工作:安装必要软件
- 第一步:创建 Access 数据库(.accdb)
- 第二步:在 ASP.NET 项目中配置数据库连接
- 使用
Web.config(推荐) - 使用代码直接连接(不推荐,仅用于演示)
- 使用
- 第三步:编写 C# 代码进行数据库操作
- 读取数据(查询)
- 插入数据
- 更新数据
- 删除数据
- 第四步:在 ASP.NET Web Forms 页面中展示数据
- 最佳实践与注意事项
- 使用参数化查询(防止 SQL 注入)
- 使用
using语句管理资源 - 处理异常
- 部署注意事项
准备工作:安装必要软件
在开始之前,请确保你的计算机上已安装以下软件:
- .NET SDK: 用于创建和运行 ASP.NET 应用,推荐使用 .NET 6/7/8 或更高版本。
- Visual Studio: 一个强大的集成开发环境(IDE),社区版是免费的,足够使用。
- Microsoft Access: 用于创建和管理
.accdb文件,如果你没有安装,也可以使用其他工具(如 OpenOffice Base)创建,但确保最终格式是.accdb。
第一步:创建 Access 数据库(.accdb)
- 打开 Microsoft Access。
- 选择“空白数据库”。
- 点击“创建”。
- 我们将创建一个名为
Products的表,并设计如下字段:
| 字段名称 | 数据类型 | 说明 |
|---|---|---|
ID |
自动编号 | 主键 |
ProductName |
短文本 | 产品名称 |
Price |
数字 | 价格 |
Stock |
数字 | 库存 |
- 保存数据库文件,例如命名为
ProductsDB.accdb,并记住你保存的路径(C:\MyDatabases\ProductsDB.accdb)。
第二步:在 ASP.NET 项目中配置数据库连接
在 ASP.NET 中,最标准的做法是将数据库连接字符串存储在 Web.config 文件中,这样方便管理和修改。
使用 Web.config(推荐)
-
在 Visual Studio 中创建一个新的 ASP.NET Web Forms 项目(或 MVC 项目)。
-
在“解决方案资源管理器”中,找到并打开
Web.config文件。
(图片来源网络,侵删) -
在
<configuration>节点下,找到或添加<connectionStrings>节点,将你的 Access 数据库连接字符串添加进去。连接字符串格式说明:
Provider: 指定 OLE DB 提供程序,对于 Access 2007 及以上版本(.accdb),使用Microsoft.ACE.OLEDB.12.0,对于旧版 Access(.mdb),使用Microsoft.Jet.OLEDB.4.0。Data Source: 数据库文件的完整路径。注意: 在 Web 应用中,最好使用服务器上的物理路径,而不是网络共享路径。|DataDirectory|是一个特殊宏,它指向App_Data文件夹,这是存放数据库文件的最佳位置。
-
最佳实践:将数据库文件放入
App_Data文件夹- 在你的项目中右键 -> 添加 -> 新建文件夹,命名为
App_Data。 - 将你之前创建的
ProductsDB.accdb文件复制到这个App_Data文件夹中。
- 在你的项目中右键 -> 添加 -> 新建文件夹,命名为
-
修改后的
Web.config示例:
(图片来源网络,侵删)<configuration> <connectionStrings> <!-- Provider=Microsoft.ACE.OLEDB.12.0 用于 .accdb 文件 Provider=Microsoft.Jet.OLEDB.4.0 用于 .mdb 文件 --> <add name="DefaultConnection" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ProductsDB.accdb;Persist Security Info=False;" providerName="System.Data.OleDb" /> </connectionStrings> <system.web> ... </system.web> </configuration>
第三步:编写 C# 代码进行数据库操作
我们将创建一个 DatabaseHelper.cs 类来封装所有数据库操作,这样代码会更整洁、可重用。
在项目中创建一个新的类文件 DatabaseHelper.cs。
using System.Configuration;
using System.Data;
using System.Data.OleDb; // 引入 OLE DB 命名空间
public static class DatabaseHelper
{
// 从 Web.config 获取连接字符串
private static string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
// 执行查询并返回 DataTable
public static DataTable ExecuteQuery(string query)
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
using (OleDbCommand command = new OleDbCommand(query, connection))
{
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
return dataTable;
}
}
}
// 执行非查询操作 (INSERT, UPDATE, DELETE)
public static int ExecuteNonQuery(string query, OleDbParameter[] parameters)
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
using (OleDbCommand command = new OleDbCommand(query, connection))
{
// 如果有参数,则添加到命令中
if (parameters != null)
{
command.Parameters.AddRange(parameters);
}
connection.Open();
return command.ExecuteNonQuery(); // 返回受影响的行数
}
}
}
}
代码解释:
using ( ... ): 这是 C# 中处理非托管资源(如数据库连接)的最佳实践,它会自动在代码块执行完毕后调用Dispose()方法来释放资源,即使发生异常也能保证释放。OleDbConnection: 代表与数据库的连接。OleDbCommand: 代表要执行的 SQL 命令。OleDbDataAdapter: 用于填充DataSet或DataTable,是读取数据的桥梁。ExecuteQuery: 用于SELECT语句,返回一个包含查询结果的DataTable。ExecuteNonQuery: 用于INSERT,UPDATE,DELETE等不返回结果集的语句,返回受影响的行数。
第四步:在 ASP.NET Web Forms 页面中展示数据
现在我们创建一个页面来展示 Products 表中的数据。
- 在项目中添加一个新的 Web Form,
Default.aspx。 - 从工具箱中拖拽一个
GridView控件到页面上。 - 在
Default.aspx.cs(后台代码文件) 的Page_Load事件中,调用我们的DatabaseHelper来获取数据并绑定到GridView。
Default.aspx (页面设计):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AccessWebApp.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">Access Database Demo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>产品列表</h1>
<asp:GridView ID="GridViewProducts" runat="server" AutoGenerateColumns="true" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3">
<FooterStyle BackColor="White" ForeColor="#000066" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#F1F1F1" />
<SortedAscendingHeaderStyle BackColor="#007DBB" />
<SortedDescendingCellStyle BackColor="#CAC9C9" />
<SortedDescendingHeaderStyle BackColor="#00547E" />
</asp:GridView>
</div>
</form>
</body>
</html>
Default.aspx.cs (后台代码):
using System;
using System.Data;
using System.Web.UI;
namespace AccessWebApp
{
public partial class Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 页面首次加载时,绑定数据
BindData();
}
}
private void BindData()
{
// SQL 查询语句
string query = "SELECT ID, ProductName, Price, Stock FROM Products";
// 调用 Helper 类执行查询
DataTable productsTable = DatabaseHelper.ExecuteQuery(query);
// 将数据绑定到 GridView
GridViewProducts.DataSource = productsTable;
GridViewProducts.DataBind();
}
}
}
现在运行你的项目,你应该能看到 GridView 中显示了 Products 表中的所有数据。
最佳实践与注意事项
使用参数化查询(防止 SQL 注入)
直接拼接 SQL 字符串是非常危险的,会导致 SQL 注入攻击。永远不要这样做:
// 错误示范!有严重的安全漏洞! string productName = "'; DROP TABLE Products; --"; string query = "SELECT * FROM Products WHERE ProductName = '" + productName + "'";
正确做法是使用参数:
// 在 DatabaseHelper.cs 中添加一个带参数的查询方法
public static DataTable ExecuteQueryWithParams(string query, OleDbParameter[] parameters)
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
using (OleDbCommand command = new OleDbCommand(query, connection))
{
if (parameters != null)
{
command.Parameters.AddRange(parameters);
}
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
return dataTable;
}
}
}
插入数据的示例(使用参数):
// 在某个按钮的点击事件中
protected void btnAddProduct_Click(object sender, EventArgs e)
{
string productName = txtProductName.Text;
decimal price = decimal.Parse(txtPrice.Text);
int stock = int.Parse(txtStock.Text);
// SQL 语句,使用 @ 作为参数占位符
string query = "INSERT INTO Products (ProductName, Price, Stock) VALUES (@ProductName, @Price, @Stock)";
// 创建参数对象
OleDbParameter[] parameters = new OleDbParameter[]
{
new OleDbParameter("@ProductName", OleDbType.VarChar) { Value = productName },
new OleDbParameter("@Price", OleDbType.Decimal) { Value = price },
new OleDbParameter("@Stock", OleDbType.Integer) { Value = stock }
};
// 执行非查询
int rowsAffected = DatabaseHelper.ExecuteNonQuery(query, parameters);
if (rowsAffected > 0)
{
Response.Write("产品添加成功!");
// 重新绑定数据
BindData();
}
}
使用 using 语句
如前所述,using 语句对于确保数据库连接等资源被正确释放至关重要,养成这个好习惯。
处理异常
数据库操作可能会失败(如文件被占用、SQL 语法错误等),应该使用 try-catch 块来捕获异常并给出友好的错误提示。
try
{
DataTable dt = DatabaseHelper.ExecuteQuery("SELECT * FROM Products");
// ... 绑定数据
}
catch (Exception ex)
{
// 在实际应用中,记录日志到文件或数据库
// Response.Write("数据库操作失败:" + ex.Message);
// 或者显示一个用户友好的错误页面
Response.Redirect("ErrorPage.aspx?message=" + Server.UrlEncode(ex.Message));
}
部署注意事项
当你将应用部署到 IIS 服务器时:
- 权限问题:IIS 运行应用程序的默认账户(如
IIS_IUSRS或NETWORK SERVICE)可能没有权限访问App_Data文件夹。 - 解决方案:右键点击
App_Data文件夹 -> 属性 -> 安全 -> 编辑 -> 添加IIS_IUSRS或NETWORK SERVICE用户,并赋予“读取和写入”权限。
通过以上步骤,你已经学会了如何在 ASP.NET 中完整地连接、查询、操作和展示 Access 数据库,核心要点是:
- 使用
Web.config管理连接字符串。 - 将数据库文件放在
App_Data文件夹。 - 使用
using语句管理数据库连接。 - 始终使用参数化查询来防止 SQL 注入。
- 在部署时确保 IIS 用户有正确的文件权限。
虽然对于大型、高并发的应用,SQL Server 或 MySQL 等数据库是更好的选择,但对于小型项目、内部工具或学习目的,Access 数据库依然是一个简单、便捷的选择。
