Avatar billede nzc Nybegynder
09. marts 2004 - 18:30 Der er 14 kommentarer og
1 løsning

indsættelse af XmlNode i BLOB

hej!

jeg bakser med at sætte en XmlNode ind i en blob i en MS SQL DB. Jeg har følgende kode:

public static void GemBlob(XmlDocument doc)
    {
        SqlConnection nwindConn = new SqlConnection(@"Data Source=NZC\VSDOTNET;Initial Catalog=blobtest;Integrated Security=SSPI;");

        SqlCommand addEmp = new SqlCommand("INSERT INTO blobtest (ID, blob) " +
            "Values(@ID, @blob", nwindConn);

        addEmp.Parameters.Add("@ID", SqlDbType.VarChar, 10).Value = "11";
       
        addEmp.Parameters.Add("@blob", SqlDbType.Image, 9999 ).Value = doc;

        nwindConn.Open();

        addEmp.ExecuteNonQuery();

        nwindConn.Close();
    }

For det første får jeg følgende fejl:

Object must implement IConvertible

hvilket jo nok går på XmlNoden. hvordan fikser man det?

For det andet vil jeg gerne have en længde på XmlNoden så jeg er fri for at skrive 9999 som længde. Dette vil spare mig for en del plads jo :P Men det er lidt svært lige at hitte den rigtige måde at gøre det på synes jeg.

Håber i kan hjælpe ASAP :)

NZC
Avatar billede arne_v Ekspert
09. marts 2004 - 18:48 #1
XmlNode -> BLOB ? Skal du så ikke have lavet XmlNode om til et byte array først ?
Avatar billede nzc Nybegynder
09. marts 2004 - 18:51 #2
jow det er det jeg måske har fundet ud af :)

Ka du hjælpe med det ?
Avatar billede arne_v Ekspert
09. marts 2004 - 18:59 #3
Du kan prøve med disse to:

        public static byte[] Object2ByteArray(Object o)
        {
                MemoryStream ms = new MemoryStream();
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, o);
                return ms.ToArray();
        }
        public static object ByteArray2Object(byte[] theByteArray)
        {
                MemoryStream ms = new MemoryStream(theByteArray);
                BinaryFormatter bf = new BinaryFormatter();
                ms.Position = 0;
                return bf.Deserialize(ms);
        }
Avatar billede nzc Nybegynder
09. marts 2004 - 19:04 #4
puha brugte den øverste og fik

System.Runtime.Serialization.SerializationException: The type System.Xml.XmlDocument in Assembly System.Xml, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 is not marked as serializable.

hvordan dælen bærer man sig så an ?!
Avatar billede arne_v Ekspert
09. marts 2004 - 19:41 #5
Den er så ikke serializable.

Hvad med at hive XML'en ud som streng og så bytes ud af den ?
Avatar billede arne_v Ekspert
09. marts 2004 - 19:43 #6
Altså serialisere node.OuterXml
Avatar billede nzc Nybegynder
09. marts 2004 - 20:05 #7
det hjalp lidt :)

jeg har nu følgende kode

public static void GemBlob(XmlNode node)
    {
        SqlConnection nwindConn = new SqlConnection(@"Data Source=NZC\VSDOTNET;Initial Catalog=blobtest;Integrated Security=SSPI;");

        SqlCommand addEmp = new SqlCommand("INSERT INTO blobtest (ID, blob) " +
            "Values(@ID, @blob", nwindConn);

        addEmp.Parameters.Add("@ID", SqlDbType.VarChar, 10).Value = "11";
       
        byte[] blob = Object2ByteArray(node.OuterXml);

        addEmp.Parameters.Add("@blob", SqlDbType.Image, blob.Length ).Value = blob;

        nwindConn.Open();

        addEmp.ExecuteNonQuery();

        nwindConn.Close();
    }

    public static byte[] Object2ByteArray(Object o)
    {
        MemoryStream ms = new MemoryStream();
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        bf.Serialize(ms, o);
        return ms.ToArray();
    }

og får følgende fejl

System.Data.SqlClient.SqlException: Line 1: Incorrect syntax near '@blob'.

synes ikke helt det går så godt :(
Avatar billede arne_v Ekspert
09. marts 2004 - 20:09 #8
Mangler du ikke en parentes efter @blob i SQL sætningen ?
Avatar billede nzc Nybegynder
09. marts 2004 - 20:10 #9
SÅ SVAR DOG ARNE_V :D

Du er sq guru nr 1 :)
Avatar billede arne_v Ekspert
09. marts 2004 - 20:12 #10
svar
Avatar billede nzc Nybegynder
09. marts 2004 - 20:14 #11
det er mig en ære :)
Avatar billede nzc Nybegynder
09. marts 2004 - 20:27 #12
nu kommer det uundgåelige spørgsmål :P

Jeg har kigget lidt på

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconobtainingblobvaluesfromdatabase.asp

Men synes ikke helt jeg kan få den tilpasset min XmlNode. Jeg vil gerne ha al dataen ud i et byte[] på en gang i stedet for som de gør med en buffer. byte[] ska jo konverteres til en string som skal loades til en XmlNode. Har du en gylden løsning arne_v ?!
Avatar billede nzc Nybegynder
09. marts 2004 - 20:42 #13
public static void readxml()
    {
        SqlConnection pubsConn = new SqlConnection(@"Data Source=NZC\VSDOTNET;Integrated Security=SSPI;Initial Catalog=blobtest;");
        SqlCommand logoCMD = new SqlCommand("SELECT * FROM blobtest", pubsConn);
       
        string id = "";                    // The publisher id to use in the file name.

        // Open the connection and read data into the DataReader.
        pubsConn.Open();
        SqlDataReader myReader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess);

        while (myReader.Read())
        {
            // Get the publisher id, which must occur before getting the logo.
            id = myReader.GetString(0);
            byte[] blob = myReader.GetSqlBinary(1).Value;
            string xml = (string) ByteArray2Object(blob);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            doc.Save(@"C:\ye.xml");
       
        }
    }

virker :)
Avatar billede arne_v Ekspert
09. marts 2004 - 20:48 #14
Grunden til at Microsoft's kode ser ud som den gør er at BLOB's kan være meget store.

Hvis nu du gemte 1 GB BLOB's, så var det lidt træls at skulle læse det hele
ind i en buffer.

:-)
Avatar billede nzc Nybegynder
09. marts 2004 - 21:18 #15
mine XmlNoder kommer nok max til at fylde 10 MB så det er ikke så meget :) Men måske en buffer er ok at ha med :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester