2010-02-13 4 views
7

Estoy usando DocX para crear archivos .docx. En lugar de almacenarlos en el disco duro, Share o SharePoint preferiría almacenarlos dentro de la base de datos SQL. Entonces mis preguntas son:Cargar/Descargar archivo desde SQL Server 2005/2008 desde la aplicación WinForms C#?

  1. ¿Cómo escribir el código correcto para guardar el archivo en esa base de datos?
  2. ¿Cómo escribir el código correcto para recuperar el archivo en esa base de datos?
  3. ¿Qué tipo de datos debo establecer para que una tabla contenga los archivos docx? ¿Es imagen?

En lo que respecta,

MadBoy

PS. Yo preferiría un código adecuado en términos de usar Uso de la manera antigua 'escuela':

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

Respuesta

6

Un archivo docx es como un archivo zip que es una colección de varios archivos. ¿Qué hay de convertir a binario y luego guardar en DB

Algo tan followswill trabajar

Para guardar

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

Recuperación es un proceso complicado bits de la siguiente manera

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

Tenga en cuenta los siguientes artículos para obtener ayuda y detalles

Ahorro:

retreival:

+0

Gracias este parece ser el indicado. Esperaré un poco si alguien más tiene más ideas, formas :-) Si no, lo aceptaré como respuesta final. – MadBoy

+0

Me alegro de esto ayudó –

+0

¿Alguna idea de por qué este proceso es tan lento? –

2

Yo sé que no es el uso de los lectores, pero aquí es una muestra para consultar y guardar en el disco. Volver a colocarlo sería simplemente una inserción o actualización pasando en un byte []. El tipo de datos sería varbinary max en 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(); 

lector podría ser algo como esto

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

Que ks lo probaré. – MadBoy

Cuestiones relacionadas