C# 将二进制文件保存到数据库

C# 将二进制文件保存到数据库,c#,.net,vb.net,visual-studio,visual-studio-lightswitch,C#,.net,Vb.net,Visual Studio,Visual Studio Lightswitch,我知道有很多关于这个主题的线程,我已经尝试从VB实现(翻译)成C Table fileContainer={字符串文件名,二进制文件} 以下是我的尝试: partial void FileContainersAddAndEditNew_Execute() { Dispatchers.Main.BeginInvoke(() => { OpenFileDialog openDialog = new OpenFileDialog(); if (

我知道有很多关于这个主题的线程,我已经尝试从VB实现(翻译)成C

Table fileContainer={字符串文件名,二进制文件}

以下是我的尝试:

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.
阻止了这种情况的发生。还是我做得不对

我注意到的另一件事是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;
                        });

                    }
                }
            }
        }); 

    }

谢谢你的帮助,我现在认为它是有效的。。。我还需要再调用一次(别问我为什么),这个程序和你的输入一起运行。我还没有从数据库下载任何文件,但是“.mdf”文件得到了我添加的文件的附加大小,所以我希望它能工作。你现在看到我的代码有什么问题吗(见我的答案)。再次感谢您的输入:)@Tim我可以看出您的代码(在我的眼里)有两个错误,即ShowDialog()行和OpenRead()行。我从未见过像这样使用OpenFileDialog。然而,如果它起作用的话,我不会抱怨的。很高兴你明白了。我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。谢谢,我错过了这一点,并将在以后的帖子中记住。
    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;
                        });

                    }
                }
            }
        }); 

    }