DataSet Xml Deserialization Data / Schema Load Order

Note to self:

When deserializing a dataset from xml, make sure to execute ReadXmlSchema before executing ReadXml, otherwise you'll have problem when you try casting your data into the correct data type.

using System;
using System.Data;
using System.IO;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            //Serialize the sample data
            var ds          = InitDataSource();
            var dataXml     = SerializeData(ds).ToString();
            var schemaXml   = SerializeSchema(ds).ToString();
 
            //Example of bad order
            var dsBad = new DataSet();
            dsBad.ReadXml(new StringReader(dataXml));
            dsBad.ReadXmlSchema(new StringReader(schemaXml));
 
            Console.WriteLine("Bad Example Result:");
 
            try
            {
                Console.WriteLine(
                    string.Format("{0}:{1} {2:N2}",
                        (int)dsBad.Tables[0].Rows[0][0],        //Will throw exception here
                        dsBad.Tables[0].Rows[0][1],
                        (decimal)dsBad.Tables[0].Rows[0][2]));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
 
            Console.WriteLine();
 
            //Example of good order
            var dsGood = new DataSet();
            dsGood.ReadXmlSchema(new StringReader(schemaXml));
            dsGood.ReadXml(new StringReader(dataXml));
 
            Console.WriteLine("Good Example Result:");
            Console.WriteLine(
                string.Format("{0}:{1} {2:N2}",
                    (int)dsGood.Tables[0].Rows[0][0],
                    dsGood.Tables[0].Rows[0][1],
                    (decimal)dsGood.Tables[0].Rows[0][2]));
 
            Console.WriteLine();
            Console.WriteLine("Press any key...");
            Console.ReadLine();
        }
 
        private static StringWriter SerializeSchema(DataSet ds)
        {
            using (var sw = new StringWriter())
            {
                ds.WriteXmlSchema(sw);
                return sw;
            }
        }
 
        private static StringWriter SerializeData(DataSet ds)
        {
            using (var sw = new StringWriter())
            {
                ds.WriteXml(sw);
                return sw;
            }
        }
    
        private static DataSet InitDataSource()
        {
            var ds = new DataSet("Foo");
 
            //Setup Sample DataTable
            var dt = new DataTable("Bar");
            dt.Columns.Add("Id", typeof (int));
            dt.Columns.Add("Description", typeof (string));
            dt.Columns.Add("Price", typeof (decimal));
 
            //Populate with Sample Data
            dt.Rows.Add(1, "Banana", 6.05m);
 
            ds.Tables.Add(dt);
            return ds;
        }
    }
}
Share this post: | | | |
Published Tuesday, July 08, 2008 2:53 PM by Jimmy Chandra
Filed under: ,

Comments

No Comments

Leave a Comment

(required) 
(required) 
(optional)
(required) 

Enter the numbers above: