从存储过程传递对象以使用XML进行序列化

时间:2014-02-13 21:29:46

标签: c# sql sql-server xml xml-serialization

我有一个定义的对象列表。我想从存储过程中填充它们,然后序列化它们以传递给XML文件。我坚持如何实现这一目标。这是我到目前为止所拥有的。我不想使用LINQ。

在图书馆课程中我有这个:

public class Person
{
    public static string First_Name { get; set; }
    public static string Last_Name { get; set; }    
    public static string Address1 { get; set; }
    public static string Address2 { get; set; }
}

在数据库类中,我有这个:

conn = new SqlConnection(ConfigurationManager.AppSettings["DatabaseConnection"]);

            using (var cmd = new SqlCommand())
            {
                conn.Open();
                cmd.Connection = conn;
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "sp_GetInfo";

                cmd.Parameters.Add(CreateParameter("@Id", SqlDbType.Int, Id));

                SqlDataReader dr = cmd.ExecuteReader();

                if (dr.Read())
                {
                    string First_Name = dr.GetString(0);
                    string Last_Name = dr.GetString(1);
                    string Address1 = dr.GetString(2);
                    string Address2 = dr.GetString(3);                      

                    dr.Close();
                    dr.Dispose();
                }

要序列化我计划使用它:

public static string Serialize(object obj)
    {
        XmlSerializer xs = new XmlSerializer(obj.GetType());
        MemoryStream buffer = new MemoryStream();
        xs.Serialize(buffer, obj);
        return ASCIIEncoding.ASCII.GetString(buffer.ToArray());
    }

我是在正确的道路上还是我需要以不同的方式看待这个?

2 个答案:

答案 0 :(得分:0)

你走在正确的道路上。请注意,当您从存储过程中读取数据时(顺便说一下,请避免使用“sp_”前缀;这是MS存储过程的约定),您需要创建列出的Person对象。

在序列化方面,更简单的版本是使用StringWriter类:

        public static string Serialize(object obj)
        {
            XmlSerializer xs = new XmlSerializer(obj.GetType());
            using (StringWriter textWriter = new StringWriter())
            {
                xs.Serialize(textWriter, obj);
                return textWriter.ToString();
            }
        }

请注意使用using语句,该语句强制调用Dispose()IDisposable个对象上的{{1}}。

答案 1 :(得分:0)

这是我用于serz'ing对象的代码片段

    public static string XmlString<X>(X obj, bool omitXmlDeclaration = false, bool omitNameSpace = false)
    {
        var xSer = new XmlSerializer(typeof(X));

        var settings = new XmlWriterSettings() { OmitXmlDeclaration = omitXmlDeclaration, Indent = true, Encoding = new UTF8Encoding(false) };
        using (var ms = new MemoryStream())
        using (var writer = XmlWriter.Create(ms, settings))
        {
            if (!omitNameSpace)
            {
                xSer.Serialize(writer, obj);
            }
            else
            {
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                xSer.Serialize(writer, obj, ns);
            }
            ms.Seek(0, 0);
            return new UTF8Encoding(false).GetString(ms.GetBuffer(), 0, (int)ms.Length);
        }
    }

有些时候,您可能希望在大量存储XML时省略不必要的文本以节省空间,因此这允许您省略xml声明和命名空间。

请注意使用using语句堆叠,我想将其用作关于连接打开的另一个建议。

这是我在使用直接ADO.NET

时发现非常有用的模板
using(var conn=new SqlConnection(""))
using(var cmd=new SqlCommand("[sqltext||sproc]",conn)){
//setup cmd with type of sql to execute
//establish a data reader
    conn.Open();//at the latest possible moment
    using(var dr=cmd.ExecuteReader()){
        //do assignments
    }
}

这只是一块脚手架。您必须填写详细信息并根据需要调整阅读器执行。

最后,如果您计划进行任何二进制序列化或使用proc之外的会话(例如使用SQL Server支持的ASP.NET会话),则应将您的类标记为Serializable。