2013-11-25 34 views
3

我使用SqlFileStream將文件存儲在數據庫中,但插入新記錄時我遇到了一個小問題,而我似乎無法解決這個問題!問題在於我需要在插入記錄時創建一個臨時文件以提供一個文件路徑來流式傳輸實際場景文件。我期望在實際數據流式傳輸到文件路徑時臨時文件被覆蓋,但實際上會添加另一個文件 - 在文件系統中留下空文件。SqlFileStream - 插入時不生成空文件

下面是代碼(請忽略該查詢字符串格式,我插入參數的路上,我一直在劈砍而去嘗試不同的東西,也失去了意志很好的代碼;)):

using (TransactionScope transactionScope = new TransactionScope()) 
     { 
      string InsertTSql = "Insert Into Documents(file_name, file_type, category, uploaded_by, file_data) values('" + request.fileInfo.fileName + "', '" + request.fileInfo.fileType + "', '" + request.fileInfo.category + "', '" + request.fileInfo.uploadedBy + "',Cast('' As varbinary(Max))); Select file_data.PathName() As Path From Documents Where document_id = @@Identity"; 
      SqlConnection dbConnection = new SqlConnection(@"Data Source=SAM\SQLEXPRESS;Initial Catalog=PIRS;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework");//ConfigurationManager.ConnectionStrings["PIRSDBCon"].ToString())) 
      var cmd = new SqlCommand(InsertTSql, dbConnection); 
      dbConnection.Open(); 
      string filePath = (string)cmd.ExecuteScalar(); 

      string GetTcTSql = "Select GET_FILESTREAM_TRANSACTION_CONTEXT() As TransactionContext"; 
      cmd = new SqlCommand(GetTcTSql, dbConnection); 
      byte[] transactionContext =(byte[]) cmd.ExecuteScalar(); 

      SqlFileStream sqlFileStream = new SqlFileStream(filePath, transactionContext, FileAccess.Write); 
      request.fileData.CopyTo(sqlFileStream); 
      sqlFileStream.Close(); 
      transactionScope.Complete(); 
     } 

請讓我知道,如果我可以添加更多的信息或更清晰的問題。

+0

filestream系統使用垃圾收集器 - 每次更改總是生成一個新文件,然後最終刪除舊文件。但是這不會立即發生。 –

+0

@Damien_The_Unbeliever - 你知道,我認爲從我跑過的一些早期測試(幾個小時前)開始,文件夾中似乎少了幾個文件,只是再次檢查,似乎更多的文件已經消失,所以看起來你是正確的先生(不是我懷疑你;))請張貼答覆,我會接受 - 謝謝你讓我擺脫我的痛苦 – Sam

回答