2012年9月18日,星期二
今天遇到一个题目:将数据库表中的数据导出到XML文档!然后再将XML文档导入到数据库!思考了一会,发现有很多方法可以做到,下面一一介绍下吧。。如有任何意见或建议或者有更加简洁的方法,欢迎大家提出。。感激不尽!
方法一:
第一步:首先是在数据库中创建相应的表Person,并插入数据(数据库名为Mydb):
1 create table Person 2 ( 3 id int identity(1,1) primary key, 4 name nvarchar(10), 5 gender nvarchar(1), 6 age int 7 ) 8 go 9 insert into Person(name, gender,age) values('tom,'女',9); 10 go 11 insert into Person(name, gender,age) values('jerry,'女',19); 12 go 13 insert into Person(name, gender,age) values('lily,'女',25); 14 go 15 insert into Person(name, gender,age) values('allen,'男',22);
第二步:新建一个控制台项目,并添加配置文件:
1 <configuration> 2 <connectionStrings> 3 <add name ="constr" connectionString ="server = .;database = Mydb;uid = sa;pwd = xqt;"/> 4 </connectionStrings> 5 </configuration>
第三步:开始读取数据表,并加载到XML文档中:
1 static void Main(string[] args) 2 { 3 string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; 4 string sql = "select * from Person"; 5 XDocument doc = new XDocument(); //新建一个xml文档对象 6 XElement xRoot = new XElement("学生信息"); //根目录,(很重要,如果漏掉此步骤,将提示“未将对象设置到对象引用”); 7 doc.Add(xRoot); 8 using (SqlConnection con = new SqlConnection(constr)) 9 { 10 using (SqlCommand cmd = con.CreateCommand()) 11 { 12 con.Open(); 13 cmd.CommandText = sql; 14 using (SqlDataReader reader = cmd.ExecuteReader()) 15 { 16 if (reader.HasRows) 17 { 18 while (reader.Read()) 19 { 20 int id = reader.GetInt32(0); 21 string name = reader.GetString(1); 22 string gender = reader.GetString(2); 23 int age = reader.GetInt32(3); 24 XElement xm = LoadXML(id, name, gender, age); //调用方法LoadXML 25 xRoot.Add(xm); 26 } 27 } 28 } 29 } 30 } 31 doc.Save("person.xml"); 32 }
第四步:写LoadXML方法:
1 /// <summary> 2 /// 加载XML,返回一个XElement 3 /// </summary> 4 public static XElement LoadXMlement(int id, string name, string gender, int age) 5 { 6 //创建Persons节点,并创建其下子节点:name,gender,age 7 XElement Persons = new XElement("Person"); 8 XElement xname = new XElement("name"); 9 xname.SetValue(name); 10 XElement xgender = new XElement("gender"); 11 xgender.SetValue(gender); 12 XElement xage = new XElement("age"); 13 xage.SetValue(age); 14 //为Person创建一个id属性 15 XAttribute xid = new XAttribute("id", id.ToString()); 16 Persons.Add(xid); 17 //加载Persons 18 Persons.Add(xname, xgender, xage); 19 return Persons; 20 }
第五步:运行项目,在bin\debug\目录下会有一个xml文档:person.xml;
其实,大家可能也发现了,这种方法还可以更简单点:
1 static void Main(string[] args) 2 { 3 //创建xml文档,读取数据并创建xml节点 4 XDocument doc = new XDocument(); 5 //创建根节点 6 XElement root = new XElement("ListOfPerson"); 7 //将根节点加载到xml中 8 doc.Add(root); 9 //读取数据库,创建Person节点,并加载到root中 10 string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; 11 using (SqlConnection con = new SqlConnection(constr)) 12 { 13 using (SqlCommand cmd = con.CreateCommand()) 14 { 15 con.Open(); 16 cmd.CommandText = "select * from person"; 17 using (SqlDataReader reader = cmd.ExecuteReader()) 18 { 19 if (reader.HasRows) 20 { 21 while (reader.Read()) 22 { 23 XElement xPerson = new XElement("Person"); 24 XAttribute id = new XAttribute("id", reader.GetInt32(reader.GetOrdinal("id"))); 25 XElement xName = new XElement("Name", reader.GetString(reader.GetOrdinal("name"))); 26 XElement xGender = new XElement("Gender", reader.GetString(reader.GetOrdinal("gender"))); 27 XElement xAge = new XElement("Age",reader.GetInt32(reader.GetOrdinal("age"))); 28 //加载到xPerson中 29 xPerson.Add(id,xName,xGender,xAge); 30 root.Add(xPerson); 31 } 32 } 33 } 34 } 35 } 36 doc.Save("person.xml"); 37 }
方法二:
本方法才有xml序列化的知识来导出xml文档,简洁有效,而且序列化是一个非常重要的知识点。。需要多练习才能对序列化有更好的掌握!
首先,要使用序列化需要熟悉几个基本步骤:1、要有一个对象;2、创建一个流,用来写入到文档;3、XmlSerialize
1 static void Main(string[] args) 2 { 3 //1、创建一个对象 4 List<Person> list = new List<Person>(); 5 //查询添加数据 6 string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; 7 using (SqlConnection con = new SqlConnection(constr)) 8 { 9 using (SqlCommand cmd = con.CreateCommand()) 10 { 11 con.Open(); 12 cmd.CommandText = "select * from person"; 13 using (SqlDataReader reader = cmd.ExecuteReader()) 14 { 15 if (reader.HasRows) 16 { 17 while (reader.Read()) 18 { 19 list.Add( 20 new Person() 21 { 22 Id = reader.GetInt32(reader.GetOrdinal("id")), 23 Name = reader.GetString(reader.GetOrdinal("name")), 24 Gender = reader.GetString(reader.GetOrdinal("gender")), 25 Age = reader.GetInt32(reader.GetOrdinal("age")) 26 } 27 ); 28 } 29 } 30 } 31 } 32 } 33 using (FileStream file = new FileStream("person.xml", FileMode.Create, FileAccess.Write)) //2、创建一个流 34 { 35 XmlSerializer xml = new XmlSerializer(typeof(List<Person>)); 36 xml.Serialize(file, list); //开始序列化 37 } 38 }