微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 将二进制文件保存到DB

我知道这个主题有很多主题,我尝试从VB实现(翻译) this one到C#.

表fileContainer = {string FileName,二进制文件}

这是我的尝试:

partial void FileContainersAddAndEditNew_Execute()
{
    dispatchers.Main.BeginInvoke(() =>
    {

        OpenFileDialog openDialog = new OpenFileDialog();

        if (openDialog.ShowDialog() == true)
        {
            using (System.IO.FileStream fileData = openDialog.File.OpenRead())
            {
                long fileLen = fileData.Length;

                if (fileLen > 0)
                {
                    Byte[] fileBArray = new Byte[fileLen];

                    fileData.Read(fileBArray,fileLen);
                    fileData.Close();

                    FileContainer fc = this.FileContainers.AddNew();

                    fc.File = fileBArray;
                    fc.FileName = openDialog.File.Extension.ToString().ToLower();

                }
            }
        }

    });
}

但是这行代码失败了:

FileContainer fc = this.FileContainers.AddNew();

出现此错误

IVisualCollection<T>.AddNew() should not be called from UI Thread.

我有点困惑.我想:

dispatchers.Main.BeginInvoke(() =>

防止这种情况发生.或者我做错了吗?

我注意到的另一件事是VB代码使用:

filenLen-1

但我试图这样做是出界的.他们也没有将它转换为int,但.Read不需要花费很长时间作为参数.

解决方法

openFileDialog.ShowDialog()不返回bool值,也不能在if语句中使用. openFileDialog.ShowDialog()将打开该对话框.据我所知,执行暂停,直到您关闭对话框并且没有理由检查它是否打开.

filenLen-1

using (System.IO.FileStream fileData = openDialog.File.OpenRead());

long fileLen = fileData.Length;

应该

filenLen--;

using (System.IO.FileStream fileData = System.IO.File.OpenRead(openDialog.FileName))

int fileLen = int.Parse(fileData.Length.ToString());

fileData.Read(fileBArray,fileLen);需要fileLen是一个整数.尽管fileData返回long,但这可能会导致问题.

至于调用问题,我必须确切知道你想要做些什么来帮助你.也许我们可以避免调用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐