如何无需ToString和SqlDataReader高效读取SQL Server表行至字符串列表
解决方案:无需SqlDataReader和ToString(),高效读取SQL表行到List
当然可以实现!我们可以利用SqlDataAdapter来批量读取数据到DataTable,然后通过遍历行并拼接列值的方式生成字符串列表,全程不需要显式调用ToString(),同时能保证不错的性能。
核心思路
- 使用
SqlDataAdapter执行查询并填充DataTable,这是一种无需手动处理SqlDataReader的批量读取方式 - 遍历
DataTable的每一行,用StringBuilder拼接所有列的内容(利用.NET的隐式类型转换,避免显式调用ToString()) - 预先初始化
List<string>的容量为DataTable.Rows.Count,减少内存扩容的性能损耗
示例代码
using System.Data; using System.Data.SqlClient; using System.Text; List<string> rowStrings = new List<string>(); string connectionString = "Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password="; string query = "Select id from [table1] where name=@zip"; using (SqlConnection conn = new SqlConnection(connectionString)) { using (SqlCommand command = new SqlCommand(query, conn)) { command.Parameters.AddWithValue("@zip", "india"); // 使用SqlDataAdapter填充DataTable,无需手动处理DataReader DataTable dt = new DataTable(); SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dt); // 预先设置容量,提升性能 rowStrings.Capacity = dt.Rows.Count; foreach (DataRow row in dt.Rows) { StringBuilder sb = new StringBuilder(); // 遍历当前行的所有列,拼接内容(隐式转换,无需ToString()) foreach (var item in row.ItemArray) { sb.Append(item); sb.Append(", "); // 可根据需求调整列分隔符 } // 移除最后一个多余的分隔符 if (sb.Length > 2) sb.Length -= 2; rowStrings.Add(sb.ToString()); } } } // 此时rowStrings中已存储每行数据对应的字符串
性能优化点
- 预设置List容量:避免List在添加元素时频繁扩容,减少内存分配和拷贝操作
- 使用StringBuilder:相比直接字符串拼接(
+运算符),StringBuilder在多次拼接场景下性能更优,减少临时字符串对象的创建 - 批量读取:
SqlDataAdapter.Fill()内部已做优化,能高效完成批量数据读取
关于“不使用ToString()”的说明
这里我们没有显式调用item.ToString(),而是利用了StringBuilder.Append(object)方法的特性:它会自动将对象转换为字符串,内部逻辑无需我们手动干预,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

