繁体   English   中英

将二进制文件保存到DB

[英]Save binary file to DB

我知道关于这个主题有很多线程,我试图从VB实现(转换) 这个到C#。

Table fileContainer = {string FileName, binary File}

这是我的尝试:

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, 0, 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不需要花费很long作为参数。

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, 0, fileLen); 需要fileLen是一个整数。 尽管fileData返回long,但这可能会导致问题。

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

我在这里发布我更新的代码,以免为未来的读者弄乱我的原始代码。 这应该工作;

    partial void FileContainersAddAndEditNew_Execute()
    {

        var supportedFiles = "*.*";
        Dispatchers.Main.BeginInvoke(() =>
        {
            OpenFileDialog openDialog = new OpenFileDialog();
            openDialog.Filter = "Supported files|" + supportedFiles;

            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, 0, (int)fileLen);
                        fileData.Close();
                        var filename = openDialog.File.ToString().ToLower();

                        this.FileContainers.Details.Dispatcher.BeginInvoke(() =>
                        {
                            FileContainer fc = this.FileContainers.AddNew();
                            fc.File = fileBArray;
                            fc.FileName = filename;
                        });

                    }
                }
            }
        }); 

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM