图像未保存到数据库

时间:2014-09-17 08:19:39

标签: c# sql-server entity-framework

我正在研究一个测试项目,以便学习和理解C#和WPF。我有一个打开资源管理器窗口的按钮。我想将所选文件(图像)保存到varbinary(max)类型的列中的数据库(SQL 2012)。

我失败了,带图像的更新“selectedCellphone”未保存到数据库中。在调试时,我注意到对象“saveCellphones”是正确的,属性“Photo”是图像中的byte []。并且该方法不会引发任何异常。

private void importPhotoButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Bilddateien (*.png;*.jpeg)|*.png;*.jpeg|Alle Dateien (*.*)|*.*";
    ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    ofd.ShowDialog();

    byte[] data = System.IO.File.ReadAllBytes(ofd.FileName);


    try
    {
        using (var context = new CellphoneManagerEntities())
        {
            if (selectedCellphone != null)
            {
                selectedCellphone.Photo = data;
                context.SaveChanges();
            }
        }
    }
    catch (System.Data.Entity.Infrastructure.DbUpdateException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

1 个答案:

答案 0 :(得分:1)

什么是selectedCellPhone?它没有在您发布的代码中定义。

怀疑您在代码中的其他位置使用selectedCellphone,并且它是使用上下文从您的数据库中检索到的实体。

但是,当您在某个环境中调用SaveChanges()时,这肯定与您用来检索selectedCellphone的背景不同!

没有更改要保存在您保存的上下文中

为了保存任何更改,您需要在保存的上下文中进行更改。

如果您没有可用的原始上下文,那么执行此操作的一种方法是:

using (var context = new CellphoneManagerEntities())
{
    var updateCellphone = context.CellPhones.FirstOrDefault(x => x.Id == selectedCellphone.Id);
    if (updateCellphone != null)
    {
        updateCellphone.Photo = data;
        context.SaveChanges();
    }
}

顺便说一句,即使没有任何内容可以保存,您也会检索byte[]。除非你在别处使用它,否则为什么不把它移到你的if

updateCellphone.Photo = System.IO.File.ReadAllBytes(ofd.FileName);