C# 将二进制文件保存到数据库
我知道有很多关于这个主题的线程,我已经尝试从VB实现(翻译)成CC# 将二进制文件保存到数据库,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 (
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;
});
}
}
}
});
}