2013-12-09 89 views
0

我有一个类和一个来自数据库的查询,填充DataSet中的DataTable。被序列化Datatable来填充(Object)标记。Serilize DataTable(Dataset)to Object

对象:

public class Marks 
    { 
     /// <summary> 
     /// 
     /// </summary> 
     public List<Mark> MarkList { get; set; } 

     public Marks() 
     { 
      MarkList = new List<Mark>(); 
     } 
    } 


    public class Mark 
    { 
     public String Number { get; set; } 

     public String Word { get; set; } 

     public DateTime? DateIn { get; set; } 

     public DateTime? DateOut { get; set; } 
    } 

我试着这样做:

private void BindMarksSerialize() 
{  
    FillDataTable(dtMarks, MarksCMD); 

    MemoryStream stream = new MemoryStream(); 
    dtMarks.WriteXml(stream); 
    XmlSerializer serializer = new XmlSerializer(typeof(Marks), new XmlRootAttribute("Marks")); 
    File.WriteAllBytes("C:\\Out.xml", stream.ToArray()); 


    StreamReader reader = new StreamReader("C:\\Out.xml"); 
    var marks = (Marks)serializer.Deserialize(reader); 
    reader.Close(); 
} 

private void FillDataTable(DataTable dataTable, Object sqlCommandContainer) 
{ 
    var sqlCommand = sqlCommandContainer as SqlCommand; 
    var sqlDataAdapter = sqlCommandContainer as SqlDataAdapter; 
    if (sqlDataAdapter == null && sqlCommand == null) 
     return; 
    try 
    { 
     dataTable.Clear(); 
     if (sqlCommand != null) 
     { 
      sqlCommand.Connection.Open(); 
      dataTable.Load(sqlCommand.ExecuteReader()); 
     } 
     else 
      sqlDataAdapter.Fill(dataTable); 
    } 
    catch (SqlException ex) 
    { 
     Logger.Error(new StackTrace(1).GetFrame(0).GetMethod().Name + @": " + Environment.NewLine + ex.Message); 
    } 
    finally 
    { 
     if (sqlCommand != null) 
      sqlCommand.Connection.Close(); 
    } 
} 

需要结果来填充XML:

<Marks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MarkList> 
    <Mark> 
     <Number>1</Number> 
     <Word>123123123</Word> 
     <DateIn xsi:nil="true" /> 
     <DateOut xsi:nil="true" />  
    </Mark> 
    </MarkList> 
</Marks> 

我:

<NewDataSet> 
    <Mark> 
    <Number>110938</Number> 
    <Word>110938</Word> 
    <DateIn>1993-04-08T00:00:00+05:00</DateIn> 
    <DateOut>2002-02-04T00:00:00+04:00</DateOut>  
    </Mark> 
</NewDataSet> 

提示任何人都可以知道如何做到这一点?

回答

1

如果我正确地理解了您的问题,您将DataSet写入XML文件时遇到问题,但将标记类类型对象的列表写入XML时没有问题。

您可以使用反射来创建一个可重用的函数,它将从任何Datatable中读取Datarow并将其分配给您作为参数传递的任何对象。如果您想要该对象的List,那么您可以遍历DataTable的DataRows。在下面的示例中,我从单行生成一个对象。 (这是一种可重复使用的映射。)

public static object ConvertDataRowToObject(object Object, DataTable DataTable) 
{ 
    try 
    { 
     if (DataTable.Rows.Count > 0) 
     { 
      DataRow DataRow = DataTable.AsEnumerable().FirstOrDefault(); 
      if (DataRow != null) 
      { 
       Type ObjectType = Object.GetType(); 
       //Get public properties 
       System.Reflection.PropertyInfo[] _propertyInfo = 
        ObjectType.GetProperties(); 
       foreach (System.Reflection.PropertyInfo _property in _propertyInfo) 
       { 
        _property.SetValue(Object, (DataRow[_property.Name.ToString()] is System.DBNull ? null : DataRow[_property.Name.ToString()]), null); 
       } 
       return Object; 
      } 
      else return null; 
     } 
     else 
      return null; 
    } 
    catch (Exception excp) 
    { 
     Common.WriteErrorLog(excp.Message); 
     return null; 
    } 
} 

现在,当我需要调用此静态重用的功能,我可以做这样的样品。

Database _dbFactory = Common.Database; 
       DataSet dset = new DataSet(); 
       Object[] _dbObject = DataBaseHelper.CreateConnection(); 
       dset = _dbFactory.ExecuteDataSet("Jwl_sp_SearchByProductCategoryById", new object[] { _Id }); 
       DataBaseHelper.CloseConnection((SqlConnection)_dbObject[0]); 
       DataTable dt = new DataTable(); 
       dt = dset.Tables[0]; 
       var objectTobeConverted = new DataLogic.Database.Jwl_ByProductCategory(); 
       ConvertDataRowToObject(objectTobeConverted, dt); 

我使用Javascript序列化器对这个对象进行了序列化。下一步你的情况是写入一个xml文档,你可以使用xmlSerialization,或者我会建议使用XMLWriter。

public static string GetJSONSerializedObject(object myItem) 
{ 
    try 
    { 
     if (myItem != null) 
     { 
      List<KeyValuePair<string, string>> _propList = new List<KeyValuePair<string, string>>(); 

      Type myObjectType = myItem.GetType(); 
      //Get public properties 
      System.Reflection.PropertyInfo[] _propertyInfo = 
       myObjectType.GetProperties(); 
      foreach (System.Reflection.PropertyInfo _property in _propertyInfo) 
      { 
       string _key = String.Empty; 
       string _value = String.Empty; 
       _key = _property.Name.ToString(); 
       _value = (_property.GetValue(myItem, null) != null) ? Convert.ToString(_property.GetValue(myItem, null)) : ""; 
       _propList.Add(new KeyValuePair<string, string>(_key, _value)); 
      } 
      if (_propList.Count > 0) 
      {// Serializing an object's properties 
       System.Web.Script.Serialization.JavaScriptSerializer jsSerializer; 
       jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
       System.Text.StringBuilder _strBuild = new System.Text.StringBuilder(); 
       jsSerializer.Serialize(_propList, _strBuild); 
       return _strBuild.ToString(); 


      } 
      else { return null; } 
     } 
     else { return null; } 
    } 
    catch (Exception excp) 
    { 
     Common.WriteErrorLog(excp.Message); 
     return null; 
    } 
} 
+0

我认为OP在编写CORRECT xml时遇到了麻烦。注意最后两段。一个是“这是我想要的”,另一个是“这就是我得到的” – paqogomez