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:
- Zapisz go w formacie MemoryStream, używając metody przeciążenia Save klasy Document.
- 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(); | |
} |