Υπάρχουν διάφοροι τρόποι να δουλέψεις με nvarchar(max) και varbinary(max) οι οποίοι περιγράφονται στο Modifying Large-Value (max) Data in ADO.NET . Μπορείς για παράδειγμα να χρησιμοποιήσεις τις μεθόδους GetSqlBytes και GetSqlChars για να πάρεις αντίστοιχα ένα αντικείμενο τύπου SqlBytes ή SqlChars τα οποία σου επιτρέπουν να έχεις άμεση πρόσβαση στα δεδομένα των πεδίων μέσω των streams. Ειδικά η SqlBytes έχει ένα Stream property το οποίο σου δίνει άμεση πρόσβαση στο stream των δεδομένων.
Η ιδέα του Δημήτρη επίσης δεν είναι άσχημη αν τα δεδομένα σου θέλεις να τα αποθηκεύσεις ως varbinary αντί για varchar, αν και έτσι ο κώδικας σου θα πρέπει να κάνει πάντα τη μετατροπή από zipped binary σε text και το αντίστροφο. Θα πρέπει να έχεις πραγματικά πολλά δεδομένα για να έχει αξία κάτι τέτοιο - ειδικά τώρα που ο SQL Server 2008 επιτρέπει τη συμπίεση δεδομένων και την αποθήκευση blobs σε filestreams. Αντί όμως να συμπιέζεις στη μνήμη τα δεδομένα και να τα αποθηκεύεις μετά ως binary μπορείς να χρησιμοποιήσεις την κλάση GZipStream, να τη συνδυάσεις με την SqlBytes.Stream και να καταφέρεις έτσι να αποθηκεύεις απευθείας συμπιεσμένα δεδομένα στη βάση σου. Μπορείς δηλαδή να κάνεις το παρακάτω:
using(SqlConnection con=new SqlConnection(Settings.Default.Connection))
{
SqlCommand cmd=new SqlCommand("select ID,TextContent,ZippedContent from ZippedTable",con);
con.Open();
SqlDataReader reader=cmd.ExecuteReader();
while (reader.Read())
{
SqlChars textStream=reader.GetSqlChars(1);
SqlBytes zipStream=reader.GetSqlBytes(2);
using(StreamReader zipReader=new StreamReader(new GZipStream(zipStream.Stream,CompressionMode.Decompress)))
{
string unzippedLine= zipReader.ReadLine();
}
}
}
Τέλος, αν γράφεις πολλά δεδομένα θα χρειαστείς και αρκετό χρόνο για να γραφτούν αυτά στη βάση. Δεν υπάρχει κάποιος μαγικός τρόπος να μεταφερθούν τα δεδομένα γρηγορότερα από τη μνήμη στο σκληρό. Η χρήση streams δεν έχει σκοπό να αυξήσει την ταχύτητα αλλά να μειώσει τη μνήμη που χρησιμοποιείται κατά την εγγραφή των δεδομένων. Η SqlBytes ή η SqlChars μπορεί να σε βοηθήσει για να μιλήσεις απευθείας με τον Sql Server αλλά και πάλι, για να αποθηκεύσεις πολλά δεδομένα θα χρειαστεί χρόνος.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos