2012-02-07 39 views
2

我有一個總是10兆字節的字節數組。不管它裏面有什麼數據,它都會是十兆。目的與大對象堆(more information)有關。添加到sql server數據庫時修剪一個字節[]

因此,如果一個1Mb文件被放入字節[]中,則最後九個宏將被清零。問題是,當我上傳到SQL Server時,上傳的文件總是10兆字節。我寧願只上傳必要的位。

我有它的大小複製到字節數組之前,所以我可以做一個修剪,如果需要的話。問題是,我不知道如何有效地執行一個不會在LOH上創建新的字節[]的問題。

想法?

更新#1

下面是一些僞代碼。我已經刪除了大部分不需要的代碼。它使用Microsoft.Practices.EnterpriseLibrary.Data庫來訪問數據庫。 (遺留代碼,不能改變)

Param[] parametersArray = new Param[10]; 
// other params 
parametersArray[4] = new Param("DocumentData", DbType.Binary, documentToSave.Data); 
// other params 
DataAccess.ExecuteNonQuery("esMD.proc_WS_UpdateDocument", parametersArray); 

public static int ExecuteNonQuery(string spName, params Param[] parameters) 
{ 
    int ret = -1; 

    DbCommand storedProcedure = Database.Db.GetStoredProcCommand(spName); 
    storedProcedure.CommandTimeout = commandTimeout; 

    if (parameters != null) 
    { 
     foreach (Param parameter in parameters) 
     { 
      if (parameter != null) 
      { 
       Database.Db.AddInParameter(storedProcedure, parameter.ParameterName, parameter.DbType, parameter.Value); 
      } 
     } 
    } 

    try 
    { 
     ret = MedicareDatabase.Db.ExecuteNonQuery(storedProcedure); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
    finally 
    { 
     if (storedProcedure != null) 
     { 
      storedProcedure.Dispose(); 
     } 
    } 
    return ret; 
} 

更新#2

我修改上面的數據庫調用,還修改了我如何進入參數。

if (parameter.Size != null && parameter.Size > 0) 
{ 
    MedicareDatabase.Db.AddParameter(storedProcedure, parameter.ParameterName, DbType.Binary, parameter.Size, ParameterDirection.Input, true, 0, 0, string.Empty, DataRowVersion.Default, parameter.Value); 
} 
else 
{ 
    MedicareDatabase.Db.AddInParameter(storedProcedure, parameter.ParameterName, parameter.DbType, parameter.Value); 
} 

這似乎是爲我工作。有沒有人看到這個問題?

-Chad

+3

向我們展示您用於「將文件上載到SQL Server」的代碼 – dtb 2012-02-07 21:53:26

+0

已更新,並附有數據庫調用。 – Cyfer13 2012-02-07 22:02:15

+1

您從哪裏找到了使用比實際需要的數組更大內存效率的信息?我無法看到你提到的那個問題的答案中的任何內容。相反,推薦使用幾個小陣列的答案超過一個,但這顯然不適用於你的情況。 – PHeiberg 2012-02-07 22:25:28

回答

4

創建從字節[]和所需長度的MemoryStream。使用流構造一個SqlBytes實例。使用SqlBytes構建參數。

作爲一條評論,您的大數據不應該被物化爲byte[]。它應該作爲一個流通過處理。請參閱Download and Upload images from SQL Server via ASP.Net MVC以瞭解如何將大型對象保留爲流,並且從未實現爲大型字節[]的實例,從下載和上載路徑上的端到端。

+0

我正在使用itextsharp將較大的pdf切成較小的塊。 Itextsharp需要一個字節[](我認爲)。 – Cyfer13 2012-02-07 22:33:53

相關問題