将二进制文件保存到DB

时间:2013-04-12 09:46:29

标签: c# .net vb.net visual-studio visual-studio-lightswitch

我知道这个主题有很多主题,我尝试从VB实现(翻译)this one到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作为参数。

2 个答案:

答案 0 :(得分:4)

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,这可能会导致问题。

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

答案 1 :(得分:3)

我在这里发布我的更新代码,以免为未来的读者搞砸我的原始代码。这应该有用;

    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;
                        });

                    }
                }
            }
        }); 

    }