2010-02-13 3 views
7

J'utilise DocX pour créer des fichiers .docx. Au lieu de les stocker sur le disque dur, Partager ou SharePoint je préférerais les stocker dans la base de données SQL. Donc mes questions sont:Télécharger/Télécharger le fichier à partir de SQL Server 2005/2008 à partir de l'application WinForms C#?

  1. Comment écrire le code approprié pour enregistrer le fichier dans cette base de données?
  2. Comment écrire le code approprié pour récupérer le fichier dans cette base de données?
  3. Quel type de type de données dois-je définir pour qu'une table contienne les fichiers docx? Est-ce l'image?

En ce qui concerne,

MadBoy

PS. Je préfère un code approprié en termes d'utilisation en utilisant l'ancienne « école » façon:

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

Répondre

6

Un fichier docx est comme un fichier zip qui est une collection de plusieurs fichiers. Qu'en est-il convertir en binaire et puis enregistrez dans DB

Quelque chose que le travail followswill

Pour enregistrer

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

récupération est un peu processus compliqué comme suit

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

Avez-regarder les articles suivants pour de l'aide et des détails

Enregistrement:

Retreival:

+0

Merci cela semble être le seul. Je vais attendre un peu si quelqu'un d'autre a plus d'idées, de façons :-) Sinon, je l'accepterai comme réponse finale. – MadBoy

+0

Glad cela aidé –

+0

Une idée de la lenteur de ce processus? –

2

Je sais que ce n'utilise pas les lecteurs, mais voici un échantillon pour interroger et enregistrer sur le disque. Pour le remettre, il s'agirait simplement d'une insertion ou d'une mise à jour passant dans un octet []. Le type de données serait varbinary max in 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(); 
lecteur

pourrait être quelque chose comme ça

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

Que ks je vais l'essayer. – MadBoy

Questions connexes