Sérialiser et travailler avec un document dans une base de données

L’une des tâches que vous devrez peut-être effectuer lorsque vous travaillez avec des documents consiste à stocker et à récupérer des objets Document vers et depuis une base de données. Par exemple, cela serait nécessaire si vous mettiez en œuvre tout type de système de gestion de contenu. Toutes les versions précédentes des documents doivent être stockées dans le système de base de données. La possibilité de stocker des documents dans la base de données est également extrêmement utile lorsque votre application fournit un service Web.

Aspose.Words offre la possibilité de convertir un document en tableau d’octets pour un travail ultérieur avec ce document dans une base de données.

Convertir un document en tableau d’octets

Pour stocker un document dans une base de données ou pour préparer un document à transmettre sur le Web, il est souvent nécessaire de sérialiser le document pour obtenir un tableau d’octets.

Pour sérialiser un objet Document dans Aspose.Words:

  1. Enregistrez-le dans un MemoryStream en utilisant la surcharge de méthode Save de la classe Document.
  2. Appelez la méthode ToArray, qui renvoie un tableau d’octets représentant le document sous forme d’octets.

Les étapes ci-dessus peuvent alors être inversées pour charger à nouveau les octets dans un objet Document.

L’exemple ci-dessous montre comment sérialiser un objet Document pour obtenir un tableau d’octets, puis comment désérialiser le tableau d’octets pour obtenir à nouveau un objet Document:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_LoadingAndSaving();
// Load the document from disk.
Document doc = new Document(dataDir + "Test File (doc).doc");
// Create a new memory stream.
MemoryStream outStream = new MemoryStream();
// Save the document to stream.
doc.Save(outStream, SaveFormat.Docx);
// Convert the document to byte form.
byte[] docBytes = outStream.ToArray();
// The bytes are now ready to be stored/transmitted.
// Now reverse the steps to load the bytes back into a document object.
MemoryStream inStream = new MemoryStream(docBytes);
// Load the stream into a new document object.
Document loadDoc = new Document(inStream);

Vous pouvez télécharger le fichier modèle de cet exemple depuis Aspose.Words GitHub.

Stocker, lire et supprimer un document dans une base de données

Cette section montre comment enregistrer un document dans une base de données, puis le charger à nouveau dans un objet Document pour pouvoir l’utiliser. Par souci de simplicité, le nom du fichier est la clé utilisée pour stocker et récupérer les documents de la base de données. La base de données contient deux colonnes. La première colonne “FileName” est stockée sous forme de chaîne et est utilisée pour identifier les documents. La deuxième colonne “FileContent” est stockée en tant qu’objet BLOB qui stocke l’objet document sous forme d’octets.

L’exemple de code suivant montre comment configurer une connexion à une base de données et exécuter des commandes:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
string dbName = "";
// Open a database connection.
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + RunExamples.GetDataDir_Database() + dbName;
OleDbConnection mConnection = new OleDbConnection(connString);
mConnection.Open();

L’exemple de code suivant montre comment enregistrer un document dans la base de données, puis relire le même document et enfin supprimer l’enregistrement contenant le document de la base de données:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// Store the document to the database.
StoreToDatabase(doc, mConnection);
// Read the document from the database and store the file to disk.
Document dbDoc = ReadFromDatabase(fileName, mConnection);
// Save the retrieved document to disk.
string newFileName = Path.GetFileNameWithoutExtension(fileName) + " from DB" + Path.GetExtension(fileName);
dbDoc.Save(dataDir + newFileName);
// Delete the document from the database.
DeleteFromDatabase(fileName, mConnection);
// Close the connection to the database.
mConnection.Close();

Enregistrer un document dans une base de données

Pour enregistrer un document dans une base de données, convertissez ce document en un tableau d’octets, comme décrit au début de cet article. Ensuite, enregistrez ce tableau d’octets dans un champ de base de données.

L’exemple de code suivant montre comment enregistrer un document dans la base de données spécifiée:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
public static void StoreToDatabase(Document doc, OleDbConnection mConnection)
{
// Save the document to a MemoryStream object.
MemoryStream stream = new MemoryStream();
doc.Save(stream, SaveFormat.Docx);
// Get the filename from the document.
string fileName = Path.GetFileName(doc.OriginalFileName);
// Create the SQL command.
string commandString = "INSERT INTO Documents (FileName, FileContent) VALUES('" + fileName + "', @Docx)";
OleDbCommand command = new OleDbCommand(commandString, mConnection);
// Add the @Docx parameter.
command.Parameters.AddWithValue("Docx", stream.ToArray());
// Write the document to the database.
command.ExecuteNonQuery();
}

Spécifiez commandString, qui est une expression SQL qui fait tout le travail:

  • Pour enregistrer un document dans la base de données, la commande “INSERT INTO” est utilisée et une table spécifiée avec les valeurs de deux champs d’enregistrement – FileName et FileContent. Pour éviter des paramètres supplémentaires, le nom du fichier est extrait de l’objet Document lui-même. La valeur du champ FileContent se voit attribuer des octets du flux mémoire, qui contient une représentation binaire du document stocké.
  • La ligne de code restante exécute la commande qui stocke le document Aspose.Words dans la base de données.

Récupérer un document d’une base de données

Pour récupérer un document de la base de données, sélectionnez l’enregistrement qui contient les données du document sous forme de tableau d’octets. Chargez ensuite le tableau d’octets de l’enregistrement dans MemoryStream et créez un objet Document qui chargera le document à partir du MemoryStream.

L’exemple de code suivant montre comment récupérer et renvoyer un document à partir de la base de données spécifiée en utilisant le nom de fichier comme clé pour récupérer ce document:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
public static Document ReadFromDatabase(string fileName, OleDbConnection mConnection)
{
// Create the SQL command.
string commandString = "SELECT * FROM Documents WHERE FileName='" + fileName + "'";
OleDbCommand command = new OleDbCommand(commandString, mConnection);
// Create the data adapter.
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
// Fill the results from the database into a DataTable.
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
// Check there was a matching record found from the database and throw an exception if no record was found.
if (dataTable.Rows.Count == 0)
throw new ArgumentException(string.Format("Could not find any record matching the document \"{0}\" in the database.", fileName));
// The document is stored in byte form in the FileContent column.
// Retrieve these bytes of the first matching record to a new buffer.
byte[] buffer = (byte[])dataTable.Rows[0]["FileContent"];
// Wrap the bytes from the buffer into a new MemoryStream object.
MemoryStream newStream = new MemoryStream(buffer);
// Read the document from the stream.
Document doc = new Document(newStream);
// Return the retrieved document.
return doc;
}

Supprimer un document d’une base de données

Pour supprimer un document de la base de données, utilisez la commande SQL appropriée sans aucune manipulation sur l’objet Document.

L’exemple de code suivant montre comment supprimer un document de la base de données, en utilisant le nom du fichier pour récupérer l’enregistrement:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
public static void DeleteFromDatabase(string fileName, OleDbConnection mConnection)
{
// Create the SQL command.
string commandString = "DELETE * FROM Documents WHERE FileName='" + fileName + "'";
OleDbCommand command = new OleDbCommand(commandString, mConnection);
// Delete the record.
command.ExecuteNonQuery();
}