目录:
1.快速入门
2.简明示例
3.详细教程
4.MySqlConnection 对象
5.MySqlCommand 对象
快速入门
1、下载mysql.Data.dll,在解决方案->引用中引入,并在文件头部引入
using MySql.Data.MySqlClient;
2、创建MySqlConnection对象(链接库)
string connstr = "data source=localhost;database=cs_test;user id=root;password=123456;pooling=false;charset=utf8";//pooling代表是否使用连接池 MySqlConnection conn = new MySqlConnection(connstr);
3、创建对应操作的MySqlCommand对象(测试数据库表名characters,属性列:id,names,passwords)
string sql = "select * from characters"; MySqlCommand cmd = new MySqlCommand(sql,conn);
4、针对不同操作,MySqlCommand对象有三个常用方法
(1)查找多行 : ExecuteReader()方法
返回一个MysqlDataReader对象,包含多个行,可以用其Read方法逐行读取。
对于每行元素,可以用getXXX()方法读取属性值,XXX为该属性类型,参数为属性名或者该属性为这张表的第几列。
可以用IsDBNull()方法判断是否为空,参数只能是该属性为这张表的第几列(即只能是数字)
conn.Open(); MySqlDataReader reader = cmd.ExecuteReader(); Console.WriteLine("id\t姓名\t密码"); while (reader.Read()) { Console.Write(reader.GetInt32("id")+"\t"); if (reader.IsDBNull(1)) { Console.Write("空\t"); } else { Console.Write(reader.GetString("names")+"\t"); } if (reader.IsDBNull(2)) { Console.Write("空\n"); } else { Console.Write(reader.GetString("passwords")+"\n"); } } conn.Close();
(2)查找单个: ExecuteScalar()
返回值为查找到的元祖第一个属性,以object类型返回
string sql2 = "select names from characters where id=2"; MySqlCommand cmd2 = new MySqlCommand(sql2,conn); conn.Open(); string names = cmd2.ExecuteScalar().ToString(); Console.WriteLine(names); conn.Close();
(3)增、删、改: ExecuteNonQuery()
返回值为int,不成功是0,成功是1
string sql3 = "insert into characters (names,passwords) values ('XXX','1234456')"; MySqlCommand cmd3 = new MySqlCommand(sql3,conn); conn.Open(); int s = cmd3.ExecuteNonQuery(); if (s == 0) Console.WriteLine("false"); else Console.WriteLine("success"); conn.Close();
5、完整代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; namespace mysql_test { class mysqlcz{ public mysqlcz() { string connstr = "data source=localhost;database=csceshi;user id=root;password=123456;pooling=false;charset=utf8"; using (MySqlConnection conn = new MySqlConnection(connstr)) { string sql = "select * from characters"; MySqlCommand cmd = new MySqlCommand(sql,conn); conn.Open(); MySqlDataReader reader = cmd.ExecuteReader(); Console.WriteLine("id\t姓名\t密码"); while (reader.Read()) { Console.Write(reader.GetInt32("id")+"\t"); if (reader.IsDBNull(1)) { Console.Write("空\t"); } else { Console.Write(reader.GetString("names")+"\t"); } if (reader.IsDBNull(2)) { Console.Write("空\n"); } else { Console.Write(reader.GetString("passwords")+"\n"); } } conn.Close();<br> string sql2 = "select names from characters where id=2"; MySqlCommand cmd2 = new MySqlCommand(sql2,conn); conn.Open(); string names = cmd2.ExecuteScalar().ToString(); Console.WriteLine(names); conn.Close(); string sql3 = "insert into characters (names,passwords) values ('XXX','1234456')"; MySqlCommand cmd3 = new MySqlCommand(sql3,conn); conn.Open(); int s = cmd3.ExecuteNonQuery(); if (s == 0) Console.WriteLine("false"); else Console.WriteLine("success"); conn.Close(); } Console.ReadLine(); } } class Program { static void Main(string[] args) { mysqlcz mt = new mysqlcz(); } } }
6、sql语句参数化
为防止sql注入,尽量不要使用字符串拼接的方法拼接sql字符串
string uname=Console.ReadLine(); string upwd=Console.ReadLine();//获取用户输入 string sql="insert into characters (names,passwords) values (@name,@pwd)";//使用@符构造sql变量 MysqlCommand cmd = new MysqlCommand(sql,conn); //使用MysqlCommand对象的parameters属性,该属性为像sql语句传递的参数集合,使用add方法向其中添加参数,参数以MysqlParameters对象形式传递 cmd.parameters.Add(new MysqlParametes("@name",uname)); cmd.parameters.Add(new MysqlParameters("@pwd",upwd)); conn.Open(); cmd.ExecuteNonQuery(); conn.Close();
MySqlConnection 对象
为了让您的 MySQL Connector/NET 应用程序连接到 MySQL 数据库,它必须使用 MySqlConnection
对象建立连接。
构造MySqlConnection
函数将连接字符串作为其参数之一。连接字符串提供了连接到 MySQL 数据库的必要信息。连接字符串在第 4 章,连接器/NET 连接中进行了更全面的讨论 。有关支持的连接字符串选项的列表,请参阅 第 4.5 节,“连接器/NET 8.0 连接选项参考”。
以下代码显示了如何创建连接对象/
using System; using System.Data; using MySql.Data; using MySql.Data.MySqlClient; public class Tutorial1 { public static void Main() { string connStr = "server=localhost;user=root;database=world;port=3306;password=******"; MySqlConnection conn = new MySqlConnection(connStr); try { Console.WriteLine("Connecting to MySQL..."); conn.Open(); // Perform database operations } catch (Exception ex) { Console.WriteLine(ex.ToString()); } conn.Close(); Console.WriteLine("Done."); } }
调用构造函数时MySqlConnection
,会返回一个连接对象,用于后续的数据库操作。在进行任何其他操作之前打开连接。在应用程序退出之前,通过调用Close
连接对象关闭与数据库的连接。
有时,对连接对象执行的尝试Open
可能会失败,从而生成可以使用标准异常处理代码处理的异常。
在本节中,您学习了如何创建与 MySQL 数据库的连接,以及打开和关闭相应的连接对象。
MySqlCommand 对象
与 MySQL 数据库建立连接后,下一步可让您执行数据库操作。这个任务可以通过使用 MySqlCommand
对象来完成。
创建后,您可以调用三个主要的方法:
ExecuteReader
查询数据库。结果通常在一个MySqlDataReader
对象中返回,由ExecuteReader
.ExecuteNonQuery
插入、更新和删除数据。ExecuteScalar
返回单个值。
创建对象后MySqlCommand
,您可以在其上调用前面的方法之一来执行数据库操作,例如执行查询。结果通常返回到一个MySqlDataReader
对象中,然后进行处理。例如,结果可能显示为以下代码示例所示。
using System; using System.Data; using MySql.Data; using MySql.Data.MySqlClient; public class Tutorial2 { public static void Main() { string connStr = "server=localhost;user=root;database=world;port=3306;password=******"; MySqlConnection conn = new MySqlConnection(connStr); try { Console.WriteLine("Connecting to MySQL..."); conn.Open(); string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent='Oceania'"; MySqlCommand cmd = new MySqlCommand(sql, conn); MySqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { Console.WriteLine(rdr[0]+" -- "+rdr[1]); } rdr.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } conn.Close(); Console.WriteLine("Done."); } }
创建并打开连接后,代码将创建一个MySqlCommand
对象。然后将要执行的 SQL 查询传递给 MySqlCommand
构造函数。然后使用该 ExecuteReader
方法生成 MySqlReader
对象。对象包含在 对象MySqlReader
上执行的 SQL 生成的结果 MySqlCommand
。在MySqlReader
对象中获得结果后,即可对结果进行处理。在这种情况下,信息通过while
循环打印出来。最后, MySqlReader
通过调用Close
方法来处理对象。
下一个示例显示了如何使用该 ExecuteNonQuery
方法。
执行ExecuteNonQuery
方法调用的过程更简单,因为不需要创建对象来存储结果。这是因为ExecuteNonQuery
仅用于插入、更新和删除数据。以下示例说明了对 Country
表的简单更新:
using System; using System.Data; using MySql.Data; using MySql.Data.MySqlClient; public class Tutorial3 { public static void Main() { string connStr = "server=localhost;user=root;database=world;port=3306;password=******"; MySqlConnection conn = new MySqlConnection(connStr); try { Console.WriteLine("Connecting to MySQL..."); conn.Open(); string sql = "INSERT INTO Country (Name, HeadOfState, Continent) VALUES ('Disneyland','Mickey Mouse', 'North America')"; MySqlCommand cmd = new MySqlCommand(sql, conn); cmd.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } conn.Close(); Console.WriteLine("Done."); } }
构造查询,MySqlCommand
创建对象并在对象ExecuteNonQuery
上调用方法MySqlCommand
。您可以使用mysql访问您的 MySQL 数据库并验证更新是否正确执行。
最后,您可以使用该ExecuteScalar
方法返回单个值。同样,这很简单,因为 MySqlDataReader
不需要对象来存储结果,而是使用变量来代替。以下代码说明了如何使用该ExecuteScalar
方法:
using System; using System.Data; using MySql.Data; using MySql.Data.MySqlClient; public class Tutorial4 { public static void Main() { string connStr = "server=localhost;user=root;database=world;port=3306;password=******"; MySqlConnection conn = new MySqlConnection(connStr); try { Console.WriteLine("Connecting to MySQL..."); conn.Open(); string sql = "SELECT COUNT(*) FROM Country"; MySqlCommand cmd = new MySqlCommand(sql, conn); object result = cmd.ExecuteScalar(); if (result != null) { int r = Convert.ToInt32(result); Console.WriteLine("Number of countries in the world database is: " + r); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } conn.Close(); Console.WriteLine("Done."); } }
此示例使用一个简单的查询来计算 Country
表中的行数。通过调用对象获得ExecuteScalar
结果 MySqlCommand
。
简明示例:
C#操作mysql需要添加相应版本的MySql.Data.dll引用
MysqlBase.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MySql.Data.MySqlClient; using System.Data; namespace 一键配置工具 { class MysqlBase { private MySqlConnection conn = null; private MySqlCommand command = null; private MySqlDataReader reader = null; /// <summary> /// 构造方法里建议连接 /// </summary> /// <param name="connstr"></param> public MysqlBase(string connstr) { //我这里是在构造函数里传入mysql连接语句 conn = new MySqlConnection(connstr); } /// <summary> /// 发送指令 /// </summary> /// <param name="sql"></param> public void CreateCommand(string sql) { conn.Open(); command = new MySqlCommand(sql, conn); } /// <summary> /// 增、删、改公共方法 /// </summary> /// <returns></returns> public int commonExecute() { int res = -1; try { res = command.ExecuteNonQuery(); }catch(MySqlException ex) { Console.WriteLine("操作失败!" + ex.Message); } conn.Close(); return res; } /// <summary> /// 查询方法 /// 注意:尽量不要用select * from table表(返回的数据过长时,DataTable可能会出错),最好指定要查询的字段。 /// </summary> /// <returns></returns> public DataTable selectExecute() { DataTable dt = new DataTable(); using (reader = command.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(reader); } return dt; } } }
示例:
string mysqlStr = "Database=mydata_db;Data Source=127.0.0.1;User Id=root;Password=root;;pooling=false;CharSet=utf8;port=3306;" MysqlBase mysqlBase = new MysqlBase(mysqlStr); //查询 string sql = "select * from student where id=" + id; mysqlBase.CreateCommand(sql); DataTable dt = mysqlBase.selectExecute(); if (dt.Rows.Count != 0) { int id = Convert.ToInt32(dt.Rows[0][0]); int name = dt.Rows[0][1]; } else { MessageBox.Show("无数据"); } string sql = "update student set name='张三',age=20 where id="+id; mysqlBase.CreateCommand(sql); int res = mysqlBase.commonExecute(); if (res > 0) { MessageBox.Show("更新成功"); }else{ MessageBox.Show("更新失败"); }
详细教程
在本文中,我们将介绍如何在 C# 中对 MySQL 进行编程。我们使用 ADO.NET。
MySQL
MySQL是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL在网络上特别受欢迎。MySQL数据库在最重要的操作系统平台上可用。它运行在BSD Unix,Linux,Windows或Mac操作系统上,MySQL有两个版本:MySQL服务器系统和MySQL嵌入式系统。
ADO.NET
ADO.NET 是统一访问关系数据库、XML 文件和其他应用程序数据的规范。数据是 mySQL 数据库的 ADO.NET 规范的实现。它是用 C# 语言编写的驱动程序,可用于所有 .NET 语言。
$ dotnet add package MySql.Data
我们将该包包含在我们的 .NET Core 项目中。
.NET 数据访问接口模型的核心元素。
创建与特定数据源的连接。该对象对数据源执行 SQL 语句。
从数据源读取数据流。MySqlConnection
MySqlCommand
MySqlDataReaderDataSet
MySqlDataProvider
MySqlConnection
MySqlCommand
MySqlDataReader
该对象用于对大量数据进行脱机工作。它是一种断开连接的数据表示形式,可以保存来自各种不同源的数据。两者都用于处理数据;它们在不同的环境中使用。如果我们只需要读取查询的结果,则是更好的选择。如果我们需要更广泛地处理数据,或者我们想要将 Winforms 控件绑定到数据库表,则首选。DataSet
MySqlDataReaderDataSet
MySqlDataReaderDataSet
C# MySQL 版本
以下程序,我们检查MySQL服务器的版本。
Program.cs
using MySql.Data.MySqlClient; string cs = @"server=localhost;userid=dbuser;password=s$cret;database=testdb"; using var con = new MySqlConnection(cs); con.Open(); Console.WriteLine($"MySQL version : {con.ServerVersion}");
我们连接到数据库并获取有关MySQL服务器的一些信息。
using MySql.Data.MySqlClient;
我们导入 MySQL 数据提供程序的元素。
string cs = @"server=localhost;userid=dbuser;password=s$cret;database=testdb";
这是连接字符串。数据提供程序使用它来建立与数据库的连接。我们指定主机名、用户名、密码和数据库名称。
using var con = new MySqlConnection(cs);
将创建一个对象。此对象用于打开与数据库的连接。该语句在变量超出范围时释放数据库连接资源。MySQLConnection
using
con.Open();
此行将打开数据库连接。
Console.WriteLine($"MySQL version : {con.ServerVersion}");
在这里,我们使用连接对象的属性打印MySQL的版本。Server Version
$ dotnet run MySQL version: 8.0.29-0ubuntu0.22.04.2
C# MySQL SELECT 查询语句
下面的示例使用 SELECT 语句确定 MySQL 的版本。
Program.cs
using MySql.Data.MySqlClient; string cs = @"server=localhost;userid=dbuser;password=s$cret;database=mydb"; using var con = new MySqlConnection(cs); con.Open(); var stm = "SELECT VERSION()"; var cmd = new MySqlCommand(stm, con); var version = cmd.ExecuteScalar().ToString(); Console.WriteLine($"MySQL version: {version}");
我们检查 MySQL 数据库的版本。这次使用 SQL 查询。
var stm = "SELECT VERSION()";
这是 SQL 选择语句。它返回数据库的版本。这是一个内置的 MySQL 函数。VERSION
var cmd = new MySqlCommand(stm, con);
是用于对数据库执行查询的对象。参数是 SQL 语句和连接对象。MySqlCommand
var version = cmd.ExecuteScalar().ToString();
有些查询仅返回标量值。在我们的例子中,我们需要一个指定数据库版本的简单字符串。在这种情况下使用 。ExecuteScalar
C# MySQL 创建表
在下面的示例中,我们创建一个数据库表并用数据填充它。
Program.cs
using MySql.Data.MySqlClient; string cs = @"server=localhost;userid=dbuser;password=s$cret;database=testdb"; using var con = new MySqlConnection(cs); con.Open(); using var cmd = new MySqlCommand(); cmd.Connection = con; cmd.CommandText = "DROP TABLE IF EXISTS cars"; cmd.ExecuteNonQuery(); cmd.CommandText = @"CREATE TABLE cars(id INTEGER PRIMARY KEY AUTO_INCREMENT, name TEXT, price INT)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Audi',52642)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Mercedes',57127)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Skoda',9000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Volvo',29000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Bentley',350000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Citroen',21000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Hummer',41400)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Volkswagen',21600)"; cmd.ExecuteNonQuery(); Console.WriteLine("Table cars created");
在此示例中,我们创建了一个包含八行的表。cars
cmd.CommandText = "DROP TABLE IF EXISTS cars"; cmd.ExecuteNonQuery();
首先,如果表已存在,我们将删除它。如果我们不需要结果集,例如 , 或 语句,则使用该方法。ExecuteNonQuery
DROP
INSERT
DELETE
cmd.CommandText = @"CREATE TABLE cars(id INTEGER PRIMARY KEY AUTO_INCREMENT, name TEXT, price INT)"; cmd.ExecuteNonQuery();;
将创建表。关键字使列在 MySQL 中自动递增。cars
AUTO_INCREMENT
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Audi',52642)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Mercedes',57127)"; cmd.ExecuteNonQuery(); ...
在这里,我们在表中插入两行。
$ dotnet run Table cars created
我们运行程序。
$ mysql -u dbuser -p
我们使用该工具连接到MySQL服务器。mysql
MariaDB [(none)]> use testdb; Database changed MariaDB [testdb]> SELECT * FROM cars; +----+------------+--------+ | id | name | price | +----+------------+--------+ | 1 | Audi | 52642 | | 2 | Mercedes | 57127 | | 3 | Skoda | 9000 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+ 8 rows in set (0.00 sec)
我们验证数据。已成功创建表。cars
C# MySQL prepared语句
预处理语句可提高安全性和性能。当我们编写预准备语句时,我们使用占位符,而不是直接将值写入语句中。
Program.cs
using MySql.Data.MySqlClient; string cs = @"server=localhost;userid=dbuser;password=s$cret;database=testdb"; using var con = new MySqlConnection(cs); con.Open(); var sql = "INSERT INTO cars(name, price) VALUES(@name, @price)"; using var cmd = new MySqlCommand(sql, con); cmd.Parameters.AddWithValue("@name", "BMW"); cmd.Parameters.AddWithValue("@price", 36600); cmd.Prepare(); cmd.ExecuteNonQuery(); Console.WriteLine("row inserted");
我们在表格中加了一辆新车。我们使用参数化命令。cars
var sql = "INSERT INTO cars(name, price) VALUES(@name, @price)"; using var cmd = new MySqlCommand(sql, con);
当我们编写预准备语句时,我们使用占位符,而不是直接将值写入语句中。预准备语句速度更快,可防止 SQL 注入攻击。和 是占位符,稍后将填充这些占位符。@name
@price
cmd.Parameters.AddWithValue("@name", "BMW"); cmd.Parameters.AddWithValue("@price", 36600); cmd.Prepare();
值使用该方法绑定到占位符。Add With Value
cmd.ExecuteNonQuery();
将执行预准备语句。当我们不希望返回任何数据时,我们使用对象的方法。ExecuteNonQuery
MySQLCommand
C# MySqlDataReader
是用于从数据库中检索数据的对象。它提供对查询结果的快速、只进、只读访问。这是从表中检索数据的最有效方法。MySqlDataReader
Program.cs
using MySql.Data.MySqlClient; string cs = @"server=localhost;userid=dbuser;password=s$cret;database=testdb"; using var con = new MySqlConnection(cs); con.Open(); string sql = "SELECT * FROM cars"; using var cmd = new MySqlCommand(sql, con); using MySqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { Console.WriteLine("{0} {1} {2}", rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)); }
我们从表中获取所有行并将其打印到控制台。cars
using MySqlDataReader rdr = cmd.ExecuteReader();
要创建一个,我们调用对象的方法。MySQLDataReader
ExecuteReader
MySqlCommand
while (rdr.Read()) { Console.WriteLine("{0} {1} {2}", rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)); }
该方法将数据读取器推进到下一条记录。如果有更多的行,它返回;否则。我们可以使用数组索引表示法检索值,也可以使用特定方法来访问其本机数据类型中的列值。后者效率更高。Read
true
false
$ dotnet run 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 9 BMW 36600
C# MySQL列标题
在以下示例中,我们使用数据库表中的数据打印列标题。
Program.cs
using MySql.Data.MySqlClient; string cs = @"server=localhost;userid=dbuser;password=s$cret;database=testdb"; using var con = new MySqlConnection(cs); con.Open(); var sql = "SELECT * FROM cars"; using var cmd = new MySqlCommand(sql, con); using MySqlDataReader rdr = cmd.ExecuteReader(); Console.WriteLine($"{rdr.GetName(0),-4} {rdr.GetName(1),-10} {rdr.GetName(2),10}"); while (rdr.Read()) { Console.WriteLine($"{rdr.GetInt32(0),-4} {rdr.GetString(1),-10} {rdr.GetInt32(2),10}"); }
在此示例中,我们从表中选择所有行及其列名。cars
Console.WriteLine($"{rdr.GetName(0),-4} {rdr.GetName(1),-10} {rdr.GetName(2),10}");
我们用阅读器的方法获取列的名称。GetName
while (rdr.Read()) { Console.WriteLine($"{rdr.GetInt32(0),-4} {rdr.GetString(1),-10} {rdr.GetInt32(2),10}"); }
我们将 SQL 语句返回的数据打印到终端。
$ dotnet run id name price 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 9 BMW 36600
在本文中,我们展示了如何在C#中对MySQL数据库进行编程。