从 Visual C# 连接到 MySQL






4.91/5 (27投票s)
使用 Visual C# 2008 连接 MySQL 5.1 数据库,并使用 MySQL Connector/NET 5.1.7
引言
本文的主要目的是分享代码,并介绍使用 C# 创建和连接 MySQL 数据库的一些基本原理。您可能会找到许多使用 ODBC 驱动程序连接 MySQL 数据库的示例,但在这里我们将使用 MySQL Connector/NET 5.1.7。使用的 DBMS 是 MySQL Server 5.1.31 社区版。
正如您可能已经知道的,MySQL 是互联网上最广泛使用的开源关系数据库管理系统之一。它速度快、易于使用且免费。您可以 在此处 下载。如果您是第一次下载 MySQL,请同时下载 MySQL GUI Tools,最重要的是,下载 MySQL Connector/NET 5.1,它将允许您从 C# 连接到您创建的任何 MySQL 数据库。如果您在安装方面需要帮助,请按照网站上提供的说明进行操作。
在 MySQL 中创建数据库
我将简要说明如何创建一个简单的数据库。首先,启动 MySQL 命令行客户端,然后输入在安装过程中设置的密码。之后,您会在窗口中看到 mysql>
命令提示符。尝试输入以下命令,看看会发生什么
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) mysql>
这指示 MySQL 列出您的用户会话拥有权限的所有数据库。现在让我们输入以下命令来创建数据库
mysql> CREATE DATABASE shop; Query OK, 1 row affected (0.00 sec) mysql> USE shop; Database changed mysql> CREATE TABLE article ( -> article_id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> article_name VARCHAR(50), -> article_price DOUBLE(16, 2), -> PRIMARY KEY (article_id) -> ); Query OK, 0 rows affected (0.03 sec) mysql> DESCRIBE article; +---------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------------+------+-----+---------+----------------+ | article_id | int(10) unsigned | NO | PRI | NULL | auto_increment | | article_name | varchar(50) | YES | | NULL | | | article_price | double(16,2) | YES | | NULL | | +---------------+------------------+------+-----+---------+----------------+ 3 rows in set (0.05 sec) mysql> INSERT INTO article (article_name, article_price) -> VALUES ('PhotoPC XYZ Camera', 899.00); Query OK, 1 row affected (0.03 sec) mysql> SELECT * FROM article; +------------+--------------------+---------------+ | article_id | article_name | article_price | +------------+--------------------+---------------+ | 1 | PhotoPC XYZ Camera | 899.00 | +------------+--------------------+---------------+ 1 row in set (0.00 sec) mysql>
这里需要注意几点:创建数据库后,默认情况下它不会被选中;我们需要使用 USE <database-name>
语句显式选择它。我们一次输入一个命令。
对于表创建,我在这里使用的约定是:(1) 表名使用单数;(2) 列名使用小写字符;(3) 列名中的单词用下划线分隔;(4) 每个字段都以其所属的表名作为前缀;(5) 主键的命名方式是在表名后附加 "_id"
。您还将看到我用于描述表结构、向表中插入数据和查询表的其他命令。
MySQL 中的存储过程不允许使用 USE
语句,因为它们只在其创建的数据库中运行。SELECT DATABASE()
语句用于确保我们正在使用 shop 数据库。实际上,这并不是选择要使用的数据库。在编写存储过程时,我们还需要指定一个分隔符,因为行是以分号结尾的。
mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | shop | +------------+ 1 row in set (0.00 sec) mysql> DELIMITER $$ mysql> CREATE PROCEDURE append_data -> (IN param_name VARCHAR(50), IN param_price DOUBLE(16, 2)) -> BEGIN -> DECLARE var_name VARCHAR(50); -> DECLARE var_price DOUBLE(16, 2); -> SET var_name = param_name; -> SET var_price = param_price; -> INSERT INTO article (article_name, article_price) -> VALUES (var_name, var_price); -> END; $$ Query OK, 0 rows affected (0.08 sec) mysql> DELIMITER ; mysql> CALL append_data ('ABC 1200 Scanner', 299.00); Query OK, 1 row affected (0.03 sec) mysql> SELECT * FROM article; +------------+--------------------+---------------+ | article_id | article_name | article_price | +------------+--------------------+---------------+ | 1 | PhotoPC XYZ Camera | 899.00 | | 2 | ABC 1200 Scanner | 299.00 | +------------+--------------------+---------------+ 2 rows in set (0.00 sec) mysql>
现在我们可以开始用 C# 编码了。在下一节中,我将向您展示如何构建连接字符串以建立到数据库的连接。
从 C# 连接到数据库
让我们能够在 C# 中使用任何 MySQL 数据库中的数据,这需要引用 MySql.Data 程序集,它在 MySQL Connector/NET 安装后会注册到全局程序集缓存中。首先,在 Visual C# 中创建一个新的控制台应用程序项目。您可以将其命名为 MySQLDBConnection 或您决定的任何名称。现在,在 Visual C# IDE 中的解决方案资源管理器中,右键单击“引用”文件夹,然后选择“添加引用...”,如下图所示
在出现的“添加引用”对话框中,从列表中选择“MySQL.Data”项
现在,完成此操作后,我们必须在 Visual C# IDE 中将 using MySql.Data.MySqlClient
语句添加到我们的代码中
下面是执行从 C# 连接到任何 MySQL 数据库所需的基本代码行
using System; using System.Data; using System.Data.Common; using System.Collections.Generic; using System.Text; using MySql.Data.MySqlClient; namespace MySQLDBConnection { class Program { static void Main(string[] args) { MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder(); connBuilder.Add("Database", "shop"); connBuilder.Add("Data Source", "localhost"); connBuilder.Add("User Id", "root"); connBuilder.Add("Password", "masterkey"); MySqlConnection connection = new MySqlConnection(connBuilder.ConnectionString); MySqlCommand cmd = connection.CreateCommand(); connection.Open(); // Here goes the code needed to perform operations on the // database such as querying or inserting rows into a table connection.Close(); } } }
请注意,我选择使用 MySqlConnectionStringBuilder
类,而不是将所有连接项放入一个单独的字符串中。这提高了代码的可读性和可维护性。
首先,我们通过将 MySql.Data.MySqlClient
命名空间添加到我们的代码中来开始。然后,我们创建一个 MySqlConnectionStringBuilder
实例,并添加数据库名称、数据源、用户 ID 和密码的名称/值对。之后,我们创建一个 MySqlConnection
类的实例,并将 MySqlConnectionStringBuilder
实例中的 ConnectionString
作为参数传递。
让我们在 Program 类中创建以下两个方法。一个用于读取我们正在处理的表的内容,另一个用于向表中追加新数据。
public static void QueryCommand(MySqlCommand cmd) { cmd.CommandText = "SELECT * FROM article"; cmd.CommandType = CommandType.Text; MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine(String.Format("{0}, {1}, {2}", reader.GetInt32(0), reader.GetString(1), reader.GetDouble(2)) ); } reader.Close(); } public static void InsertCommand(MySqlCommand cmd, string name, double price) { cmd.CommandText = "append_data"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new MySqlParameter("param_name", name)); cmd.Parameters.Add(new MySqlParameter("param_price", price)); cmd.ExecuteNonQuery(); }
现在,让我们在 connection.Open()
和 connection.Close()
语句之间添加一些代码来执行一些基本的数据库操作。
InsertCommand(cmd, "MQ95 Flat Monitor", 399.00); QueryCommand(cmd);
关注点
我决定写这篇文章,是因为几周前我开始寻找类似的东西,但找不到任何能教我需要知道的东西的例子。我必须说,MySQL 在某些方面很容易使用,特别是与其他免费提供的商业 DBMS 轻量级版本相比。我在这里提供的代码还有一些可以改进的地方,但我希望这个例子尽可能简单。
历史
文章最初写于 2007 年 11 月 30 日。