使用wpf开发数据库管理工具(二)

上一节我们简单的搭建了一个wpf应用,进行数据库开发,并且搭建了一个简单的程序界面,尝试了一下数据库连接的操作,这一节,我们开始逐步深入的通过C#进行MySQL数据库的使用。

使用配置文件

为了方便以后的程序扩展,我们使用配置文件来进行数据库连接参数的设定,通过使用配置文件有一个好处,就是可以在不需要重新编译程序的前提下进行程序参数的改变。程序配置文件一般使用文本文件txt、ini、xml等等,我们这里使用xml文件的形式来记录用于连接数据库的参数,文件内容格式如下:

<?xml version="1.0" encoding="utf-8" ?> <DataBaseSetting> <Data-Source>127.0.0.1</Data-Source> <Database>mysql</Database> <User-ID>root</User-ID> <Password>server</Password> <Charset>utf8</Charset> <Port>3306</Port> </DataBaseSetting>
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8" ?>
<DataBaseSetting>
    <Data-Source>127.0.0.1</Data-Source>
    <Database>mysql</Database>
    <User-ID>root</User-ID>
    <Password>server</Password>
    <Charset>utf8</Charset>
    <Port>3306</Port>
</DataBaseSetting>

文件内记录了用于连接数据库的IP地址、用户、密码、数据库字符集编码、端口、数据库名称(可有可无),我们可以根据自己的需要增加需要的数据连接字段,通过这种方法,我们可以不用再次编译程序就可以修改连接的数据库,同时也可以用来保存程序的设置参数等。

我们写好了配置文件,下面来在自定义的数据库工具类中来读取参数并进行保存在对应的字段中,读取方法如下,首先我们先定义用于接收的变量,主要是为了方便进行调用,不用每次需要的时候都去读取配置文件:

private static XmlNode database = null; //数据库 string xmlFilePath = @"config\DataBase.xml"; string connectionStr = "Data Source="; string connectSTR = "Data Source="; //连接MySQL,不指定数据库 string dataSourceIP = ""; //数据库连接地址 string dataPort = ""; //端口 string dataCharset = ""; //字符集编码 string dataUserID = ""; //用户名 string dataPassword = ""; //密码 /// <summary> /// 如果没有数据库则创建 /// </summary> private void GetDataSource() { if (File.Exists(xmlFilePath)) { XmlDocument doc = new XmlDocument(); doc.Load(xmlFilePath); XmlNode dataSource = doc.SelectSingleNode("/DataBaseSetting/Data-Source").FirstChild; XmlNode dataSourcePort = doc.SelectSingleNode("/DataBaseSetting/Port").FirstChild; dataSourceIP = dataSource.Value.ToString(); //数据库连接地址 dataPort = dataSourcePort.Value.ToLower(); //端口 connectionStr += dataSource.Value + ";Port="; connectionStr += dataSourcePort.Value + ";Database="; connectSTR += dataSource.Value + ";Port="; connectSTR += dataSourcePort.Value + ";User ID="; database = doc.SelectSingleNode("/DataBaseSetting/Database").FirstChild; connectionStr += database.Value + ";User ID="; XmlNode userID = doc.SelectSingleNode("/DataBaseSetting/User-ID").FirstChild; dataUserID = userID.Value.ToLower(); //用户名 connectionStr += userID.Value + ";Password="; connectSTR += userID.Value + ";Password="; XmlNode Passwd = doc.SelectSingleNode("/DataBaseSetting/Password").FirstChild; dataPassword = Passwd.Value.ToString(); //密码 connectionStr += Passwd.Value + ";Charset="; connectSTR += Passwd.Value + ";Charset="; XmlNode charset = doc.SelectSingleNode("/DataBaseSetting/Charset").FirstChild; dataCharset = charset.Value.ToString(); //字符集编码 connectionStr += charset.Value; connectSTR += charset.Value; MyDataHelper.connectionString = connectSTR; string sqlDataBase = "create database if not exists " + database.Value + " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"; try { connectionStay = new MySqlConnection(connectSTR); ExecuteNonQuery(sqlDataBase, CommandType.Text, null); MyDataHelper.connectionString = connectionStr; //设置连接字符串 connectionStay.Close(); connectionStay.Dispose(); connectionStay = null; } catch (Exception ex) { MyDataHelper.connectionString = ""; //设置连接字符串 throw ex; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
private static XmlNode database = null; //数据库
string xmlFilePath = @"config\DataBase.xml";
string connectionStr = "Data Source=";
string connectSTR = "Data Source=";     //连接MySQL,不指定数据库
string dataSourceIP = "";       //数据库连接地址
string dataPort = "";           //端口
string dataCharset = "";        //字符集编码
string dataUserID = "";         //用户名
string dataPassword = "";         //密码
 
/// <summary>
/// 如果没有数据库则创建
/// </summary>
private void GetDataSource()
{
if (File.Exists(xmlFilePath))
{
XmlDocument doc = new XmlDocument();
doc.Load(xmlFilePath);
XmlNode dataSource = doc.SelectSingleNode("/DataBaseSetting/Data-Source").FirstChild;
XmlNode dataSourcePort = doc.SelectSingleNode("/DataBaseSetting/Port").FirstChild;
dataSourceIP = dataSource.Value.ToString();     //数据库连接地址
dataPort = dataSourcePort.Value.ToLower();      //端口
connectionStr += dataSource.Value + ";Port=";
connectionStr += dataSourcePort.Value + ";Database=";
connectSTR += dataSource.Value + ";Port=";
connectSTR += dataSourcePort.Value + ";User ID=";
 
database = doc.SelectSingleNode("/DataBaseSetting/Database").FirstChild;
connectionStr += database.Value + ";User ID=";
 
XmlNode userID = doc.SelectSingleNode("/DataBaseSetting/User-ID").FirstChild;
dataUserID = userID.Value.ToLower();            //用户名
connectionStr += userID.Value + ";Password=";
connectSTR += userID.Value + ";Password=";
 
XmlNode Passwd = doc.SelectSingleNode("/DataBaseSetting/Password").FirstChild;
dataPassword = Passwd.Value.ToString();         //密码
connectionStr += Passwd.Value + ";Charset=";
connectSTR += Passwd.Value + ";Charset=";
 
XmlNode charset = doc.SelectSingleNode("/DataBaseSetting/Charset").FirstChild;
dataCharset = charset.Value.ToString();         //字符集编码
connectionStr += charset.Value;
connectSTR += charset.Value;
 
MyDataHelper.connectionString = connectSTR;
string sqlDataBase = "create database if not exists " + database.Value + " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
try
{
connectionStay = new MySqlConnection(connectSTR);
ExecuteNonQuery(sqlDataBase, CommandType.Text, null);
MyDataHelper.connectionString = connectionStr;       //设置连接字符串
connectionStay.Close();
connectionStay.Dispose();
connectionStay = null;
}
catch (Exception ex)
{
MyDataHelper.connectionString = "";       //设置连接字符串
throw ex;
}
}
}

函数GetDataSource()中进行了xml文件的读取操作,并且进行数据库连接字符串的拼接,同时创建了配置文件里面定义的数据库(如果该数据库不存在的情况下),连接完数据库后就把连接关闭了,避免资源滥用。

我们下面再定义一个函数来组装数据库连接字符串,主要作用是可以定义需要连接的数据库,而不是固定的连接某个数据库,通过下面的方法,我们可以传递数据库名来选择连接到某个数据库中去:

/// <summary> /// 获取数据库连接字符串 /// </summary> /// <param name="dataBase"></param> /// <returns></returns> public string GetConnectString(string dataBaseStr = "") { if (dataSourceIP.Equals("")) { GetDataSource(); } if (dataBaseStr.Equals("")) { return "Data Source=" + dataSourceIP + ";Port=" + dataPort + ";User ID=" + dataUserID + ";Password=" + dataPassword + ";Charset=" + dataCharset; } else { return "Data Source=" + dataSourceIP + ";Database=" + dataBaseStr + ";Port=" + dataPort + ";User ID=" + dataUserID + ";Password=" + dataPassword + ";Charset=" + dataCharset; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// <summary>
/// 获取数据库连接字符串
/// </summary>
/// <param name="dataBase"></param>
/// <returns></returns>
public string GetConnectString(string dataBaseStr = "")
{
if (dataSourceIP.Equals(""))
{
GetDataSource();
}
if (dataBaseStr.Equals(""))
{
return "Data Source=" + dataSourceIP + ";Port=" + dataPort + ";User ID=" + dataUserID + ";Password=" +
dataPassword + ";Charset=" + dataCharset;
}
else
{
return "Data Source=" + dataSourceIP + ";Database=" + dataBaseStr + ";Port=" + dataPort + ";User ID=" + dataUserID +
";Password=" + dataPassword + ";Charset=" + dataCharset;
}
}

注:为了解决后期读取MySQL数据库的数据事出现无法把时间日期转换为System.DateTime的错误,可以在数据库连接字符串后添加以下字符:";Allow Zero Datetime=True"。

显示数据库

我们已经完成了数据库的连接配置,下面来进行连接MySQL数据库后,列出当前MySQL数据库下有多少个数据库,听起来好像有点拗口,命名已经连接了数据库,怎么数据库下面还有数据库。我们可以简单的认为我们安装的MySQL数据库是一个大型的数据集,在这个数据集下面,我们可以创建很多个数据库,每一个数据库都可以指定特定的用户来访问,我们在连接时如果没有指定数据库的话,就是连接在这个数据集中,但必须要以根用户root连接,因为该用户拥有这个数据集下的所有权限(如果你创建的用户拥有root的权限,也可以登录,但不推荐创建这样的用户)。

下面,我们创建一个数据库连接后,使用数据库语句“SHOW  DATABASES;”来显示所有的数据库:

/// <summary> /// 显示数据库列表 /// </summary> /// <returns></returns> public DataSet GetAllDataBase() { DataSet dataSet = null; string sql = "SHOW DATABASES; "; if (MyDataHelper.connectionString.Equals("")) { GetDataSource(); } MyDataHelper.connectionString = GetConnectString(); //用于连接数据库,获取数据库列表 if (!MyDataHelper.connectionString.Equals("")) { try { connectionStay = new MySqlConnection(MyDataHelper.connectionString); dataSet = GetDataSet(sql, CommandType.Text, null); } catch (Exception ex) { throw ex; } finally { connectionStay.Close(); connectionStay.Dispose(); connectionStay = null; } } return dataSet; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/// <summary>
/// 显示数据库列表
/// </summary>
/// <returns></returns>
public DataSet GetAllDataBase()
{
DataSet dataSet = null;
string sql = "SHOW DATABASES; ";
if (MyDataHelper.connectionString.Equals(""))
{
GetDataSource();
}
MyDataHelper.connectionString = GetConnectString();         //用于连接数据库,获取数据库列表
if (!MyDataHelper.connectionString.Equals(""))
{
try
{
connectionStay = new MySqlConnection(MyDataHelper.connectionString);
dataSet = GetDataSet(sql, CommandType.Text, null);
}
catch (Exception ex) { throw ex; }
finally
{
connectionStay.Close();
connectionStay.Dispose();
connectionStay = null;
}
}
return dataSet;
}

执行结果如下图所示:

使用wpf开发数据库管理工具(二)

可以看到,我们已经读取到MySQL数据集下的所有数据库,其中数据库mysql、*_schema是MySQL数据库在安装时候自行创建的,不能删除,否则会导致无法连接MySQL数据库。

显示数据库下的表

下拉框中已经存储了数据库列表,下面我们可以根据数据库语句“SHOW TABLES;”来获取指定数据库下的表,这时候,需要使用到前面定义的GetConnectString("数据库名")函数了,传递我们需要读取的数据库名称作为参数,重新连接数据库,连接成功后执行语句,获取该数据库下所有表,执行结果如下:

使用wpf开发数据库管理工具(二)

以上操作代码已经提交到了github仓库中,克隆下来后,可以根据日志来检出对应的代码来一步步查看。

基本的查询数据库表

下面我们使用数据库查询语句来读取数据库表的数据以及该数据库表的字段数据结构:

#MySQL取得一个表的列名方法有以下几种: DESCRIBE TableName; #缩写为:DESC TableName SHOW COLUMNS FROM TableName; select COLUMN_NAME from information_schema.columns where table_name='TableName'; #查询数据表的所有数据 SELECT * FROM TableName; #或查询前几条 SELECT * FROM TableName LIMIT 100;
1
2
3
4
5
6
7
8
#MySQL取得一个表的列名方法有以下几种:
DESCRIBE TableName;    #缩写为:DESC TableName
SHOW COLUMNS FROM TableName;
select COLUMN_NAME from information_schema.columns where table_name='TableName';
#查询数据表的所有数据
SELECT * FROM TableName;
#或查询前几条
SELECT * FROM TableName LIMIT 100;

具体查询结构如下图所示:

使用wpf开发数据库管理工具(二)

下一节,我们开始进行MySQL数据库的详细操作。