2

我该如何解决这个问题?为什么图像文件制作 system.dbnull 错误?

    private void Form1_Load(object sender, EventArgs e)
    {
        SqlDataAdapter da = new SqlDataAdapter("select * from Categories", baglantiYolu);
        DataTable tablo = new DataTable();
        da.Fill(tablo);
        foreach (DataRow kategori in tablo.Rows)
        {
            Kategori k = new Kategori();
            k.KategoriID = int.Parse(kategori["CategoryID"].ToString());
            k.KategoriAdı = kategori["CategoryName"].ToString();
            k.UrunSayisi = UrunSayisiniGetir(int.Parse(kategori["CategoryID"].ToString()));
            k.Aciklama = kategori["Description"].ToString();
            k.Resim = (byte[])kategori["Picture"];
            listBoxKategoriler.Items.Add(k);
        }
    }

在此处输入图像描述

4

3 回答 3

3

如果该列的数据库返回值为 ,则NULL转换为DBNull.Value代码。

您需要检查这一点,因为它不会成功转换为byte[]. 像这样的东西:

object val = row["Pictire"];

if (val == DBNull.Value || val == null)
{
    k.Resim = new byte[0];
}
else
{
    k.Resim = (byte[])val;
}

您将需要对所有可能为空的列进行类似的检查。

于 2012-07-12T11:56:13.780 回答
2

问题是您没有图像,但该字段为空(null)。
您不能将 dbnull 值强制转换为其他值。
您首先必须检查是否为 null,如果没有读取它,则将其转换为byte[].

object pict = kategori["Picture"];
k.Resim =  (pict == DBNull.Value) ? new byte[0] : (byte[])pict;
于 2012-07-12T11:54:12.013 回答
2

您需要在转换之前检查 DBNull:

if( kategorie["Picture"] != DBNull.Value ) k.Resim = (Byte[])kategorie["Picture"];
于 2012-07-12T11:56:25.607 回答