我从数据库中有一个类和一个查询,在DataSet中填充DataSet。我想用来自DataTable & DataSet的数据填充对象。我怎样才能做到呢?
目的:
public class Marks
{
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;
dataTable.Clear();
if (sqlCommand != null)
{
sqlCommand.Connection.Open();
dataTable.Load(sqlCommand.ExecuteReader());
}
else
sqlDataAdapter.Fill(dataTable);
}需要得到填充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>提示符有人知道怎么做吗?
发布于 2013-12-09 08:15:15
如果我正确地理解了您的问题,那么您在将DataSet写入XML文件时遇到了困难,但是编写标记类类型对象的列表没有问题。
您可以使用反射创建一个可重用的函数,该函数将从任何Datatable中读取Datarow,并将其分配给作为参数传递的任何对象。如果您想要该对象的列表,那么可以遍历DataRows of DataTable。在下面的示例中,我将从一行生成一个对象。(这是一种可重用的映射。)
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序列化程序序列化了这个对象。在您的示例中,下一步是编写一个可以使用xmlSerialization的xml文档,否则我建议使用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;
}
}https://stackoverflow.com/questions/20464947
复制相似问题