点击按钮展示数据库列表: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
相关产品推荐
相关产品推荐

