c#操作xml文件与数据库配合进行数据导入导出
一、将数据库中内容读取到xml文件中,如下是一个很简单的Demo
1 private static void Main(string[] args) 2 { 3 4 //连接字符串 5 string connStr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 6 string sql = string.Format("select * from dbo.StudentInfo"); 7 DataSet ds = new DataSet(); 8 using (SqlDataAdapter sda = new SqlDataAdapter(sql, connStr)) 9 { 10 sda.Fill(ds); 11 } 12 ds.WriteXml("b.xml");//将读出来的内容写到一个xml文件中 13 Console.WriteLine("执行成功"); 14 Console.ReadKey(); 15 }
其中,DataAdapter主要是在数据源以及DataSet之间执行数据传输的工作,它可以透过Command对象下达命令后将取得
的数据放入到DataSet中,这个对象时架构在Command对象上,并提供了许多配合DataSet的使用功能。DataSet可以看做是一
个暂存区(Cache)可以把从数据库中所查询到的数据保留起来,也可以将整个数据库显示出来,DataSet是放在内存中的,它的能
力不仅仅可以存储多个Table,DataAdapter可以看做是DataSet与数据进行沟通的桥梁,DataSet包含若干个DataTable,DataTable
包含若干个DataRow.
xml文件的格式为:
1 <?xml version="1.0" standalone="yes"?> 2 <NewDataSet> 3 <Table> 4 <StuId>1</StuId> 5 <ClassId>1</ClassId> 6 <LoginName>William</LoginName> 7 <NickName>威廉</NickName> 8 <AddTime>2013-03-23T17:45:40.77+08:00</AddTime> 9 <DelFlag>false</DelFlag> 10 <Remark>我是技术部的一名员工</Remark> 11 </Table> 12 </NewDataSet>
如果不使用DataSet,也可以这样来创建一个xml文件:
1 private static void Main(string[] args) 2 { 3 string connStr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 4 string sql = string.Format("select * from dbo.StudentInfo"); 5 //我们创建的xml文件的根节点是tblStudent,节点属性是id,属性值是StudentInfo 6 XDocument doc = new XDocument(new XElement("tblStudent",new XAttribute("id","StudentInfo"))); 7 XElement root = doc.Root; 8 using (SqlConnection conn = new SqlConnection(connStr)) 9 { 10 using (SqlCommand cmd = new SqlCommand(sql,conn)) 11 { 12 conn.Open(); 13 using (SqlDataReader Reader = cmd.ExecuteReader()) 14 { 15 if (Reader.HasRows) 16 { 17 while (Reader.Read()) 18 { 19 20 int filedCount = Reader.FieldCount; 21 //从根节点下创建元素XElement对象,即展示在页面上就是创建元素,该元素的属性有StuId,值为Reader[0]中的值。 22 //创建的该元素的子元素为ClassId,文本值为Reader[1]的值 23 XElement ele=new XElement("student",new XAttribute("StuId",Reader[0]),new XElement("ClassId",Reader[1])); 24 doc.Root.Add(ele); 25 26 } 27 } 28 } 29 } 30 doc.Save("a.xml");//将所创建的一系列节点保存在a.xml文件中 31 Console.WriteLine("成功"); 32 Console.ReadKey(); 33 } 34 }
在如上所得的代码中,得到的xml文件中的内容为
1 <?xml version="1.0" encoding="utf-8"?> 2 <tblStudent id="StudentInfo"> 3 <student StuId="1"> 4 <ClassId>1</ClassId> 5 </student> 6 </tblStudent>
(二)将xml文件数据读取到数据库中,首先我们来观察一下.xml文件的格式,我只选取了其中几条数据:
1 <?xml version="1.0" encoding="utf-8"?> 2 <Provinces> 3 <Province ID="1" ProvinceName="北京市">北京市</Province> 4 <Province ID="2" ProvinceName="天津市">天津市</Province> 5 <Province ID="3" ProvinceName="河北省">河北省</Province> 6 <Province ID="4" ProvinceName="山西省">山西省</Province> 7 </Provinces>
这里本来应该是三个文件,一个是Cities.xml,一个是Districts.xml,一个是Provinces.xml,由于文件太长,我们只列举一个:
1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Data; 5 using System.Data.SqlClient; 6 using System.Linq; 7 using System.Net.Mime; 8 using System.Text; 9 using System.Threading.Tasks; 10 using System.Xml.Linq; 11 12 namespace aaaaad 13 { 14 internal class Program 15 { 16 private static void Main(string[] args) 17 { 18 ImportDatabase("ProvinceName", "CID", "dbo.AreaFull", "Provinces.xml"); 19 } 20 21 static void ImportDatabase (string s2, string s3, string s4, string filename) //保存的参数需要有节点的属性 22 { 23 string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 24 string sql = string.Format("insert into {0}(AreaName,AreaPid) values(@AreaName,@AreaPid)", s4); 25 XDocument provinceDoc = XDocument.Load(filename);//构造一个xml文档对象 26 XElement provinceroot = provinceDoc.Root;//获取文档对象的根节点 27 //获取根节点下的所有元素,返回的是一个IEnumerable类型的 28 IEnumerable<XElement> eles = provinceroot.Elements(); 29 using (SqlConnection conn = new SqlConnection(connstr)) 30 { 31 conn.Open(); 32 using (SqlCommand cmd = new SqlCommand(sql, conn)) 33 { 34 int count = 0; 35 foreach (var xElement in eles) 36 { 37 cmd.Parameters.Clear(); //因为我们使用的是一个cmd,说明里面的参数是一样的 38 //下面这些参数我们要与数据库进行一一对应 39 string AreaName = xElement.Attribute(s2).Value; //获取xml属性名称为s2的属性值 40 string AreaPid = ""; 41 //如果xml属性名称为s3的属性的属性值为null时进行的操作,其实主要是针对省进行的操作 42 if (xElement.Attribute(s3) == null) 43 { 44 AreaPid = "0"; 45 } 46 else 47 { 48 AreaPid = xElement.Attribute(s3).Value; 49 } 50 SqlParameter[] parameters = 51 { 52 new SqlParameter("@AreaName", AreaName), 53 new SqlParameter("@AreaPid", AreaPid) 54 }; 55 cmd.Parameters.AddRange(parameters); 56 cmd.ExecuteNonQuery(); 57 count++; 58 Console.WriteLine(count); 59 60 } 61 62 } 63 } 64 Console.WriteLine("ok"); 65 Console.ReadKey(); 66 } 67 68 69 } 70 }
在数据库中数据的变化情况如下图:
c#还可以通过htmlDocument操作HTML节点,与c#操作xml有这异曲同工之处,值得注意的是,在我们写代码的时候千万不要按
照我的这种思路写,我只是不想把SQLHelper.cs这个类的代码放进来,很长,我们写这部分代码时应注意的问题是:参数化查询,使
用SQLHelper调用其中的方法,配置连接字符串。