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

C#从SQL查询公司数据仅返回一条的问题排查求助

问题分析与解决

你的代码仅返回一条数据的核心原因是只读取了SqlDataReader的第一行数据,未循环遍历所有返回行,具体问题点如下:

  • 仅调用了一次reader.Read()方法:该方法每次调用会将指针移动到下一行并返回是否存在有效数据,单次调用只能获取第一行。
  • reader.HasRows仅用于判断是否存在数据,但不会自动遍历所有行,必须配合循环实现逐行读取。

修正后的代码

namespace SECDataPurge
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<Dictionary<Guid, string>> companies = GetCompanies();

            foreach(var company in companies)
            {
                Console.WriteLine(company.Keys.FirstOrDefault() + " " + company.Values.FirstOrDefault());                
            }
            Console.ReadKey();
        }

        private static List<Dictionary<Guid, string>> GetCompanies()
        {
            List<Dictionary<Guid, string>> companies = new List<Dictionary<Guid, string>>();

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["AppDbConnectionString"]))
            {
                string query = "SELECT id, [name] FROM [dbo].[company];";
                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    conn.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        // 循环读取每一行,直到没有更多数据
                        while (reader.Read())
                        {
                            Dictionary<Guid, string> company = new Dictionary<Guid, string>();
                            Guid companyGuid = Guid.Empty;
                            string companyName = string.Empty;

                            if (reader["id"] != DBNull.Value)
                            {
                                companyGuid = (Guid)reader["id"];
                            }

                            if (reader["name"] != DBNull.Value)
                            {
                                companyName = (string)reader["name"];
                            }

                            company.Add(companyGuid, companyName);
                            companies.Add(company);
                        }
                    }
                }
            }

            return companies;
        }
    }
}

额外优化建议

当前用List<Dictionary<Guid, string>>存储数据,每个字典仅包含一个键值对,结构不够直观。更推荐定义自定义类封装数据,提升代码可读性与维护性:

// 定义Company类
public class Company
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

修改GetCompanies方法返回List<Company>:

private static List<Company> GetCompanies()
{
    List<Company> companies = new List<Company>();

    using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["AppDbConnectionString"]))
    {
        string query = "SELECT id, [name] FROM [dbo].[company];";
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            conn.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    Company company = new Company();
                    
                    if (reader["id"] != DBNull.Value)
                    {
                        company.Id = (Guid)reader["id"];
                    }

                    if (reader["name"] != DBNull.Value)
                    {
                        company.Name = (string)reader["name"];
                    }

                    companies.Add(company);
                }
            }
        }
    }

    return companies;
}

对应Main方法简化为:

static void Main(string[] args)
{
    List<Company> companies = GetCompanies();

    foreach(var company in companies)
    {
        Console.WriteLine($"{company.Id} {company.Name}");                
    }
    Console.ReadKey();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:43:15