ASP.NET 访问 Access 数据库完整教程

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

asp.net access教程
(图片来源网络,侵删)

目录

  1. 准备工作:安装必要软件
  2. 第一步:创建 Access 数据库(.accdb)
  3. 第二步:在 ASP.NET 项目中配置数据库连接
    • 使用 Web.config(推荐)
    • 使用代码直接连接(不推荐,仅用于演示)
  4. 第三步:编写 C# 代码进行数据库操作
    • 读取数据(查询)
    • 插入数据
    • 更新数据
    • 删除数据
  5. 第四步:在 ASP.NET Web Forms 页面中展示数据
  6. 最佳实践与注意事项
    • 使用参数化查询(防止 SQL 注入)
    • 使用 using 语句管理资源
    • 处理异常
    • 部署注意事项

准备工作:安装必要软件

在开始之前,请确保你的计算机上已安装以下软件:

  • .NET SDK: 用于创建和运行 ASP.NET 应用,推荐使用 .NET 6/7/8 或更高版本。
  • Visual Studio: 一个强大的集成开发环境(IDE),社区版是免费的,足够使用。
  • Microsoft Access: 用于创建和管理 .accdb 文件,如果你没有安装,也可以使用其他工具(如 OpenOffice Base)创建,但确保最终格式是 .accdb

第一步:创建 Access 数据库(.accdb)

  1. 打开 Microsoft Access。
  2. 选择“空白数据库”。
  3. 点击“创建”。
  4. 我们将创建一个名为 Products 的表,并设计如下字段:
字段名称 数据类型 说明
ID 自动编号 主键
ProductName 短文本 产品名称
Price 数字 价格
Stock 数字 库存
  1. 保存数据库文件,例如命名为 ProductsDB.accdb,并记住你保存的路径(C:\MyDatabases\ProductsDB.accdb)。

第二步:在 ASP.NET 项目中配置数据库连接

在 ASP.NET 中,最标准的做法是将数据库连接字符串存储在 Web.config 文件中,这样方便管理和修改。

使用 Web.config(推荐)

  1. 在 Visual Studio 中创建一个新的 ASP.NET Web Forms 项目(或 MVC 项目)。

  2. 在“解决方案资源管理器”中,找到并打开 Web.config 文件。

    asp.net access教程
    (图片来源网络,侵删)
  3. <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 文件夹,这是存放数据库文件的最佳位置。
  4. 最佳实践:将数据库文件放入 App_Data 文件夹

    • 在你的项目中右键 -> 添加 -> 新建文件夹,命名为 App_Data
    • 将你之前创建的 ProductsDB.accdb 文件复制到这个 App_Data 文件夹中。
  5. 修改后的 Web.config 示例:

    asp.net access教程
    (图片来源网络,侵删)
    <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: 用于填充 DataSetDataTable,是读取数据的桥梁。
  • ExecuteQuery: 用于 SELECT 语句,返回一个包含查询结果的 DataTable
  • ExecuteNonQuery: 用于 INSERT, UPDATE, DELETE 等不返回结果集的语句,返回受影响的行数。

第四步:在 ASP.NET Web Forms 页面中展示数据

现在我们创建一个页面来展示 Products 表中的数据。

  1. 在项目中添加一个新的 Web Form,Default.aspx
  2. 从工具箱中拖拽一个 GridView 控件到页面上。
  3. 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 服务器时:

  1. 权限问题:IIS 运行应用程序的默认账户(如 IIS_IUSRSNETWORK SERVICE)可能没有权限访问 App_Data 文件夹。
  2. 解决方案:右键点击 App_Data 文件夹 -> 属性 -> 安全 -> 编辑 -> 添加 IIS_IUSRSNETWORK SERVICE 用户,并赋予“读取和写入”权限。

通过以上步骤,你已经学会了如何在 ASP.NET 中完整地连接、查询、操作和展示 Access 数据库,核心要点是:

  1. 使用 Web.config 管理连接字符串
  2. 将数据库文件放在 App_Data 文件夹
  3. 使用 using 语句管理数据库连接
  4. 始终使用参数化查询来防止 SQL 注入
  5. 在部署时确保 IIS 用户有正确的文件权限

虽然对于大型、高并发的应用,SQL Server 或 MySQL 等数据库是更好的选择,但对于小型项目、内部工具或学习目的,Access 数据库依然是一个简单、便捷的选择。