使用SqlDataReader读取数据时,针对不同数据类型有对应方法:reader.GetInt32(0)读int,reader.GetString(1)读varchar,reader.GetDateTime(2)读datetime,reader.GetDecimal(3)读decimal。实用技巧:先用reader.GetFieldType(i)检查类型,避免错误;null值用reader.IsDBNull(i)判断,再用GetValue(i)通用读取。
网友分享:Dapper简化数据读取
Dapper是最实用的ORM,查询后直接映射到对象:var users = connection.Query
EF Core数据类型映射技巧
在Entity Framework中,配置DbContext时用HasColumnType("int")指定类型;读取时context.Users.ToList()自动转换。网友技巧:遇到decimal精度丢失,用.ToList().Select(x => new { x.Price = x.Price ?? 0 }).实用,避免浮点数坑。
ADO.NET ExecuteReader完整示例
using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("SELECT * FROM Products", conn)) { using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { int id = reader.GetInt32("Id"); string name = reader.GetString("Name"); decimal price = reader.GetDecimal("Price"); } } } } 网友说:记得while循环和using释放资源。
处理Nullable类型实用方法
数据库null值别忘:int? age = reader.IsDBNull(2) ? (int?)null : reader.GetInt32(2); DateTime? birth = reader.IsDBNull(3) ? null : reader.GetDateTime(3); 这招网友强烈推荐,省去很多if判断。
SqlParameter防注入+类型指定
cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1; cmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = "test"; 读取时类型安全,网友经验:指定Size和Type,性能更好,不易出错。
大数据量读取优化
网友技巧:用reader.GetValues(array)批量读一行的所有值;或SequentialAccess模式cmd.CommandBehavior = CommandBehavior.SequentialAccess; 按列顺序读,内存友好,百万行数据不卡。
FAQ
Q: .NET怎么判断字段是null?
A: 用reader.IsDBNull(列索引)检查。
Q: Dapper支持哪些数据库?
A: SQL Server、MySQL、PostgreSQL等都支持。
Q: decimal精度怎么保持?
A: 在模型用[Column(TypeName = "decimal(18,2)" )]指定。
Q: 读取大数据怎么不爆内存?
A: 用CommandBehavior.SequentialAccess和流式处理。