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