aspnet如何连接数据库读取数据?详细步骤与示例分享

在ASP.NET Core中高效安全地连接数据库并读取数据是开发Web应用的核心能力,以下是基于ADO.NET的专业实现方案,遵循最佳实践确保性能与安全:

aspnet如何连接数据库读取数据?详细步骤与示例分享


环境准备与配置

  1. 引用必要NuGet包

    Install-Package System.Data.SqlClient # SQL Server
    # 或 Install-Package MySql.Data # MySQL
  2. 配置连接字符串 (appsettings.json)

    {
    "ConnectionStrings": {
     "DefaultConnection": "Server=.;Database=YourDB;User Id=sa;Password=YourPwd;Encrypt=True;TrustServerCertificate=True;"
    }
    }

分层架构实现(推荐)

数据访问层 (DAL)

public class ProductRepository
{
    private readonly IConfiguration _config;
    public ProductRepository(IConfiguration config) 
    {
        _config = config;
    }
    public List<Product> GetProducts()
    {
        var products = new List<Product>();
        // 使用using确保资源释放
        using (var conn = new SqlConnection(
            _config.GetConnectionString("DefaultConnection")))
        {
            // 参数化查询防SQL注入
            var sql = "SELECT ProductId, Name, Price FROM Products WHERE Stock > @MinStock";
            using (var cmd = new SqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@MinStock", 10);
                conn.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        products.Add(new Product()
                        {
                            Id = reader.GetInt32(0),
                            Name = reader.GetString(1),
                            Price = reader.GetDecimal(2)
                        });
                    }
                }
            }
        }
        return products;
    }
}
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

服务层调用 (Service Layer)

public class ProductService
{
    private readonly ProductRepository _repo;
    public ProductService(ProductRepository repo) 
    {
        _repo = repo;
    }
    public IEnumerable<Product> GetAvailableProducts() 
    {
        return _repo.GetProducts();
    }
}

控制器注入 (Controller)

aspnet如何连接数据库读取数据?详细步骤与示例分享

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly ProductService _service;
    public ProductsController(ProductService service) 
    {
        _service = service;
    }
    [HttpGet]
    public IActionResult Get() 
    {
        return Ok(_service.GetAvailableProducts());
    }
}

关键安全与性能优化

  1. 防御性编程

    • 参数化查询:彻底杜绝SQL注入
    • 连接池:默认启用,通过Pooling=true控制
    • 错误日志:捕获SqlException并记录
  2. 异步操作提升吞吐量

    public async Task<List<Product>> GetProductsAsync()
    {
     using (var conn = new SqlConnection(_config.GetConnectionString("DefaultConnection")))
     {
         await conn.OpenAsync();
         using (var cmd = new SqlCommand("SELECT...", conn))
         {
             using (var reader = await cmd.ExecuteReaderAsync())
             {
                 // 异步读取逻辑
             }
         }
     }
    }
  3. 企业级扩展方案

    • ORM选择:Entity Framework Core(复杂业务场景)
    • Dapper:高性能微ORM(适合读密集型操作)
    • 连接管理:使用IDbConnectionFactory

不同数据库适配方案

数据库类型 连接包 连接字符串示例
SQL Server System.Data.SqlClient Server=.;Database=DB;User=sa;Pwd=xxx;
MySQL MySql.Data Server=localhost;Database=DB;Uid=root;Pwd=xxx;
PostgreSQL Npgsql Host=localhost;Database=DB;Username=postgres;Password=xxx;

常见陷阱解决方案

  1. 连接泄露

    • 错误:未调用Dispose()
    • 修复:严格使用using块
  2. 密码硬编码

    aspnet如何连接数据库读取数据?详细步骤与示例分享

    • 错误:代码中写死连接串
    • 修复:通过IConfiguration注入 + 使用Azure Key Vault
  3. 查询超时

    • 错误:复杂查询未设超时
    • 修复:cmd.CommandTimeout = 30;

架构师建议:在微服务场景下,建议将数据库访问封装为独立服务,通过gRPC或REST API提供数据,对于高并发读取,可引入Redis缓存查询结果,响应速度可提升10倍以上。


互动讨论:你在实际项目中如何处理分库分表的数据读取?是否遇到过连接池耗尽的情况?欢迎在评论区分享你的实战经验与解决方案!

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.idctop.com/article/18825.html

赞 (0)
能开发网站吗?网站建设全流程详解及费用解析!
上一篇 2026年2月9日 07:31
ASP.NET如何访问数据库?揭秘高效数据库连接方案
下一篇 2026年2月9日 07:34

相关推荐

  • 简单代码小程序怎么简单查询,简单查询怎么做

    简单代码小程序是目前最轻便的代码查询工具,专为开发者提供快速、精准的代码片段查询服务,无论你是新手还是资深工程师,都能在几秒内通过简单查询获取所需代码,大幅提升开发效率,简单代码小程序怎么用?三步完成高效查询很多开发者遇到不熟悉的函数时,第一反应是去搜索引擎翻半天,但简单代码小程序把查询流程压缩到了三步,你甚至……

    2026年8月2日
    600
  • 服务器centos和Windows哪个好?CentOS 和 Windows 服务器选哪个

    没有绝对的“更好”,只有“更匹配”,在评估服务器 centos 和 Windows 哪个好时,必须依据业务场景、技术栈依赖及成本预算进行决策,对于追求极致性能、高并发处理及开源生态的 Web 服务、大数据计算或容器化部署,Linux(以 CentOS 为代表)凭借零授权费、低资源占用和高稳定性是首选;而对于依赖……

    程序开发 2026年4月19日
    4600
  • 课程开发难点如何突破?SAM模型课程开发流程详解

    SAM课程开发:打造高效敏捷的学习解决方案核心结论:SAM(Successive Approximation Model,连续逼近模型)是当前最先进的课程开发方法,它以敏捷迭代为核心,通过快速原型和持续验证,显著提升课程开发效率与学习效果,彻底解决传统ADDIE模型周期长、风险高、灵活性差的痛点,SAM模型:敏……

    2026年2月16日
    18700
  • 韩国CN2原生IP火爆来袭是真的吗?韩国CN2原生IP价格多少

    819云互联推出的韩国CN2原生IP服务,凭借低延迟和高稳定性,成为跨境业务加速的首选方案,目前库存紧张,建议立即锁定资源,为什么韩国CN2原生IP成为跨境网络新宠在跨境业务日益频繁的当下,网络连接的稳定性直接决定了业务效率,许多用户发现,普通的国际线路往往在高峰时段出现严重的丢包和延迟波动,而韩国CN2原生I……

    2026年6月30日
    1400
  • AIoT发展规划怎么做?企业数字化转型路径

    2026年AIoT发展的核心在于从“连接”转向“智能”,通过端侧算力提升与行业场景深度融合,实现从被动响应到主动决策的跨越,最终构建起具备自进化能力的产业生态,AIoT技术演进与核心趋势解析端侧智能成为主流架构过去几年,物联网设备主要依赖云端进行数据处理,这种模式在延迟和隐私保护上存在天然短板,随着NPU(神经……

    2026年6月15日
    2700
  • FTP服务器怎么传文件?ftp上传下载大文件教程

    FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议,它允许用户将文件从本地计算机上传到远程服务器,或者从远程服务器下载文件到本地计算机,以下是使用 FTP 服务器传送文件的详细步骤,分为准备阶段、使用图形界面工具和使用命令行工具三种方式: 准备阶段在开始……

    2026年7月12日
    7110
  • 广州稳定DDOS哪个好?广州高防DDOS防护服务哪家最稳定

    2026年广州地区寻求稳定DDoS防护,综合防御节点资源、清洗精度与本地化响应,首选具备T级骨干网带宽储备与AI智能调度能力的头部云厂商(如腾讯云、阿里云)及深耕华南的本地高防IDC服务商,2026广州DDoS防护现状与核心痛点华南区域攻击态势升级根据国家互联网应急中心CNCERT与【网络安全产业联盟】2026……

    2026年4月29日
    5400
  • 长沙物理机租用一个月多少钱,哪家服务商性价比高?

    长沙物理机租用一个月多少钱?根据当前市场行情,主流配置的独立物理机月租通常在800元至2500元之间,具体费用由CPU、内存、硬盘、带宽及机房等级共同决定,长沙物理机租用多少钱一个月?价格构成全解析硬件配置决定基础成本物理机的核心部件CPU、内存和硬盘直接拉出月租的基准价,目前长沙市场上,单路E5级别处理器搭配……

    2026年7月27日
    1100
  • 重庆大带宽物理机租用推荐哪家好,价格多少?

    对于重庆地区需要大带宽物理机租用的用户,我的推荐是优先考虑重庆电信和重庆联通机房的独享带宽方案,在稳定性和价格之间取得了较好的平衡,重庆大带宽物理机租用,这些场景最需要它大带宽物理机不是所有场景都适用,但以下三类业务在重庆本地租用大带宽物理机,收益往往高于云服务器,视频直播与点播:带宽决定用户体验重庆作为西南网……

    2026年7月28日
    800
  • tsr服务器日志分析工具怎么用?tsr服务器日志分析工具有哪些

    关于tsr服务器日志分析工具在云计算与大数据时代,服务器日志不仅是系统运行的“黑匣子”,更是优化性能、排查故障以及保障安全的核心数据源,面对TB级的日志数据,传统的grep或awk命令已显得捉襟见肘,TSR(Trace Server Records)服务器日志分析工具应运而生,它专为高并发、海量数据场景设计,旨……

    2026年6月12日
    2900

发表回复

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