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 脚本!