从 SQL Server 2008 生成 XML 并从 XML 更新数据库
如何从 SQL Server 2008 数据库生成 XML 并从 XML 更新数据库。
引言
我的教程将展示如何创建一个 Windows 窗体应用程序,该应用程序能够
- 通过 XML 文件中提供的连接字符串连接到 SQL Server 数据库(这样您只需填写一次连接字符串,就可以让程序在需要时连接到数据库)。
- 在 DataGridView 中显示数据库内容。
- 生成一个包含数据库结构和数据的 XML 文件。
- 从 XML 文件更新数据库。
供参考:
我的数据库结构是
背景
人们应该熟悉 MySQL 查询和 SQL Server 2008。
当我第一次在 C# 中使用 DataSet 和 DataAdapter 时,我完全不明白它到底是什么意思。
在我稍微摸索之后,我意识到我可以把它想象成一种方式,让 C# 读取数据库的结构。就好像你的程序加载了一个 ERD(实体关系图)。
使用代码
首先,我们应该设置我们的窗体。
将以下控件拖放到窗体中:
- 一个 DataGridView
- 三个按钮
- 一个 Label
它可以看起来像这样
此图解释了布局
1. 在 DataGridView 中显示数据库字段
这可以非常动态地完成。
请在此处遵循教程:http://www.youtube.com/watch?v=F_Ycn3Ck9tA。
您也可以使用此代码行将 DataGridView 绑定到数据源
dataGridView1.DataSource = dsSelectSimpluStatic.Tables[0];
其中 dsSelectSimpluStatic 是我们用 DataAdapter 填充的 DataSet,Tables[0] 是我们要在此处放置的表(按索引)。
我们所有的应用程序代码都在这里
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Xml;
using System.Data.Sql;
using System.IO;
using MySql.Data.Types;
namespace TransferDate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
this.persoanaTableAdapter.Fill(this.persoanaTestDataSet.Persoana);
}
static private string GetConnectionString()
{
string Username=null;
string Parola=null;
string BD = null;
DataSet dsConexiune = new DataSet();
dsConexiune.ReadXml("conexiune.xml");
string Server =dsConexiune.Tables["Date"].Rows[0]["Server"].ToString();
Username = dsConexiune.Tables["Date"].Rows[0]["Username"].ToString();
Parola = dsConexiune.Tables["Date"].Rows[0]["Parola"].ToString();
BD = dsConexiune.Tables["Date"].Rows[0]["BazaDate"].ToString();
return "Data Source=" + Server +
";Database="+BD+";User ID=" +
Username + " ;Password=" + Parola;
//return "server=" + Server +
// ";database="+BD+";uid=" +
// Username + " ;pwd=" + Parola;
}
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.InitialDirectory = @"c:\";
fdlg.RestoreDirectory = true;
fdlg.ShowDialog();
string stringconexiune = GetConnectionString();
SqlConnection conexiune = new SqlConnection(stringconexiune);
conexiune.Open();
//string ScriereXML;
SqlCommand incarcaPersoana = new SqlCommand(
"select Nume,Prenume,CNP,Telefon,id_pers from Persoana", conexiune);
DataSet dsPersoana = new DataSet();
SqlDataAdapter daPers = new SqlDataAdapter(
"select Nume,Prenume,CNP,Telefon,id_pers from Persoana", conexiune);
daPers.Fill(dsPersoana);
System.IO.StreamWriter xmlSW1 = new System.IO.StreamWriter(fdlg.FileName);
dsPersoana.WriteXml(xmlSW1, XmlWriteMode.IgnoreSchema);
xmlSW1.Close();
MessageBox.Show("XML generat cu succes!");
conexiune.Close();
}
private void button3_Click(object sender, EventArgs e)
{
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.InitialDirectory = @"c:\";
fdlg.RestoreDirectory = true;
fdlg.ShowDialog();
string stringconexiune = GetConnectionString();
SqlConnection conexiune = new SqlConnection(stringconexiune);
conexiune.Open();
DataSet dsCitireXML = new DataSet();
dsCitireXML.ReadXml(fdlg.FileName, XmlReadMode.ReadSchema);
string updateStr = "update Persoana set Nume=@Nume," +
"Prenume=@Prenume,Telefon=@Telefon,CNP=@CNP where id_pers=@id_pers";
SqlCommand updateCmd = new SqlCommand(updateStr, conexiune);
SqlParameter pTelefon = new SqlParameter();
pTelefon.ParameterName = "@Telefon";
SqlParameter pCNP = new SqlParameter();
pCNP.ParameterName = "@CNP";
SqlParameter pNume = new SqlParameter();
pNume.ParameterName = "@Nume";
SqlParameter pPrenume = new SqlParameter();
pPrenume.ParameterName = "@Prenume";
SqlParameter pid_pers = new SqlParameter();
pid_pers.ParameterName = "@id_pers";
updateCmd.Parameters.Add(pNume);
updateCmd.Parameters.Add(pPrenume);
updateCmd.Parameters.Add(pTelefon);
updateCmd.Parameters.Add(pCNP);
updateCmd.Parameters.Add(pid_pers);
for(int i=0;i<dsCitireXML.Tables["Table"].Rows.Count;i++)
{
pNume.Value = dsCitireXML.Tables["Table"].Rows[i]["Nume"];
pPrenume.Value = dsCitireXML.Tables["Table"].Rows[i]["Prenume"];
pCNP.Value = dsCitireXML.Tables["Table"].Rows[i]["CNP"];
pTelefon.Value = dsCitireXML.Tables["Table"].Rows[i]["Telefon"];
pid_pers.Value = dsCitireXML.Tables["Table"].Rows[i]["id_pers"];
updateCmd.ExecuteNonQuery();
}
conexiune.Close();
}
}
}
现在让我们来解释一下
- 我们添加 XML 和 MySQL 引用
- 编写连接到我们数据库的代码。
- 我们首先编写一个函数来从 XML 获取连接字符串
- 之后,我们将连接字符串传输到我们所有的函数中,这样我们就无需重新登录数据库。
- 接下来编写生成 XML 的文本。
- 我们编写通过 XML 更新数据库的代码。
using System.Data.SqlClient;
using System.Xml;
在声明了我们的变量之后,我们将我们的连接 XML(conexiune.xml)数据读入我们的数据集。(1)
现在我们访问数据集中的数据,所以我们将其赋给连接字符串的变量。我们访问数据集中的表(因为数据集基本上是编程语言中的 ERD,它由表和它们之间的关系组成)。在这种情况下,我们只有一个名为“Persoana”(英语为 Person)的表,并且在我们的 XML 中,我们的第一个树的名称是“Date”(英语为 Data)。所以我们基本上是在告诉我们的程序查找从我们的 XML 中读取的名为“Date”的表。行(rows)与我们想象的关系数据库结构的概念相同,所以属性(attributes)就是我们的行,我们想从行中获取连接数据而不是列(columns)(如果我们想要所有的服务器或所有的数据库或同一种东西的集合,那么列就是这样,但这在这里不适用)。唯一有效的索引是“0”,我假设是因为在 XML 结构中,“Date”占据的索引是“0”(不确定)。括号中的“Server”、“Username”等是我想访问其值的 XML 标签的名称。最后,我将所有内容都转换为.ToString()
,因为我的左侧是字符串。(2)
最后,我们返回我们的连接字符串。(3)
static private string GetConnectionString() {
//these are the variables used for containing the username,password(Parola) and Database Name(B//D)(1)
string Username=null;
string Parola=null;
string BD = null;
//we declare our DataSet for our connection
DataSet dsConexiune = new DataSet();
dsConexiune.ReadXml("conexiune.xml");
//here we acces the tables(2)
string Server =dsConexiune.Tables["Date"].Rows[0]["Server"].ToString();
Username = dsConexiune.Tables["Date"].Rows[0]["Username"].ToString();
Parola = dsConexiune.Tables["Date"].Rows[0]["Parola"].ToString();
BD = dsConexiune.Tables["Date"].Rows[0]["BazaDate"].ToString();
//(3)
return "Data Source="+Server + ";Database="+BD+";User ID="+Username + " ;Password=" + Parola;
}
conexiune.xml 是我们包含连接设置的 XML 文档。
在这行代码中,我们通过访问 XML 来分配服务器名称。
string Server =dsConexiune.Tables["Date"].Rows[0]["Server"].ToString();
“Date”是我拥有的 XML 树的名称,“Server”是我想要访问的值的名称。
这是连接 XML 外观的截图
为了更多的用户交互,我们使用 OpenFileDialog 向程序提供一个 XML 地址,以便写入数据。(1)
我们打开数据库连接。(2)
打开数据库连接后,我们声明一个 SQL 命令(incarcaPersoana=loadPerson)来通过我们的数据库连接(conexiune)从我们的 Persoana(Person)表中选择 Name、Surname、CNP、Telephone 和 id_pers(唯一标识符)。我们继续声明另一个用于 Person 的数据集。SqlAdapter 就像是你告诉它你想从数据库加载什么到数据集中的人。就像给一个人指示如何制作健康的早餐一样。
我可以在 SqlDataAdapter
的参数中放入 incarcaPersoana 命令,或者只将其声明为字符串(两者都应该可以工作)。Fill 方法用于填充我们的数据集。
所以现在我正在管理从数据库到 XML 文件的信息。
使用 StreamWriter
,我将数据库结构和数据写入程序开头通过 FileDialog
提供的 XML 文件的地址。使用数据集的 WriteXml
方法,我生成 XML 文件。在程序结束时,我显示一条消息,表示 XML 文件已成功生成(“XML generat cu succes!”)。然后我关闭数据库连接。(3)
private void button2_Click(object sender, EventArgs e)
{
//(1)
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.InitialDirectory = @"c:\";
fdlg.RestoreDirectory = true;
fdlg.ShowDialog();
//(2)
string stringconexiune = GetConnectionString();
SqlConnection conexiune = new SqlConnection(stringconexiune);
//(3)
conexiune.Open();
//string ScriereXML;
SqlCommand incarcaPersoana = new SqlCommand(
"select Nume,Prenume,CNP,Telefon,id_pers from Persoana", conexiune);
DataSet dsPersoana = new DataSet();
SqlDataAdapter daPers = new SqlDataAdapter(
"select Nume,Prenume,CNP,Telefon,id_pers from Persoana", conexiune);
daPers.Fill(dsPersoana);
System.IO.StreamWriter xmlSW1 = new System.IO.StreamWriter(fdlg.FileName);
dsPersoana.WriteXml(xmlSW1, XmlWriteMode.IgnoreSchema);
xmlSW1.Close();
MessageBox.Show("XML generat cu succes!");
conexiune.Close();
}
我们再次通过打开 FileDialog 来选择我们的 XML 源文件(记住!XML 必须与您的数据库结构相同 -> 否则将无法工作)。(1)
然后我们像以前一样连接到我们的数据库。(2)
这次我们要更新我们的数据库。当存在外键时,这可能会变得困难,因为外键不能被覆盖。所以基本上我构造了一个参数化查询,其中我不更新我的 id_pers 外键,我只是用它来遍历数据库。(3)
SqlCommand 之后的内容是如何进一步声明我们的参数。我们实例化它们并给它们命名。(4)
现在,这些参数中的每一个都需要以某种方式链接到我们之前的更新命令,所以这就是代码。(5)
之后,我们遍历数据集中的每一行并更新数据库(nonquery 用于在数据库上执行的命令)。最后,我们关闭连接。(6)
private void button3_Click(object sender, EventArgs e)
{
//(1)
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.InitialDirectory = @"c:\";
fdlg.RestoreDirectory = true;
fdlg.ShowDialog();
//(2)
string stringconexiune = GetConnectionString();
SqlConnection conexiune = new SqlConnection(stringconexiune);
conexiune.Open();
//(3)
DataSet dsCitireXML = new DataSet();
dsCitireXML.ReadXml(fdlg.FileName, XmlReadMode.ReadSchema);
string updateStr = "update Persoana set Nume=@Nume," +
"Prenume=@Prenume,Telefon=@Telefon,CNP=@CNP where id_pers=@id_pers";
SqlCommand updateCmd = new SqlCommand(updateStr, conexiune);
//(4)
SqlParameter pTelefon = new SqlParameter();
pTelefon.ParameterName = "@Telefon";
SqlParameter pCNP = new SqlParameter();
pCNP.ParameterName = "@CNP";
SqlParameter pNume = new SqlParameter();
pNume.ParameterName = "@Nume";
SqlParameter pPrenume = new SqlParameter();
pPrenume.ParameterName = "@Prenume";
SqlParameter pid_pers = new SqlParameter();
pid_pers.ParameterName = "@id_pers";
//(5)
updateCmd.Parameters.Add(pNume);
updateCmd.Parameters.Add(pPrenume);
updateCmd.Parameters.Add(pTelefon);
updateCmd.Parameters.Add(pCNP);
updateCmd.Parameters.Add(pid_pers);
//(6)
for(int i=0;i<dsCitireXML.Tables["Table"].Rows.Count;i++)
{
pNume.Value = dsCitireXML.Tables["Table"].Rows[i]["Nume"];
pPrenume.Value = dsCitireXML.Tables["Table"].Rows[i]["Prenume"];
pCNP.Value = dsCitireXML.Tables["Table"].Rows[i]["CNP"];
pTelefon.Value = dsCitireXML.Tables["Table"].Rows[i]["Telefon"];
pid_pers.Value = dsCitireXML.Tables["Table"].Rows[i]["id_pers"];
updateCmd.ExecuteNonQuery();
}
conexiune.Close();
}
希望这对您的项目有所帮助。
玩得开心:)