数据库类型转换无效错误:读取图片数据时byte类型转换问题求助
解决类型转换与图片读取的问题
嘿,别苦恼啦!你的问题其实是几个容易忽略的小细节凑到一起了,咱们一个个掰扯清楚:
核心问题梳理
- 字段完全匹配错了:你用
dr.GetByte(dr.GetOrdinal("itemname"))给itemImage赋值,但itemname是存商品名称的字符串字段啊!而且你应该去读取数据库里存储图片的字段(比如应该是itemimage?你搞反字段了)。 - 图片类型定义不对:数据库里的图片一般是
varbinary(max)类型,对应的C#类型应该是byte[](字节数组),而不是单个byte——单个字节只能存0-255的数值,根本装不下图片。 - 读取二进制数据的方法错了:单个
byte用GetByte,但字节数组得用GetBytes方法来读取。 - 字段名拼写错误:
qituantity应该是quantity,这个拼写错误会导致找不到对应字段,也会触发异常。 - 列表类型不明确:
List student = new List();要改成泛型列表List<Item> student = new List<Item>();,不然是弱类型,后续操作也容易出问题。
修正后的代码示例
第一步:修正Item类的itemImage定义
public class Item { public int ID { get; set; } public byte[] itemImage { get; set; } // 改成字节数组 public string itemName { get; set; } public string itemDesc { get; set; } public int itemQuantity { get; set; } }
第二步:修正数据读取逻辑
List<Item> student = new List<Item>(); // 明确泛型类型 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ItemUpload"].ConnectionString); string selectQuery = "select * from upload"; SqlCommand com = new SqlCommand(selectQuery, conn); SqlDataReader dr; try { conn.Open(); dr = com.ExecuteReader(); while (dr.Read()) { // 先拿到图片字段的序号(这里要换成你数据库里存图片的真实字段名!) int imageOrdinal = dr.GetOrdinal("itemimage"); byte[] imageBytes = null; if (!dr.IsDBNull(imageOrdinal)) { // 读取字节数组:先获取总长度,再创建数组读取数据 long bytesAvailable = dr.GetBytes(imageOrdinal, 0, null, 0, int.MaxValue); imageBytes = new byte[bytesAvailable]; dr.GetBytes(imageOrdinal, 0, imageBytes, 0, (int)bytesAvailable); } student.Add(new Item() { ID = dr.GetInt32(dr.GetOrdinal("Id")), itemImage = imageBytes, itemName = dr.GetString(dr.GetOrdinal("itemname")), itemDesc = dr.GetString(dr.GetOrdinal("itemdesc")), itemQuantity = dr.GetInt32(dr.GetOrdinal("quantity")) // 修正拼写错误 }); } dr.Close(); } catch (Exception ex) { // 记得加异常捕获,方便排查后续问题 Console.WriteLine(ex.Message); } finally { // 最后要确保连接关闭,或者用using语句更安全 if (conn.State == ConnectionState.Open) conn.Close(); }
额外优化建议
- 尽量用
using语句管理数据库连接、命令、DataReader,不用手动关闭,会自动释放资源:
using (SqlConnection conn = new SqlConnection(...)) { conn.Open(); using (SqlCommand com = new SqlCommand(selectQuery, conn)) { using (SqlDataReader dr = com.ExecuteReader()) { // 读取逻辑写在这里 } } }
- 不要用
select *,最好明确写出需要的字段,比如select Id, itemimage, itemname, itemdesc, quantity from upload,这样更清晰,也避免字段顺序变化导致的问题。
内容的提问来源于stack exchange,提问作者VerySadGuy
相关产品推荐
相关产品推荐

