Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

insert XML document into XMLtype Field SQL2008

Îåêßíçóå áðü ôï ìÝëïò Johnnyxp64. Τελευταία δημοσίευση από το μέλος Johnnyxp64 στις 25-10-2008, 16:52. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-10-2008, 18:45 45724

    insert XML document into XMLtype Field SQL2008

    Καλησπερα, εχω μια memmory stream και θελω να την αποθηκευσω σε μορφη απλου κειμενου η οπως ναναι (αρκει να ειναι αναστρεψημο) μεσα σε ενα πεδιο που ειναι nvchar(max) στην SQL Μου. μπορει να ακουστει αστειο αλλα με λιγο ψαξημο καταφερα και εγραψα το αναποδο πρωτα (που επισεις με ενδιαφερει) και θα ηθελα την βοηθεια σας πως να ολοκληρωσω την "μπροστα" funticion να τα γραφω στο πεδιο, οριστε η "πισω" διαδηκασια αναγνωσης και λιγο απο το μπροστα που ξεκινησα..

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Public Function ReadMemoryStreamFromDB(ByVal text As String) As MemoryStream
    Dim memStream As New MemoryStream
    Dim data As Byte() = System.Text.Encoding.Unicode.GetBytes(text)
    memStream.Write(data, 0, data.Length)
    Return memStream
    End Function


    Public Function WriteMemoryStreamToDB(ByVal memStream As MemoryStream) As String
    Dim text As String = ""

             Return text
        End Function

    αν εχεται να προτεινεται κατι ποιο γρηγορο και "μικρο" και ευκολο...plz be my guest Smile

    σας ευχαριστω πολυ.

    Υ.Γ για να σας φωτησω λιγο περισσοτερο, εχω μπει σε ολη αυτη την διαδηκασια γιατι θελω να γραφω στο πεδιο ευτο στην βαση μου κειμενο αλλα ειναι μεγαλο
    και το Insert περνει πολλα δευτερολεπτα. Αν υπαρχει κατι που να συμπιεζω το περιεχομενο ενος αρχειο που διαβαζω με (File.ReadAllText) σε string, ωστε το κειμενο να γινεται πολυ μικροτερο και να μην αργει το insert στην sql τοτε θα ειναι το πολυ καλητερα. Βεβαια το "ιδανικο" που φανταζομαι θα ηταν ενας τροπος να γραψω τα περιεχομενα της memmory stream κατευθειαν σε ενα πεδιο στην βαση χωρις καθηστερησεις. και το αντιστροφο.
    δοκιμασα με convert.tobase64string αλλα και παλη αργει περισσοτερο καθος το περιεχομενο της μνημης οταν μετατρεπεται σε base64string πιανει ακομα περισσοτερο ογκο ως TEXT στο πεδιο, και κατα το insert παλυ Σερνομαι! help plz.Sad


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  24-10-2008, 21:40 45726 σε απάντηση της 45724

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    Έχουμε και λέμε. Η συνάρτηση που σου λείπει:
    1
    2
    3
    4
    5
    6
        Public Function WriteMemoryStreamToDB(ByVal memStream As MemoryStream) As String
    Dim data(memStream.Length) As Byte
    memStream.Position = 0
    memStream.Read(data, 0, memStream.Length)
    Return System.Text.Encoding.Unicode.GetString(data)
    End Function

    Για να γράψεις απευθείας το memory stream στη βάση πρέπει να το μετατρέψεις σε byte array (γραμμές 2 έως 4 στον κώδικα που σου δίνει) και μετά να γράψεις το array στη βάση. Με μια γρήγορη αναζήτηση βρήκα αυτό το παράδειγμα: http://www.akadia.com/services/dotnet_read_write_blob.html.

    Επίσης μπορείς να συμπιέσεις το stream σου "γράφωντάς το" σε ένα zip stream. Μετά μετατρέπεις το zip stream σε byte array και γράφεις αυτό στη βάση. Ψάξε λίγο στο dnz για συμπίεση. Πρόσφατα κάποιος χρήστης είχε ρωτήσει γι αυτό.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  25-10-2008, 01:16 45728 σε απάντηση της 45726

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    dimitri

    σε ευχαριστω, επρεπε να κανω μια λλαγη απο unicode se UTF8 αλλιος περνω ??????????? ερωτηματικα,

    αλλα και παλι δεν εχει τα αποτελεσματα που ηθελα, αργει πολυ να γραψει το insert, κανει σαν να εγραφα ολο το αρχειο χωρις καμια μετατροπη.δεν κερδισα τιποτα Tongue Tied

    με το zip stream που προτεινεις θα δω βελτιωση, αυτο με με ενδιαφερει ειναι η ταχυτητα αποθηκευσης, και το .net δεν εχει δυνατοτητα compress ενος αρχειου? κανα Link θα ηταν ευπροσδεκτο, γιατι με το gogole περνω 
    αποτελεσματα compress σε ΖΙP δεν θελω κατι τετοιο.η θελω?

    σε ευχαριστω πολυ για το χρονο σου παντος! Wink


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  25-10-2008, 01:41 45729 σε απάντηση της 45724

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    Υπάρχουν διάφοροι τρόποι να δουλέψεις με 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
  •  25-10-2008, 02:22 45731 σε απάντηση της 45729

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    ναι καταλαβαινω.........

    εγω προσπαθω να γραψω ενα XML σαν κειμενο και ολο αυτο το κειμενο να μπει με INSERT οσο το δυνατον ποιο γρηγορα μεσα στο πεδιο type XML! και ενα αρχειακι 80ΚΒ κανει 10δευτερολεπτα ο SQL2008 σε μηχανημα που φυσαει....ε δεν μπορει καποιος αλλος τροπος θα υπαρχει....

    δοκιμασα και να φτιαξω ενα XMLdocument εκαν load το αρχειο μου ειπα να γινει insert στο πεδιο που εχει Type XML και αυτο γραφει μονο system.xmldocument αντι να γραψει το περιεχομενο του....
    ελεγα μηπως ετσι το καταλαβαινε καλητερα αλλα τζηφος................................

    ας ξεχασουμε για λιγο το stream reader ktl μαλλον πρεπει να υπαρχει αλλη ποιο "σωστη" προσεγγιση στο προβλημα αποθηκευσεις XML data σε πεδιο XML στην SQL2008.

    για αυτο αλλαζω και τον τιτλο...


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  25-10-2008, 10:58 45734 σε απάντηση της 45731

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    Κοίτα, πρέπει να καταλάβεις τί κάνει ο κώδικας που γράφεις και όχι να γράφεις κάτι στην τύχη ελπίζοντας να δουλέψει. Δεν μπορείς έτσι απλά να κάνεις assign ένα αντικείμενο σε ένα άλλο άσχετο και να περιμένεις να μαντέψει το .NET τί ήθελες να κάνεις. Με όσα λες μαντεύω ότι προσπάθησες να κάνεις assign ένα XmlDocument αντικείμενο απευθείας σε ένα string variable. Ε, το ToString() του XML Document σου επιστρέφει το όνομα του τύπου. Απλά γιατί δεν έχει νόημα να κάνει κάτι άλλο. Όπως και να προσπαθούσες να κάνεις assign ένα MemoryStream σε ένα string variable θα σου έβγαζε System.IO.MemoryStream.

    Καλό θα ήταν να μας είχες πει από την αρχή ότι θέλεις να φορτώσεις ένα XML document σε ένα XML πεδίο, γιατί όσα σου είπαμε ως τώρα είναι άσχετα. Νομίζω ότι πριν σου απαντήσουμε παραπέρα θα πρέπει να μας πεις τί θέλεις να κάνεις χωρίς συντομεύσεις, για να μην χάνουμε και τη μπάλα κάθε φορά. Επίσης, αντί να προσπαθείς να "καρφώσεις" κώδικα, κοίτα το MSDN. Τα έχει όλα έτοιμα. Θες να δουλέψεις με XML Types στον SQL? Κοίτα στο MSDN τί λέει για XML Types στο documentation του SQL Server. Ένα άρθρο που βρήκα ψάχνοντας στα πολύ γρήγορα είναι το "Specifying XML Values as Command Parameters". Όπως βλέπεις λέγοντας μας τα μισά, υπονοώντας τα άλλα μισά, σου παίρνει πολύ περισσότερο να βγάλεις άκρη απ' ότι αν απλά δοκίμαζες να διαβάσεις τί υπάρχει για Xml types.

    Άσε που δεν έχει πλάκα κάθε φορά να μαντεύουμε "τώρα τί θέλει πάλι?"

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  25-10-2008, 15:55 45744 σε απάντηση της 45734

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    οχι βρε Παναγιωτη, πριν που ελεγα για stream ηξερα τη ελεγα.

    κοιτα ο αποτερος σκοπος ειναι να αποθηκευσω ενα ολοκληρο αρχειο XML μεσα σε SQL σε πεδιο XML (γρηγορα) (που ελεγχει και για λαθη στο structure se sxesh me nvarchar(max) και θα μου δωσει την δυνατωτητα να το διαβασω ως αντικειμενο αν χριαστω στο μελλον)

    ΑΛΛΑ αφου ειδα και αποειδα και τελικα αυτο ΔΕΝ γινοταν, η τουλαχιστον δεν βρηκα πως γινεται, (οτι εβρησκα λεγαν μονο πως να περασω XML με SQL query,εγω θελω κατευθειαν ολο το αρχειο να ανεβει!)

    μετα ειδα οτι το XML αυτο (που προερχεται απο Dev Express Control) μπορω αντι να το γραψω ως Αρχειο, να το παρω ως memory stream (πολυ ποιο γρηγορο)και γι αυτο αρχικα ρωτησα πως να περασω αυτο το memmory stream σε ενα πεδιο sthn βαση(ποιος ο καταληλοτερος τυπος για το πεδιο? image,Varbinary,???) και αργοτερα να μπορεσω να το ανακτησω παλι ως memmory stream????

    ενα απο τα 2 θελω να καταφερω, το ποιο "καλο" παραδειγμα που βρηκα ειναι αυτο, ΕΔΩ αλλα κανοντας το vb.net και εκτελωντας το, τρωω crash οτι Προσπαθω να γραψω δεδομενα τυπου VarChar σε πεδιο VarBinary ενω αν δητε ο τυπος παρακατω λεει καθαρα στο SQL creat οτι το Πεδιο "layout" Που παει να γραψει ειναι VarBinary! τελος παντον, ενα ενα.

    συγνωμη που σας μπερδεψα ελπιζω τωρα να καταλαβαται καλητερα.

    μαλλον με την SQLXML που λες θα γινει η δουλεια μου, διαβασω τωρα το link σου και θα ξαναπροσπαθησω....

    tnxWink


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  25-10-2008, 16:29 45746 σε απάντηση της 45744

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    Και το παράδειγμα που δίνεις πάλι ολόκληρη την τιμή σώζει. Αν πρόσεξες, σώσει το MemoryStream.GetBuffer(). Διαβάζει δηλαδή από το MemoryStream ΟΛΟΚΛΗΡΟ το περιεχόμενο ως byte array και το αποθηκεύει ΟΛΟΚΛΗΡΟ στη βάση.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  25-10-2008, 16:52 45747 σε απάντηση της 45746

    Απ: Απο memory.stream σε text field in SQL και "πισω"

    να και εδω ρωτω, το buffer ολοκληρο οταν αποθηκευεται δεν ειναι γρηγοροτερο απο το να διαβασω το XML ως string και να το αποθηκευσω?

    γιατι το παραδειγμα αυτο σε εμενα δεν παιζει (ακομη) και δεν μπορω να συγκρινω χρονους....αν οχι μην καθομαι και ασχολουμε με την μετατροπη apo c# σε vb.net και ξεκαθαρισμα τι θελω για το προγραμμα μου αδικα.

    και παλι σε ευχαριστω για την βοηθειαYes

    ---διαβασα το MSDN που εδωσες, αλλα αναφερει μονο την μπροστα διαδηκασια και τα σχετικα link  δεν εχει πως να ξανακανεις αρχειο αυτο που μολις αποθηκευσες στον πινακα.
    Πιστευω οτι το εκανα σωστα, το εχεις δουλεψειτο SQLxml εσυ καθολου? αν ναι τι βλεπεις οταν ανοιγεις το πεδιο στον πινακα, πως το εχει αποθηκευμενο???τι βλεπεις?

    ακομα ολα αυτα τα παραδειγμα εχουν "υποχρεωτικα" και χρηση SQLreader, εγω δεν θελω να κανω τιποτα απο αυτα, εχω κανει το connection μου εχω φορτωσει τις εγγραφες σε ενα datatable δεν μπορω να τα αλλαξω ολα
    για το SQLxml για να το διαβασω. 

    στο παρακατω παραδειγμα διαβαζει το xml απο πεδιο XML σωστα?

    ε εγω δεν θελω τιποτα απο τα SQLconnections και SQLdatareader. δεν υπαρχει πιο απλος τροπος να πω το SQLxml να κανει αρχειο τα δεδομενα απο το ταδε datatable πεδιο που ειμαι τωρα?
    ας πουμε να παω κατευθειαν στην line 12.....εγω εχω ενα datattable.rows(0).item("XMLcolumn") που θελω να διαβασει καπος και να το κανω XML αρχειο παλι.....

    ασε εχω μπερδευτει ειμαι 1 μερα αυπνος προσπαθοντας να βρω ενα τροπο....sorry αν σε μπερδευω

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    protected bool LoadXml(SqlConnection cn, XmlDocument doc) 
    {
    //Reading the xml from the database
    string sql = @"SELECT Id, XmlField FROM TABLE_WITH_XML_FIELD WHERE Id = @Id";
    SqlCommand cm = new SqlCommand(sql, cn);
    cm.Parameters.Add(new SqlParameter("@Id",1));
    using (SqlDataReader dr = cm.ExecuteReader())
    {
    if (dr.Read())
    {
    SqlXml MyXml= dr.GetSqlXml(dr.GetOrdinal("XmlField"));
    doc.LoadXml( MyXml.Value);
    return true;
    }
    else
    {
    return false;
    }
    }
    }


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems