2010-02-13 5 views
7

Używam DocX do tworzenia plików .docx. Zamiast przechowywać je na dysku twardym, Share lub SharePoint wolałbym je przechowywać w bazie danych SQL. Moje pytania to:Prześlij/pobierz plik z SQL Server 2005/2008 z aplikacji WinForm C#?

  1. Jak napisać odpowiedni kod, aby zapisać plik w tej bazie?
  2. Jak napisać odpowiedni kod, aby pobrać plik do tej bazy danych?
  3. Jaki typ danych powinien ustawić dla tabeli przechowywania plików docx? Czy to obraz?

Z poważaniem,

MadBoy

PS. Wolałbym właściwego kodu pod względem wykorzystania przy użyciu starej „szkoły” sposób:

using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDepozyt)) 
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) 
using (var sqlQueryResult = sqlQuery.ExecuteReader()) 
    while (sqlQueryResult != null && sqlQueryResult.Read()) 

Odpowiedz

6

plik docx jest jak plik zip, który jest zbiorem kilku plików. Co o konwersji na binarne, a następnie zapisać w DB

Coś jak followswill pracować

Aby zapisać

 string filePath = ""; 
     string connectionString = ""; 
     FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
     BinaryReader reader = new BinaryReader(stream); 
     byte[] file = reader.ReadBytes((int)stream.Length); 
     reader.Close(); 
     stream.Close(); 

     SqlCommand command; 
     SqlConnection connection = new SqlConnection(connectionString); 
     command = new SqlCommand("INSERT INTO FileTable (File) Values(@File)", connection); 
     command.Parameters.Add("@File", SqlDbType.Binary, file.Length).Value = file; 
     connection.Open(); 
     command.ExecuteNonQuery(); 

pobierania jest skomplikowanym procesem nieco następująco

  SqlConnection connection = new SqlConnection(""); 
      string query = 
      @" SELECT File FROM FileTable where FileID =" + 125; 
      SqlCommand command = new SqlCommand(query, connection); 

      FileStream stream; 
      BinaryWriter writer; 

      int bufferSize = 100; 
      byte[] outByte = new byte[bufferSize]; 

      long retval; 
      long startIndex = 0; 

      string pubID = ""; 

      connection.Open(); 
      SqlDataReader reader = command.ExecuteReader(CommandBehavior.Default); 

      while (reader.Read()) 
      {  
       pubID = reader.GetString(0); 

       stream = 
       new FileStream("abc.docx", FileMode.OpenOrCreate, FileAccess.Write); 
       writer = new BinaryWriter(stream); 
       startIndex = 0; 
       retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize); 

       while (retval == bufferSize) 
       { 
        writer.Write(outByte); 
        writer.Flush(); 
        startIndex += bufferSize; 
        retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize); 
       } 
       writer.Write(outByte, 0, (int)retval - 1); 
       writer.Flush(); 
       writer.Close(); 
       stream.Close(); 
      } reader.Close(); 
      connection.Close(); 

Zapoznaj się z następującymi artykułami, aby uzyskać pomoc i szczegóły

Zapisywanie:

Retreival:

+0

Dzięki temu wydaje się być jeden. Poczekam trochę, jeśli ktoś inny ma więcej pomysłów, sposobów :-) Jeśli nie, przyjmuję to jako ostateczną odpowiedź. – MadBoy

+0

Cieszę się, że to pomogło –

+0

Czy wiesz, dlaczego proces jest tak powolny? –

2

wiem, że nie używa czytelników, ale tutaj jest próbka do kwerendy i zapisz na dysku. Aby go przywrócić, byłby to tylko wstawka lub aktualizacja przechodząca w bajcie []. Typ danych będzie varbinary max w sql.

SqlConnection connection = new SqlConnection ("..."); 
    connection.Open(); 
    SqlCommand command = new 
     SqlCommand ("select...e", connection); 
    byte[] buffer = (byte[]) command.ExecuteScalar(); 
    connection.Close(); 
    FileStream fs = new FileStream(@"C:\test.pdf", FileMode.Create); 
    fs.Write(buffer, 0, buffer.Length); 
    fs.Close(); 

czytelnik może być coś takiego

while (myReader.Read()) 
     { 
      byte[] file = myReader.GetBytes(0)); 
      // might be 
      file = (byte[])GetValue(0); 
     } 
+0

Niż ks, spróbuję tego. – MadBoy