前置
注意vs中要引用mysql的类库。
MySqlCommand
- MySqlCommand类代表了要在MySQL数据库上执行的SQL语句或存储过程。提供了许多方法来执行不同类型的SQL命令,比如查询(SELECT)、插入(INSERT)、更新(UPDATE)和删除(DELETE)。你可以创建一个MySqlCommand对象,并将要执行的SQL语句传递给它的构造函数,然后通过调用不同的方法来执行该命令。本文中通过它进行增删改查sql语句的创立
MySqlDataReader
- MySqlDataReader类用于从MySQL数据库中读取查询结果。当你执行一个查询命令并且得到一个结果集时,你可以使用MySqlDataReader来逐行读取这个结果集中的数据。你可以调用Read()方法来移动到结果集中的下一行,并使用不同的方法(如GetInt32()、GetString()等)来获取每一列的值。MySqlDataReader提供了高效的数据读取功能,因为它一次只读取一行数据,而不是将整个结果集一次性加载到内存中。
Parameters.AddWithValue()
Parameters.AddWithValue()
是用于向 SQL 命令中添加参数的方法。- 在数据库操作中,有时候我们需要在 SQL 语句中使用参数,而不是直接将数值或字符串嵌入到 SQL 语句中。这样做的好处有两个方面:
- 安全性:使用参数可以防止 SQL 注入攻击。如果直接将用户提供的数据嵌入到 SQL 语句中,恶意用户可能会利用这一点来执行恶意操作。而使用参数可以将用户输入的数据作为参数传递给 SQL 语句,数据库会将其视为数据而不是命令,从而避免了潜在的安全风险。
- 清晰性:使用参数可以使 SQL 语句更加清晰和易读。参数的名称可以更好地表达数据的含义,使得代码更易于理解和维护。
reader.Read()
reader.Read()
是一个用于从数据库结果集中读取下一行数据的方法。- 在使用
MySqlDataReader
对象执行查询并获得结果集之后,通过调用reader.Read()
方法可以逐行遍历结果集中的数据。每次调用该方法,它会尝试从结果集中读取下一行数据,并返回一个布尔值来指示是否成功读取了数据。 - 如果成功读取了数据,
reader.Read()
方法返回true
,这意味着结果集中还有更多的行可以读取。 如果结果集中没有更多的行可供读取(即已经读取到了结果集的末尾),那么reader.Read()
方法会返回false
,表示已经到达了结果集的末尾,无法再读取更多的数据。 - 因此,通常我们会在一个循环中使用
reader.Read()
方法来逐行读取结果集中的数据,直到reader.Read()
返回false
,即结果集的末尾。在每次循环迭代中,我们可以使用其他方法(如GetInt32()
、GetString()
等)从当前行中获取数据的值,并进行相应的处理
链接mysql数据库
它使用了MySQL Connector/NET库中的MySqlConnection类来建立与MySQL数据库的连接。
cs
static MySqlConnection conn= new MySqlConnection("server=localhost;User Id = root;passwrod=;Database=studymysql;Charset = utf8");
conn.Open();
-
static MySqlConnection conn
: 这声明了一个名为conn
的静态变量,类型为MySqlConnection
,表示与MySQL数据库的连接。 -
new MySqlConnection("server=localhost;User Id=root;passwrod=;Database=studymysql;Charset=utf8")
: 这是对MySqlConnection
构造函数的调用,创建了一个新的 MySqlConnection 实例。它接受一个连接字符串作为参数。server=localhost
: 这指定了数据库服务器运行在本地机器上。User Id=root
: 这将用户名设置为 "root"。passwrod=
: 这里应该指定密码。但是,在这种情况下,密码似乎是空的,等号后面没有值。Database=studymysql
: 这指定要连接的数据库的名称,在这种情况下是 "studymysql"。Charset=utf8
: 这指定了连接使用的字符集
创建 MySqlCommand 对象,传递 SQL 语句和参数来执行数据库操作。然后通过调用 ExecuteNonQuery()
方法来实际执行这些操作。
增(Add)
cs
static void Add() {
MySqlCommand cmd = new MySqlCommand("insert into userinfo set name='xixi',age=96 ", conn);
cmd.ExecuteNonQuery();
int id = (int)cmd.LastInsertedId;
Console.WriteLine("Sql Insert Key:{0}", id);
}
-
MySqlCommand cmd = new MySqlCommand("insert into userinfo set name='xixi',age=96 ", conn);
:这一行创建了一个新的 MySqlCommand 对象,用于执行 SQL 语句。SQL 语句是一个 INSERT INTO 语句 ,将数据插入到名为userinfo
的表中。数据包括name
和age
字段,分别设置为 'xixi' 和 96。这个 MySqlCommand 对象被连接到之前创建的conn
变量,即与 MySQL 数据库的连接。 -
cmd.ExecuteNonQuery();
:这一行执行了 SQL 命令 ,将 'xixi' 和 96 插入到userinfo
表中。因为这是一个插入操作,所以使用了ExecuteNonQuery()
方法,它不返回任何数据,只是执行 SQL 命令。 -
int id = (int)cmd.LastInsertedId;
:这一行获取刚插入的数据的自增 ID。MySQL 中的自增 ID 可以通过LastInsertedId
属性获取 。它被转换为整数类型,并存储在id
变量中。
删(Delete)
cs
static void Delete() {
MySqlCommand cmd = new MySqlCommand("delete from userinfo where id = 1", conn);
cmd.ExecuteNonQuery();
Console.WriteLine("delete done");
}
它创建了一个 MySqlCommand 对象 cmd,用于执行 SQL 删除语句。这个 SQL 语句是 delete from userinfo where id = 1,意味着要删除 userinfo 表中 ID 为 1 的记录。
接着,它调用了 ExecuteNonQuery() 方法来执行删除操作。因为这是一个删除操作,所以使用了 ExecuteNonQuery() 方法,它不返回任何数据,只是执行 SQL 命令。
- 它创建了一个 MySqlCommand 对象 cmd,用于执行 SQL 删除语句。这个 SQL 语句是 delete from userinfo where id = 1,意味着要删除 userinfo 表中 ID 为 1 的记录。
- 接着,它调用了 ExecuteNonQuery() 方法来执行删除操作。因为这是一个删除操作,所以使用了 ExecuteNonQuery() 方法,它不返回任何数据,只是执行 SQL 命令。
改
cs
MySqlCommand cmd = new MySqlCommand("update userinfo set name=@name,age=@age where id =@id", conn);
cmd.Parameters.AddWithValue("name", "xoxo");
cmd.Parameters.AddWithValue("age", 123);
cmd.Parameters.AddWithValue("id", 2);
cmd.ExecuteNonQuery();
Console.WriteLine("update done");
}
- 创建了一个 MySqlCommand 对象
cmd
,用于执行 SQL 更新语句。这个 SQL 语句是update userinfo set name=@name,age=@age where id =@id
,意味着要更新userinfo
表中 ID 为给定值的记录,将姓名和年龄更新为给定的值。 - 使用
Parameters.AddWithValue()
方法添加参数到 SQL 命令中。这样做的好处是可以避免 SQL 注入攻击,并且使得 SQL 语句更加清晰和易读。在这个例子中,它添加了三个参数:@name
、@age
和@id
,分别表示要更新的姓名、年龄和记录的 ID。 - 调用了
ExecuteNonQuery()
方法来执行更新操作。
查(Query)
cs
static void Query() {
MySqlCommand cmd = new MySqlCommand("select * from userinfo where age=66", conn);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
int id = reader.GetInt32("id");
string name = reader.GetString("name");
int age = reader.GetInt32("age");
Console.WriteLine(string.Format("sql result: id:{0} name:{1} age:{2}", id, name, age));
}
}
-
创建了一个 MySqlCommand 对象
cmd
,用于执行 SQL 查询语句。查询的是userinfo
表中所有年龄为 66 的记录。SQL 查询语句是 "select * from userinfo where age=66"
。 这个 MySqlCommand 对象与之前创建的conn
变量关联,表示它将在连接的数据库上执行查询操作。 -
MySqlDataReader 是用于读取查询结果集的对象。调用
ExecuteReader()
方法来执行查询,并将结果存储在一个 MySqlDataReader 对象reader
中。 -
在一个
while
循环中,它遍历查询结果集。每次调用reader.Read()
方法,都会移动到结果集中的下一行数据。如果还有数据可读,则返回 true。 -
在循环内部,它使用
GetInt32()
和GetString()
方法从结果集中获取数据。根据列名(在这里是 "id"、"name" 和 "age"),它分别获取整数类型的 ID、字符串类型的姓名和整数类型的年龄。