友情链接:.NET项目开发者博客

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调用其中的方法,配置连接字符串。

 

        

posted @ 2013-05-09 00:03  千年老妖  Views(3836)  Comments(0Edit  收藏  举报
友情链接:.NET项目开发者博客