You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮展示数据库列表:SqlDataReader添加数据至列表求助

解决SqlDataReader读取数据库名称到List的问题

直接给你完整的search接口实现代码,重点处理SqlDataReader的循环读取逻辑,同时确保资源安全释放:

using Microsoft.AspNetCore.Mvc;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;

[ApiController]
[Route("[controller]")]
public class DatabaseController : ControllerBase
{
    [HttpGet("search")]
    public ActionResult<List<string>> GetDatabases(string dataSource, string username, string password)
    {
        var databases = new List<string>();
        
        // 使用SqlConnectionStringBuilder构建连接字符串,更安全规范
        var connStringBuilder = new SqlConnectionStringBuilder
        {
            DataSource = dataSource,
            UserID = username,
            Password = password,
            InitialCatalog = "master", // 必须连接master库才能查询sys.databases
            IntegratedSecurity = false
        };

        // 用using包裹所有IDisposable资源,自动释放连接、命令、阅读器
        using (var conn = new SqlConnection(connStringBuilder.ConnectionString))
        {
            const string query = "SELECT name FROM sys.databases";
            using (var cmd = new SqlCommand(query, conn))
            {
                try
                {
                    conn.Open();
                    using (var reader = cmd.ExecuteReader())
                    {
                        // 核心循环:用while(reader.Read())遍历每一行结果
                        while (reader.Read())
                        {
                            // 两种读取字段的方式,选一种即可
                            // 方式1:直接通过字段名读取,转换为字符串
                            string dbName = reader["name"].ToString();
                            // 方式2:通过字段序号读取,更高效且避免大小写问题
                            // int nameOrdinal = reader.GetOrdinal("name");
                            // string dbName = reader.GetString(nameOrdinal);
                            
                            databases.Add(dbName);
                        }
                    }
                }
                catch (SqlException ex)
                {
                    // 处理连接或查询异常,比如返回错误信息
                    return BadRequest($"数据库操作失败:{ex.Message}");
                }
            }
        }

        return databases;
    }
}

关键要点说明:

  • 资源释放:所有涉及数据库操作的对象(SqlConnection、SqlCommand、SqlDataReader)都用using语句包裹,确保执行完毕后自动释放资源,避免连接泄漏。
  • 循环逻辑:必须用while(reader.Read())而非for或foreach,因为Read()方法会将阅读器指针移动到下一条记录,返回true表示存在有效记录,直到遍历完所有结果。
  • 字段读取:推荐用GetOrdinal+GetString的组合,既高效又能避免字段名大小写不匹配的问题;如果直接用reader["name"],记得先判断是否为DBNull(不过sys.databases的name字段不会为null,这里可以省略)。
  • 连接字符串:用SqlConnectionStringBuilder构建比拼接字符串更安全,能避免格式错误和注入风险。

内容的提问来源于stack exchange,提问作者ghazal koobchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:10:27