2010-03-15 23 views
0

如何將用戶上傳的文件存儲到數據庫中?我想將文件存儲在數據庫中,我們如何做到這一點?在後端我使用c#.net應用程序的SQL。如何將文件存儲在數據庫中?

+1

SQL作爲SQL服務器? SQL只是查詢語言....不是產品/數據庫系統,真的...... – 2010-03-15 06:32:12

+0

我們的任何解決方案是否對您有所幫助,或者您仍然需要更多幫助? – MadBoy 2010-03-17 10:31:40

回答

4

該解決方案適用於SQL SERVER 2005/2008。

您必須創建VARBINARY(MAX)作爲其中一列。在我的情況下,我創建了表Raporty,列RaportPlikVARBINARY(MAX)列。

下面有幾個支持功能,你可以按需要修改:

public static void databaseFilePut(string varFilePath) { 
     byte[] file; 
     using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) { 
      using (var reader = new BinaryReader(stream)) { 
       file = reader.ReadBytes((int) stream.Length); 

      } 

     } 
     using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
     using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) { 
      sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file; 
      sqlWrite.ExecuteNonQuery(); 
     } 
    } 
    public static void databaseFileRead(string varID, string varPathToNewLocation) { 
     using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
     using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) { 
      sqlQuery.Parameters.AddWithValue("@varID", varID); 
      using (var sqlQueryResult = sqlQuery.ExecuteReader()) 
       if (sqlQueryResult != null) { 
        sqlQueryResult.Read(); 
        var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))]; 
        sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length); 
        using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write)) fs.Write(blob, 0, blob.Length); 
       } 
     } 
    } 
    public static MemoryStream databaseFileRead(string varID) { 
     MemoryStream memoryStream = new MemoryStream(); 
     using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
     using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) { 
      sqlQuery.Parameters.AddWithValue("@varID", varID); 
      using (var sqlQueryResult = sqlQuery.ExecuteReader()) 
       if (sqlQueryResult != null) { 
        sqlQueryResult.Read(); 
        var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))]; 
        sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length); 
        //using (var fs = new MemoryStream(memoryStream, FileMode.Create, FileAccess.Write)) { 
        memoryStream.Write(blob, 0, blob.Length); 
        //} 
       } 
     } 
     return memoryStream; 
    } 

第一種方法是將文件放入從驅動數據庫,第二種方法是獲取文件並將其保存在驅動器,和第3方法是從數據庫中獲取文件並將其作爲MemoryStream,這樣您就可以使用其他一些東西,然後將其寫入驅動器。

這4方法是將MemoryStream到數據庫:

public static int databaseFilePut(MemoryStream fileToPut) { 
     int varID = 0; 
     byte[] file = fileToPut.ToArray(); 
     const string preparedCommand = @" 
        INSERT INTO [dbo].[Raporty] 
           ([RaportPlik]) 
         VALUES 
           (@File) 
         SELECT [RaportID] FROM [dbo].[Raporty] 
      WHERE [RaportID] = SCOPE_IDENTITY() 
        "; 
     using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
     using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) { 
      sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file; 

      using (var sqlWriteQuery = sqlWrite.ExecuteReader()) 
       while (sqlWriteQuery != null && sqlWriteQuery.Read()) { 
        varID = sqlWriteQuery["RaportID"] is int ? (int) sqlWriteQuery["RaportID"] : 0; 
       } 
     } 
     return varID; 
    } 
0

保持數據庫大小不變的一個解決方案是將文件的位置存儲在服務器上。 IE一個文件路徑。

但是,如果您想要移動文件,則必須創建管理員。

0

您可以使用blob字段類型。當您從StreamReader中讀取文件時,將其轉換爲字節數組,然後將其插入blob字段。

當你想讀取它時,需要將blob作爲字節數組讀取到流讀取器並將其寫入響應緩衝區。

3

假設SQL 2005或更高版本,我會使用VarBinary(MAX)字段。將上傳的文件作爲byte []傳遞給insert語句。據微軟稱,自SQL 2005以來,在數據庫中存儲大量數據(文件和圖像)不再在很大程度上降低性能。

如:

public void SaveFileToDB(string description, byte[] file) 
{ 
    using (SqlConnection con = new SqlConnection(conStr) 
    { 
     con.Open(); 
     using (SqlCommand cmd = con.CreateCommand()) 
     { 
      cmd.Parameters.Add("@Description", SqlDbType.VarChar, description); 
      cmd.Parameters.Add("@File", SqlDbType.VarBinary, file); 
      cmd.CommandText = "UploadedFileUpdate"; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 

如果你有SQL 2008,見羅恩·克萊因的建議。

+0

我仍然不會推薦它,除非1)您的文件數量很少,文件很小或者2)您擁有支持解決方案擴展的基礎結構。我曾在兩家商店工作,我的第一份工作是弄清楚他們如何移動**數據庫,這些數據庫由於在數據庫中存儲文件的做法而變得失控,特別是當那些文件高度冗餘(如由MD5校驗和確定) – GrayWizardx 2010-03-15 06:01:29

+0

@GrayWizardx同意了,但我認爲Harikrishna已經決定存儲在數據庫中。有些情況下(如共享主機)無法寫入文件系統。 – 2010-03-15 06:07:25

+0

@羅伯特瓦格納,好點。我似乎總是忘記託管的東西。我的一個壞習慣,很好的提醒。謝謝。 – GrayWizardx 2010-03-15 06:29:11

相關問題