我有一个定义的对象列表。我想从存储过程中填充它们,然后序列化它们以传递给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());
}
我是在正确的道路上还是我需要以不同的方式看待这个?
答案 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。