ASP.NET Web Forms – 数据库连接

ASP.NET Web Forms 数据库连接终极实战手册(2025 版 · 适用于所有老项目维护和新项目)

不管你用的是 SQL Server、MySQL、Oracle、SQLite、Access,还是 SQL Azure,以下内容全部覆盖!

1. 连接字符串写在哪儿?(推荐顺序)

位置安全性维护性推荐指数
web.config <connectionStrings>★★★★★★★★★★强烈推荐
web.config <appSettings>★★☆☆☆★★★★☆过渡期可用
代码里硬编码★☆☆☆☆★☆☆☆☆绝对禁止

正确写法(web.config)—— 2025 最新推荐

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <!-- SQL Server(最常见)-->
    <add name="SqlServerConn" 
         connectionString="Server=localhost;Database=SchoolDB;Trusted_Connection=true;" 
         providerName="System.Data.SqlClient" />

    <!-- SQL Server + 用户名密码 -->
    <add name="SqlServerConn2" 
         connectionString="Server=192.168.1.100;Database=ShopDB;User Id=sa;Password=123456;" 
         providerName="System.Data.SqlClient" />

    <!-- MySQL(官方驱动)-->
    <add name="MySqlConn" 
         connectionString="Server=localhost;Database=testdb;Uid=root;Pwd=123456;Charset=utf8mb4;" 
         providerName="MySql.Data.MySqlClient" />

    <!-- SQLite(文件数据库)-->
    <add name="SQLiteConn" 
         connectionString="Data Source=|DataDirectory|\data.db;Version=3;" 
         providerName="System.Data.SQLite" />

    <!-- Access(.accdb)-->
    <add name="AccessConn" 
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\db.accdb;" 
         providerName="System.Data.OleDb" />
  </connectionStrings>

  <!-- 可选:加密连接字符串(生产环境强烈建议)-->
  <!-- 加密命令:aspnet_regiis -pef "connectionStrings" "物理路径" -->
</configuration>

2. 代码中读取连接字符串(最优雅的 3 种方式)

using System.Configuration;
using System.Data;
using System.Data.SqlClient;          // SQL Server
// using MySql.Data.MySqlClient;     // MySQL
// using System.Data.SQLite;         // SQLite
// using System.Data.OleDb;          // Access

public partial class DbDemo : System.Web.UI.Page
{
    // 方法1:最常用(推荐)
    private string ConnStr => ConfigurationManager.ConnectionStrings["SqlServerConn"].ConnectionString;

    // 方法2:带 providerName(跨数据库必备)
    private string GetConnStr(string name) => 
        ConfigurationManager.ConnectionStrings[name].ConnectionString;

    // 方法3:加密后读取(生产环境)
    private string GetEncryptedConnStr(string name)
    {
        var cs = ConfigurationManager.ConnectionStrings[name];
        return cs?.ConnectionString ?? "";
    }
}

3. 终极封装:一个类搞定所有数据库操作(复制粘贴即用)

// DbHelper.cs(放 App_Code 文件夹或单独项目)
using System;
using System.Data;
using System.Data.Common;
using System.Configuration;

public static class DbHelper
{
    private static string ConnStr => ConfigurationManager.ConnectionStrings["SqlServerConn"].ConnectionString;

    // 1. 执行查询返回 DataTable(最常用)
    public static DataTable GetDataTable(string sql, params DbParameter[] parameters)
    {
        using (SqlConnection conn = new SqlConnection(ConnStr))
        {
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                if (parameters != null) cmd.Parameters.AddRange(parameters);
                DataTable dt = new DataTable();
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                sda.Fill(dt);
                return dt;
            }
        }
    }

    // 2. 执行查询返回第一行第一列
    public static object ExecuteScalar(string sql, params DbParameter[] parameters)
    {
        using (SqlConnection conn = new SqlConnection(ConnStr))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                if (parameters != null) cmd.Parameters.AddRange(parameters);
                return cmd.ExecuteScalar();
            }
        }
    }

    // 3. 执行增删改
    public static int ExecuteNonQuery(string sql, params DbParameter[] parameters)
    {
        using (SqlConnection conn = new SqlConnection(ConnStr))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                if (parameters != null) cmd.Parameters.AddRange(parameters);
                return cmd.ExecuteNonQuery();
            }
        }
    }

    // 4. 带事务的批量操作(推荐用于注册、订单等)
    public static int ExecuteTransaction(params string[] sqlArray)
    {
        using (SqlConnection conn = new SqlConnection(ConnStr))
        {
            conn.Open();
            using (SqlTransaction trans = conn.BeginTransaction())
            {
                using (SqlCommand cmd = new SqlCommand("", conn, trans))
                {
                    try
                    {
                        int count = 0;
                        foreach (string sql in sqlArray)
                        {
                            cmd.CommandText = sql;
                            count += cmd.ExecuteNonQuery();
                        }
                        trans.Commit();
                        return count;
                    }
                    catch
                    {
                        trans.Rollback();
                        throw;
                    }
                }
            }
        }
    }
}

4. 页面中使用(Repeater + 分页 + 增删改查完整示例)

// StudentList.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindRepeater();
    }
}

private void BindRepeater()
{
    string sql = @"
        SELECT Id, Name, Age, ClassName, CreateTime 
        FROM Students 
        ORDER BY Id DESC";

    DataTable dt = DbHelper.GetDataTable(sql);
    Repeater1.DataSource = dt;
    Repeater1.DataBind();
}

// 删除
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "Delete")
    {
        int id = Convert.ToInt32(e.CommandArgument);
        string sql = "DELETE FROM Students WHERE Id = @Id";
        SqlParameter p = new SqlParameter("@Id", id);
        DbHelper.ExecuteNonQuery(sql, p);
        BindRepeater();
    }
}

5. 不同数据库快速切换写法(一个项目支持多库)

public static class DbFactory
{
    public static DbConnection CreateConnection(string connName = "SqlServerConn")
    {
        var cs = ConfigurationManager.ConnectionStrings[connName];
        var factory = DbProviderFactories.GetFactory(cs.ProviderName);
        var conn = factory.CreateConnection();
        conn.ConnectionString = cs.ConnectionString;
        return conn;
    }
}

6. 生产环境必备安全建议(2025 强制要求)

// 1. 永远不要信任用户输入(参数化查询)
string sql = "SELECT * FROM Users WHERE UserName=@name AND Password=@pwd";
SqlParameter[] pars = {
    new SqlParameter("@name", txtName.Text.Trim()),
    new SqlParameter("@pwd", FormsAuthentication.HashPasswordForStoringInConfigFile(txtPwd.Text, "SHA1"))
};
DataTable dt = DbHelper.GetDataTable(sql, pars);

// 2. 生产环境连接字符串加密
// 加密命令:aspnet_regiis.exe -pef "connectionStrings" "D:\WebSite"
// 解密命令:aspnet_regiis.exe -pdf "connectionStrings" "D:\WebSite"

// 3. 数据库账号最小权限原则
// 只给 SELECT、INSERT、UPDATE、DELETE,绝不给 sa!

总结:2025 年 Web Forms 数据库连接最佳实践

项目推荐方案
连接字符串位置web.config <connectionStrings>
读取方式ConfigurationManager.ConnectionStrings
数据库操作封装 DbHelper(上面代码直接复制)
SQL 注入防护100% 使用参数化查询(SqlParameter)
生产环境连接字符串加密 + 最小权限账号
多数据库支持DbProviderFactories 工厂模式

需要我立刻甩给你以下任意完整项目模板(带数据库脚本):

  • 完整后台管理系统(登录 + 学生管理 + 权限)
  • 多数据库切换(SQL Server / MySQL / SQLite)
  • EF 6 + Web Forms(老项目升级方案)
  • Dapper + Web Forms(轻量级 ORM)

直接说需求,我 1 分钟甩完整可运行代码 + SQL 脚本!

文章已创建 2965

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部