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

如何正确将SQL列的行值读取到数组?解决赋值为null问题

问题:从SQL读取数据到数组时返回null值

我编写了一个C#方法,用于从SQL表中获取数据并将各列数据分别存入对应的数组。但调试时发现,数组被赋值为null值。已确认在SSMS中执行查询语句能返回有效数据,不应出现null值。代码如下:

public static CommentsPageData getComments(string wcNum)
{
    string[] prodTimeArray = new string[24];
    string[] crewsArray = new string[24];
    string[] commentsArray = new string[24];
    string[] redTimeArray = new string[24];
    string[] greenTimeArray = new string[24];

    string commandSql = "SELECT TOP 24 Production_Time, Crew, Red_Time, Green_Time, Comment FROM ************ WHERE Work_Center = @wc ORDER BY Production_Time DESC";

    SqlConnection con = new SqlConnection("Data Source=*******;Initial Catalog=********;Integrated Security=True");
    con.Open();

    SqlCommand cmd = new SqlCommand(commandSql, con);
    cmd.Parameters.AddWithValue("wc", wcNum);

    CommentsPageData commPageData = new CommentsPageData();

    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                prodTimeArray.Append(reader["Production_Time"].ToString());
                crewsArray.Append(reader["Crew"].ToString());
                redTimeArray.Append(reader["Red_Time"].ToString());
                greenTimeArray.Append(reader["Green_Time"].ToString());
                commentsArray.Append(reader["Comment"].ToString());
            }
        }
        else
        {
            Console.WriteLine("No rows found");
        }
        reader.Close();
    }

    commPageData.ProdTimes = prodTimeArray;
    commPageData.Crews = crewsArray;
    commPageData.GreenTime = greenTimeArray;
    commPageData.RedTime = redTimeArray;
    commPageData.Comments = commentsArray;

    con.Close();

    return commPageData;
}

我创建了CommentsPageData类,其中包含对应各列的数组(计划存储24条数据),但问题出在while(reader.Read()){}循环部分,虽能看到赋值操作,但数组最终都是null值。请问如何正确获取数据并赋值给数组?


解决方案

问题核心是数组的Append方法不会修改原数组——数组是固定长度的,Append返回的是一个新的枚举对象,原数组根本没被赋值。另外还要处理数据库字段可能为DBNull的情况,避免调用ToString()时抛出异常。

修正步骤:

  • 用索引变量跟踪数组位置,直接给数组元素赋值
  • 处理DBNull,避免空引用异常
  • 优化资源管理(用using包裹SqlConnection,自动释放连接)

修正后的代码:

public static CommentsPageData getComments(string wcNum)
{
    // 初始化数组时可直接设为空字符串,避免未赋值位置留null
    string[] prodTimeArray = Enumerable.Repeat(string.Empty, 24).ToArray();
    string[] crewsArray = Enumerable.Repeat(string.Empty, 24).ToArray();
    string[] commentsArray = Enumerable.Repeat(string.Empty, 24).ToArray();
    string[] redTimeArray = Enumerable.Repeat(string.Empty, 24).ToArray();
    string[] greenTimeArray = Enumerable.Repeat(string.Empty, 24).ToArray();
    int index = 0; // 跟踪当前要赋值的数组位置

    string commandSql = "SELECT TOP 24 Production_Time, Crew, Red_Time, Green_Time, Comment FROM ************ WHERE Work_Center = @wc ORDER BY Production_Time DESC";

    // using包裹SqlConnection,自动释放连接,无需手动Close
    using (SqlConnection con = new SqlConnection("Data Source=*******;Initial Catalog=********;Integrated Security=True"))
    {
        con.Open();
        SqlCommand cmd = new SqlCommand(commandSql, con);
        // 建议指定参数类型,避免AddWithValue的隐式转换问题
        cmd.Parameters.Add("@wc", SqlDbType.VarChar).Value = wcNum;

        CommentsPageData commPageData = new CommentsPageData();

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            if (reader.HasRows)
            {
                // 限制index不超过数组长度,避免越界
                while (reader.Read() && index < 24)
                {
                    // 处理DBNull,转为空字符串
                    prodTimeArray[index] = reader["Production_Time"] != DBNull.Value ? reader["Production_Time"].ToString() : string.Empty;
                    crewsArray[index] = reader["Crew"] != DBNull.Value ? reader["Crew"].ToString() : string.Empty;
                    redTimeArray[index] = reader["Red_Time"] != DBNull.Value ? reader["Red_Time"].ToString() : string.Empty;
                    greenTimeArray[index] = reader["Green_Time"] != DBNull.Value ? reader["Green_Time"].ToString() : string.Empty;
                    commentsArray[index] = reader["Comment"] != DBNull.Value ? reader["Comment"].ToString() : string.Empty;
                    
                    index++; // 索引自增,处理下一个元素
                }
            }
            else
            {
                Console.WriteLine("No rows found");
            }
            // using会自动关闭reader,无需手动Close
        }

        commPageData.ProdTimes = prodTimeArray;
        commPageData.Crews = crewsArray;
        commPageData.GreenTime = greenTimeArray;
        commPageData.RedTime = redTimeArray;
        commPageData.Comments = commentsArray;

        return commPageData;
    }
}

额外说明:

  • 如果不需要统一空字符串,初始化数组用new string[24]即可,未赋值的位置会保留默认值null
  • 指定参数类型(如SqlDbType.VarChar)能避免AddWithValue带来的类型隐式转换问题,提升查询性能和准确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:00:58