2013-04-12 173 views
3

我知道這個主題上有很多線程,我嘗試從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作爲參數。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

謝謝,我錯過了這一點,並將留在後面的帖子。 – Tim

回答

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

        } 
       } 
      } 
     }); 

    } 
4

openFileDialog.ShowDialog()不返回一個布爾值,不能用於這樣的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返回一個很長的原因,但這可能會導致問題。

至於調用問題,我必須確切知道你想要做什麼來幫助你。也許我們可以避免調用。

+0

感謝您的幫助,我現在認爲它的工作原理......我需要再次調用一次(不要問我爲什麼),那麼在輸入時要注意讓程序運行。我還沒有從數據庫中下載任何文件,但「.mdf」文件獲得了我添加的文件的額外大小,所以我希望它能正常工作。你現在看到我的代碼有什麼問題嗎(請參閱我的答案)。再一次,感謝您的輸入:) – Tim

+2

@Tim我可以看到你的代碼有兩個錯誤,即ShowDialog()行和OpenRead()行。我從來沒有見過像這樣使用OpenFileDialog。但是,如果它有效,我不會抱怨。很高興你想出來了。 –

相關問題