Serializacja i praca z dokumentem w bazie danych

Jednym z zadań, które możesz wykonać podczas pracy z dokumentami, jest przechowywanie i pobieranie obiektów Document do i z bazy danych. Na przykład byłoby to konieczne, jeśli wdrażasz dowolny rodzaj systemu zarządzania treścią. Wszystkie poprzednie wersje dokumentów muszą być przechowywane w systemie bazodanowym. Możliwość przechowywania dokumentów w bazie danych jest również niezwykle przydatna, gdy Twoja aplikacja udostępnia usługę internetową.

Aspose.Words zapewnia możliwość konwersji dokumentu na tablicę bajtów w celu późniejszej pracy z tym dokumentem w bazie danych.

Konwertuj dokument na tablicę bajtów

Aby zapisać dokument w bazie danych lub przygotować dokument do transmisji w Internecie, często konieczna jest serializacja dokumentu w celu uzyskania tablicy bajtów.

Aby serializować obiekt Document w formacie Aspose.Words:

  1. Zapisz go w formacie MemoryStream, używając metody przeciążenia Save klasy Document.
  2. Wywołaj metodę ToArray, która zwraca tablicę bajtów reprezentujących dokument w postaci bajtów.

Powyższe kroki można następnie odwrócić, aby załadować bajty z powrotem do obiektu Document.

Poniższy przykład pokazuje, jak serializować obiekt Document w celu uzyskania tablicy bajtów, a następnie jak zdeserializować tablicę bajtów, aby ponownie uzyskać obiekt 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);

Możesz pobrać plik szablonu tego przykładu z Aspose.Words GitHub.

Przechowuj, czytaj i usuwaj dokument w bazie danych

W tej sekcji pokazano, jak zapisać dokument w bazie danych, a następnie załadować go z powrotem do obiektu Document w celu pracy z nim. Dla uproszczenia nazwa pliku jest kluczem używanym do przechowywania i pobierania dokumentów z bazy danych. Baza danych zawiera dwie kolumny. Pierwsza kolumna “FileName” jest przechowywana jako String i służy do identyfikacji dokumentów. Druga kolumna “FileContent” jest przechowywana jako obiekt BLOB, który przechowuje obiekt dokumentu w postaci bajtowej.

Poniższy przykład kodu pokazuje, jak skonfigurować połączenie z bazą danych i wykonać polecenia:

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

Poniższy przykład kodu pokazuje, jak zapisać dokument w bazie danych, następnie ponownie przeczytać ten sam dokument i na koniec usunąć z bazy danych rekord zawierający dokument:

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

Zapisz dokument w bazie danych

Aby zapisać dokument w bazie danych, przekonwertuj ten dokument na tablicę bajtów, jak opisano na początku tego artykułu. Następnie zapisz tę tablicę bajtów w polu bazy danych.

Poniższy przykład kodu pokazuje, jak zapisać dokument w określonej bazie danych:

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

Określ CommandString, który jest wyrażeniem SQL wykonującym całą pracę:

  • Do zapisania dokumentu do bazy danych służy polecenie “INSERT INTO” i podanie tabeli wraz z wartościami dwóch pól rekordów – FileName i FileContent. Aby uniknąć dodatkowych parametrów, nazwa pliku jest pobierana z samego obiektu Document. Do wartości pola FileContent przypisane są bajty ze strumienia pamięci, który zawiera binarną reprezentację przechowywanego dokumentu.
  • Pozostała linia kodu wykonuje polecenie przechowujące dokument Aspose.Words w bazie danych.

Pobierz dokument z bazy danych

Aby pobrać dokument z bazy danych, wybierz rekord zawierający dane dokumentu w postaci tablicy bajtów. Następnie załaduj tablicę bajtów z rekordu do MemoryStream i utwórz obiekt Document, który załaduje dokument z MemoryStream.

Poniższy przykład kodu pokazuje, jak pobrać i zwrócić dokument z określonej bazy danych, używając nazwy pliku jako klucza do pobrania tego dokumentu:

// 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;
}

Usuń dokument z bazy danych

Aby usunąć dokument z bazy należy użyć odpowiedniego polecenia SQL bez żadnych manipulacji na obiekcie Document.

Poniższy przykład kodu pokazuje, jak usunąć dokument z bazy danych, używając nazwy pliku do pobrania rekordu:

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