如何正确将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
相关产品推荐
相关产品推荐

