在 .NET 开发中,数据库连接是实现数据存储、查询和操作的核心步骤,以下是关于 .NET 连接数据库的详细指南,涵盖基础概念、主流数据库实现方式及代码示例。
数据库连接基础概念
-
ADO.NET 与 EF Core
- ADO.NET:提供底层数据库操作能力,通过
SqlConnection
(SQL Server)、MySqlConnection
(MySQL)等类实现连接。 - Entity Framework Core(EF Core):基于 ORM 的高层框架,通过定义实体类和
DbContext
简化数据操作。
- ADO.NET:提供底层数据库操作能力,通过
-
连接字符串
用于指定数据库类型、服务器地址、认证方式等信息,格式因数据库而异,- SQL Server:
Server=localhost;Database=Test;User Id=sa;Password=123456;
- MySQL:
Server=localhost;Database=test;Uid=root;Pwd=123456;
- SQL Server:
常见数据库连接实现
数据库类型 | 关键 NuGet 包 | 示例连接字符串 |
---|---|---|
SQL Server | System.Data.SqlClient |
Server=localhost;Database=Test;User Id=sa;Password=123456; |
MySQL | MySql.Data |
Server=localhost;Database=test;Uid=root;Pwd=123456;CharSet=utf8; |
PostgreSQL | Npgsql |
Host=localhost;Database=test;Username=postgres;Password=123456; |
SQLite | System.Data.SQLite |
Data Source=test.db;Version=3; |
Oracle | Oracle.ManagedDataAccess |
User Id=admin;Password=123456;Data Source=localhost:1521/orclpdb; |
ADO.NET 连接数据库步骤与代码示例
添加依赖
通过 NuGet 安装对应数据库的驱动包,SQL Server 的 System.Data.SqlClient
。
编写连接代码
using System; using System.Data.SqlClient; class Program { static void Main() { // 定义连接字符串 string connectionString = "Server=localhost;Database=Test;User Id=sa;Password=123456;"; // 创建连接对象 using (SqlConnection connection = new SqlConnection(connectionString)) { try { // 打开连接 connection.Open(); Console.WriteLine("数据库连接成功!"); // 执行 SQL 命令(示例) string query = "SELECT FROM Users"; using (SqlCommand command = new SqlCommand(query, connection)) { using (var reader = command.ExecuteReader()) { while (reader.Read()) { Console.Write(reader["Id"] + "t"); Console.WriteLine(reader["Name"]); } } } } catch (SqlException ex) { Console.WriteLine("数据库连接错误:" + ex.Message); } } // 自动关闭连接 } }
关键点解析
using
语句:确保连接和命令对象在使用后自动释放资源。- 异常处理:通过
try-catch
捕获SqlException
,处理连接失败或 SQL 错误。 - 连接池:默认启用连接池,可通过
Max Pool Size
参数优化性能。
Entity Framework Core 连接方法
配置 DbContext
// 导入包:Microsoft.EntityFrameworkCore.SqlServer using Microsoft.EntityFrameworkCore; public class AppDbContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) { // 读取连接字符串(推荐从配置文件获取) options.UseSqlServer("Server=localhost;Database=Test;User Id=sa;Password=123456;"); } } public class User { public int Id { get; set; } public string Name { get; set; } }
使用依赖注入
// 在 Program.cs 中配置服务 var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer("Server=localhost;Database=Test;User Id=sa;Password=123456;")); // 在控制器或服务中使用 var dbContext = builder.Services.BuildServiceProvider().GetRequiredService<AppDbContext>(); var users = dbContext.Users.ToList();
连接字符串管理与安全
-
配置文件存储
将连接字符串写入appsettings.json
,并通过Configuration
加载:{ "ConnectionStrings": { "Default": "Server=localhost;Database=Test;User Id=sa;Password=123456;" } }
代码中读取:
var connectionString = Configuration.GetConnectionString("Default");
-
环境变量与密钥管理
- 生产环境中避免明文存储密码,可使用环境变量(如
DB_PASSWORD
)或密钥库。 - 示例:
options.UseSqlServer(Environment.GetEnvironmentVariable("DB_CONNECTION_STRING"));
- 生产环境中避免明文存储密码,可使用环境变量(如
错误处理与优化
问题 | 解决方案 |
---|---|
连接超时 | 设置 ConnectTimeout (单位秒),ConnectTimeout=30; |
并发连接过多 | 调整 Max Pool Size (默认 100),如 Max Pool Size=50; |
权限不足 | 检查数据库用户权限,确保具备目标数据库的读写权限。 |
SSL 证书错误(远程连接) | 在连接字符串中启用加密:Encrypt=true;TrustServerCertificate=false; |
FAQs
什么是连接池,如何配置?
连接池通过复用物理连接减少频繁创建/销毁的开销,关键参数包括:
Max Pool Size
:最大连接数(默认 100)。Min Pool Size
:初始化时创建的最小连接数(默认 0)。
示例:Min Pool Size=10;Max Pool Size=50;
如何保护连接字符串中的敏感信息?
- 配置文件加密:使用工具对
appsettings.json
中敏感字段加密。 - 环境变量:将连接字符串拆分为多段,分别存储于环境变量中。
- 密钥管理服务:如 Azure Key Vault
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/68891.html