OK, 这4个方法单独用都可以,谢谢大家,但是有些问题啊,比如如果这样: 1. 用Fill把database里的数据放到dataset ds里; 2. 把dataset ds用writeXML 写进xml里; 3. 重新创建一个dataset dsNew,然后用ReadXML读之前生成的xml; 4. 问题出现在这里,当需要把dsNew写进database里,就会出现各种各样的问题,不信你们有database的可以test下,我是这样test的:class Program{static void Main() { // Step 1: Write data to DataSet from Database. DataSet ds = new DataSet(); string connString = "Data Source= MyAccount\\SQLEXPRESS;Initial Catalog=DBTest1;Integrated Security=SSPI;"; SqlConnection conn = new SqlConnection(connString); conn.Open(); SqlDataAdapter dAdapt = new SqlDataAdapter("SELECT * FROM User Where UserID='a'", conn); dAdapt.FillSchema(ds, SchemaType.Source, "User"); dAdapt.Fill(ds, "svt1_User");// Step 2: write DataSet to XML. ds.WriteXml("svt1_User.xml", XmlWriteMode.WriteSchema);// Step 3: Write XML to New Dataset. DataSet newDS = new DataSet(); newDS.ReadXml("User.xml", XmlReadMode.ReadSchema); newDS.Tables[0].Rows[0]["Score"] = 212; newDS.WriteXml("svt1_User_new.xml", XmlWriteMode.WriteSchema);// Step 4: Write DataSet to Database. dAdapt.UpdateCommand = new SqlCommandBuilder(dAdapt).GetUpdateCommand(); dAdapt.Update(newDS, "User"); conn.Close(); } } 里面我做过各种更改,但是相应的出过各种error, 比如“object reference not set to an instance of an object”, “violation of primary key constraint. Cannot insert duplicate key in object”, “update requires a valid updatecommand when passed datarow collection with modified rows”。 ><... 我觉得问题可能是我创建了一个新的dataset dsNew。 到底怎么把xml装进dataset里之后把这个dataset直接update去database(sql server)??
// Step 1: Write data to DataSet from Database. DataSet ds = new DataSet(); string connString = "Data Source= MyAccount\\SQLEXPRESS;Initial Catalog=DBTest1;Integrated Security=SSPI;"; SqlConnection conn = new SqlConnection(connString); conn.Open(); SqlDataAdapter dAdapt = new SqlDataAdapter("SELECT * FROM [User] where UserID='a'", conn); //dAdapt.FillSchema(ds, SchemaType.Source,"[User]"); dAdapt.Fill(ds, "svt1_User"); // Step 2: write DataSet to XML. ds.WriteXml("svt1_User.xml", XmlWriteMode.WriteSchema); // Step 3: Write XML to New Dataset. DataSet newDS = new DataSet(); newDS.ReadXml("svt1_User.xml", XmlReadMode.ReadSchema); newDS.Tables["svt1_User"].AcceptChanges(); newDS.Tables["svt1_User"].Rows[0]["Score"] = 212; newDS.WriteXml("svt1_User_new.xml", XmlWriteMode.WriteSchema);
// Step 4: Write DataSet to Database. dAdapt.UpdateCommand = new SqlCommandBuilder(dAdapt).GetUpdateCommand(); int i = dAdapt.Update(newDS, "svt1_User"); conn.Close(); 读取后记得newDS.Tables["svt1_User"].AcceptChanges(); 还有你那句dAdapt.FillSchema(ds, SchemaType.Source,"[User]");没啥用处
int i = dAdapt.Update(newDS, "svt1_User");这里int i可以删掉,我调试的时候用的。。
使用 DataSet的WriteXML方法,将DataSet的数据写入XML
使用 DataSet的ReadXML方法,将XML数据写入DataSet
使用 DataAdapter的Update方法,将DataSet中的数据保存数据库
4. 把dataset的数据写回到database里?
ADO.NET对象的操作,百度一下,一大堆。
对于对XML文件的操作,给你个Demo,使用XmlDocument对象来处理。mlDocument xmldoc;
XmlNode xmlnode;
public void save()
{
string path="c:\\reminder.xml";
if (!File.Exists(path))
{
xmldoc = new XmlDocument();
//加入XML的声明段落
xmlnode = xmldoc.CreateNode ( XmlNodeType.XmlDeclaration , "" , "" ) ;
xmldoc.AppendChild ( xmlnode ) ;
//加入一个根元素
XmlElement r = xmldoc.CreateElement("r");
XmlElement l = xmldoc.CreateElement("location");
XmlElement x = xmldoc.CreateElement("locationX");
XmlElement y = xmldoc.CreateElement("locationY");
XmlText xValue = xmldoc.CreateTextNode("1000");
x.AppendChild(xValue);
XmlText yValue = xmldoc.CreateTextNode("200");
y.AppendChild(yValue);
l.AppendChild(x);
l.AppendChild(y);
r.AppendChild(l);
//加入另外一个元素
XmlElement text = xmldoc.CreateElement("text");
XmlElement size = xmldoc.CreateElement("size");
XmlElement color = xmldoc.CreateElement("color");
XmlElement t = xmldoc.CreateElement("txt");
XmlText sizeValue = xmldoc.CreateTextNode("30");
size.AppendChild(sizeValue);
XmlText colorValue = xmldoc.CreateTextNode("Black");
color.AppendChild(colorValue);
XmlText txtValue = xmldoc.CreateTextNode("");
t.AppendChild(txtValue);
text.AppendChild(size);
text.AppendChild(color);
text.AppendChild(t);
r.AppendChild(text);
//加入另外一个元素
xmldoc.AppendChild ( r ) ;
try {
xmldoc.Save (path ) ;
}
catch ( Exception e ) {
//显示错误信息
Console.WriteLine ( e.Message ) ;
}
}
}
ds.ReadXml(Stream s);有现成的方法供你调用.
1. 用Fill把database里的数据放到dataset ds里;
2. 把dataset ds用writeXML 写进xml里;
3. 重新创建一个dataset dsNew,然后用ReadXML读之前生成的xml;
4. 问题出现在这里,当需要把dsNew写进database里,就会出现各种各样的问题,不信你们有database的可以test下,我是这样test的:class Program{static void Main()
{
// Step 1: Write data to DataSet from Database.
DataSet ds = new DataSet();
string connString = "Data Source= MyAccount\\SQLEXPRESS;Initial Catalog=DBTest1;Integrated Security=SSPI;";
SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlDataAdapter dAdapt = new SqlDataAdapter("SELECT * FROM User Where UserID='a'", conn);
dAdapt.FillSchema(ds, SchemaType.Source, "User");
dAdapt.Fill(ds, "svt1_User");// Step 2: write DataSet to XML.
ds.WriteXml("svt1_User.xml", XmlWriteMode.WriteSchema);// Step 3: Write XML to New Dataset.
DataSet newDS = new DataSet();
newDS.ReadXml("User.xml", XmlReadMode.ReadSchema);
newDS.Tables[0].Rows[0]["Score"] = 212;
newDS.WriteXml("svt1_User_new.xml", XmlWriteMode.WriteSchema);// Step 4: Write DataSet to Database.
dAdapt.UpdateCommand = new SqlCommandBuilder(dAdapt).GetUpdateCommand();
dAdapt.Update(newDS, "User");
conn.Close();
}
}
里面我做过各种更改,但是相应的出过各种error,
比如“object reference not set to an instance of an object”,
“violation of primary key constraint. Cannot insert duplicate key in object”,
“update requires a valid updatecommand when passed datarow collection with modified rows”。
><...
我觉得问题可能是我创建了一个新的dataset dsNew。
到底怎么把xml装进dataset里之后把这个dataset直接update去database(sql server)??
// Step 1: Write data to DataSet from Database.
DataSet ds = new DataSet();
string connString = "Data Source= MyAccount\\SQLEXPRESS;Initial Catalog=DBTest1;Integrated Security=SSPI;";
SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlDataAdapter dAdapt = new SqlDataAdapter("SELECT * FROM [User] where UserID='a'", conn);
//dAdapt.FillSchema(ds, SchemaType.Source,"[User]");
dAdapt.Fill(ds, "svt1_User"); // Step 2: write DataSet to XML.
ds.WriteXml("svt1_User.xml", XmlWriteMode.WriteSchema); // Step 3: Write XML to New Dataset.
DataSet newDS = new DataSet();
newDS.ReadXml("svt1_User.xml", XmlReadMode.ReadSchema);
newDS.Tables["svt1_User"].AcceptChanges();
newDS.Tables["svt1_User"].Rows[0]["Score"] = 212;
newDS.WriteXml("svt1_User_new.xml", XmlWriteMode.WriteSchema);
// Step 4: Write DataSet to Database.
dAdapt.UpdateCommand = new SqlCommandBuilder(dAdapt).GetUpdateCommand();
int i = dAdapt.Update(newDS, "svt1_User");
conn.Close();
读取后记得newDS.Tables["svt1_User"].AcceptChanges();
还有你那句dAdapt.FillSchema(ds, SchemaType.Source,"[User]");没啥用处
当你 知道DataBase DataTable XML 大概是个什么结构的时候 就知道怎么转换了直接查 MSDN 这种代码 学学 就知道怎么写了
谢啦~加了AcceptChanges()就可以了,但是还有一种情况我怎么是也不行,就是直从xml里读数据,然后直接update database,我是这么试的:string connString = "Data Source= MyAccount\\SQLEXPRESS;Initial Catalog=DBTest1;Integrated Security=SSPI;";
SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [svt1_User] WHERE UserID='a'", conn);
DataSet ds = new DataSet();
ds.ReadXML("svt1_User.xml", XmlReadMode.ReadSchema);
ds.Tables["svt1_User"].AcceptChanges();da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand();
da.Update(ds, "svt1_User");
conn.Close();
运行OK,但是没有update到database,是不是少了什么呢?
有考虑过用其他的数据结构,但是如果程序结束而且没有网络连接的时候,数据就无法保存了,所以我要用到xml...
你要明白AcceptChanges这个方法的作用到底是什么别什么都照搬。。