c#学习之Ado.Net
Ado.Net
一种数据访问技术,应用程序可以连接到数据库,并以各种方式来操作其中的数据,一个com组件库,.Net中数据,优先选择的数据访问接口。
组成
1.DataSet 非连接的核心组件,独立于任何数据源的数据访问,多种不同的数据源
2.Data Provider(数据源提供程序) 用于连接数据库,执行命令,检索结果
Connection 提供与数据源的连接,例如MysqlConnection等
Command 执行数据库命令的对象
DataReader 从数据源中提供快速的只读数据流
DataAdapter 提供DataSet对象与数据源的桥梁
DataReader和DataAdapter的区别
MySqlDataReader
和 MySqlDataAdapter
都是在 C# 中与 MySQL 数据库进行数据交互的工具,但它们在用途和工作方式上有一些重要的区别。
-
用途:
-
MySqlDataReader
:主要用于执行 SQL 查询并逐行检索结果数据。它是一种只读数据流,适用于对结果集进行快速迭代,通常用于处理大型结果集或需要逐行处理数据的情况。 -
MySqlDataAdapter
:用于执行 SQL 查询并将结果填充到数据容器(通常是DataSet
或DataTable
)中。它适用于在内存中存储和操作整个结果集,通常用于绑定数据到 UI 控件或在本地应用程序中进行复杂的数据操作。
-
-
工作方式:
-
MySqlDataReader
:执行 SQL 查询后,将结果流式读取到内存中,逐行返回数据。它保持与数据库的连接打开,因此在使用完MySqlDataReader
后,需要显式关闭连接。 -
MySqlDataAdapter
:执行 SQL 查询后,将整个结果集加载到内存中的数据容器中(如DataSet
或DataTable
)。然后,你可以关闭与数据库的连接,因为数据已经在本地可用。
-
-
适用场景:
-
MySqlDataReader
适用于需要对大型结果集进行迭代处理的情况,例如在后台处理大量数据记录或需要逐行处理数据的批量操作。 -
MySqlDataAdapter
适用于需要在应用程序内部存储和操作整个结果集的情况,例如在 Windows Forms 或 Web 应用程序中绑定数据到 UI 控件、执行数据筛选或进行复杂的数据操作。
-
-
连接状态:
-
MySqlDataReader
在执行期间保持连接打开,因此需要谨慎管理连接状态,确保及时关闭连接,以防止资源泄漏。 -
MySqlDataAdapter
在数据填充后通常会关闭连接,因为数据已加载到内存中,不再需要保持与数据库的持续连接。
-
连接池
即存放连接的容器,当客户每次请求连接时,会先在连接池中寻找是否有空闲的连接,如果有就给客户端,没有则新开一个连接并放入连接池
Max Pool Size:最大连接数
Min Pool Size:最小连接数
Pooling 是否启用连接池
默认情况下连接池的启用的
SqlConnection
常见属性:
-
ConnectionString:获取或设置用于连接到数据库的连接字符串。连接字符串包括数据库的位置、认证信息、连接超时等。
-
Database:获取当前连接的数据库的名称。
-
DataSource:获取数据库服务器的名称或网络地址。
-
State:获取当前连接的状态,例如打开、关闭、连接中等。
-
ClientConnectionId:获取连接的唯一标识符。
-
ServerVersion:获取与数据库服务器实例关联的版本信息。
常见方法:
-
Open():打开数据库连接。
-
Close():关闭数据库连接。
-
Dispose():释放由
SqlConnection
对象占用的资源。通常在使用完连接后手动调用。 -
ChangeDatabase(string databaseName):切换到另一个数据库。
-
CreateCommand():创建一个与连接关联的新
SqlCommand
对象,用于执行SQL命令。 -
BeginTransaction():开始数据库事务。
-
EnlistDistributedTransaction():将连接与分布式事务相关联,用于分布式事务处理。
-
GetSchema():获取数据库的模式信息。
连接字符串有多种传值方式,最优的是配置传值
构造函数传值,调用ConnectionString直接传值,使用SqlConnectionStringBuilder生产对应的构建器构建,放到config中读取
sqlcommend
常见属性:
-
CommandText:获取或设置要执行的SQL命令文本。
-
CommandType:获取或设置SQL命令的类型,通常是
Text
(普通文本命令)或StoredProcedure
(存储过程)。 -
Connection:获取或设置与
SqlCommand
相关联的SqlConnection
对象,用于执行命令。 -
Parameters:获取包含与SQL命令相关的参数的 SqlParameterCollection 对象,可用于传递参数给SQL命令。
-
Transaction:获取或设置与
SqlCommand
相关联的事务,以便在事务内执行命令。
常见方法:
-
ExecuteReader():执行SQL查询命令并返回一个 SqlDataReader 对象,用于检索查询结果。
-
ExecuteNonQuery():执行SQL命令,如插入、更新或删除数据,返回受影响的行数。
-
ExecuteScalar():执行SQL命令并返回结果集的第一行第一列的值。
-
ExecuteXmlReader():执行SQL命令并返回一个 XmlReader 对象,用于检索XML格式的结果。
-
Prepare():为命令的执行做准备,通常用于执行多次相同命令的情况,以提高性能。
-
Cancel():尝试取消正在执行的命令。
SqlParameter
常见属性:
-
ParameterName:获取或设置参数的名称,通常以
@
开头。 -
Value:获取或设置参数的值。
-
DbType:获取或设置参数的数据类型,用于指定参数的数据类型,例如整数、字符串、日期等。
-
Direction:获取或设置参数的方向,包括输入参数、输出参数和双向参数。
-
Size:获取或设置参数的大小,用于指定字符串参数的最大长度。
-
IsNullable:获取或设置一个值,指示参数是否可为空。
-
SourceColumn:获取或设置参数值的源列名称,通常用于数据同步和更新操作。
常见方法:
-
ResetDbType():重置参数的数据类型为默认类型。
-
ResetSize():重置参数的大小为默认大小。
-
ResetValue():重置参数的值为默认值。
sqlCommand.Parametes.Add()用于给command添加参数
现在使用AddWithValue("","")添加单个参数不用实例化一个SqlParameter类
AddRange()添加一个SqlParameter数组
SqlDataReader
该类对象只能进行读取操作不能进行修改,该类会一直占用连接直到执行完毕,此期间其余的操作都会处于等待状态因此当操作完必须关闭连接
常见属性:
-
FieldCount:获取查询结果集中的列数。
-
Item[string name]:通过列名获取当前行中列的值。
-
Item[int index]:通过列的索引获取当前行中列的值。
-
HasRows:检查查询结果集是否包含至少一行数据。
-
IsClosed:检查
MySqlDataReader
是否已经关闭。
常见方法:
-
Read():将
MySqlDataReader
移动到查询结果集中的下一行,返回true
表示有更多行可读,false
表示已经到达结果集的末尾。 -
GetName(int index):通过列的索引获取列的名称。
-
GetOrdinal(string name):通过列的名称获取列的索引。
-
IsDBNull(int index):检查指定列是否包含 NULL 值。
-
GetValue(int index):获取指定列的值,返回一个
object
类型的值。 -
GetBoolean(int index):获取指定列的布尔值。
-
GetInt32(int index):获取指定列的整数值。
-
GetString(int index):获取指定列的字符串值。
-
GetDateTime(int index):获取指定列的日期时间值。
-
GetDecimal(int index):获取指定列的十进制数值。
-
Close():关闭
MySqlDataReader
对象,释放与之关联的资源。
DataSet和DataTable,类似一个缓存中的数据库和表,即把从数据库中读取到的数据储存到内存中,则使用DataSet和DataTable进行储存
一个DataTable只能属于一个DataSet
DataRelation用于描绘表之间的关系
SqlDataAdapter用于数据库和dataset之间的适配器,可以将数据库的数据中获取并填充到dataset中,变为离线数据,这时候就可以断开和数据库的连接,避免连接的占用,也可以将修改后的离线数据上传会数据库进行数据更新
DataTable
常见属性:
-
Columns:获取
DataColumnCollection
对象,表示表格的列集合,可以用于添加、删除、和操作列。 -
Rows:获取
DataRowCollection
对象,表示表格的行集合,可以用于添加、删除、和操作行。 -
TableName:获取或设置表格的名称。
-
PrimaryKey:获取或设置一个
DataColumn
数组,表示表格的主键列。 -
DefaultView:获取一个
DataView
对象,允许对表格进行排序、过滤和搜索。 -
Constraints:获取
ConstraintCollection
对象,用于定义表格的约束条件,例如唯一性约束和外键约束。
常见方法:
-
NewRow():创建一个新的
DataRow
对象,该对象具有与表格相同的结构。 -
Load(IDataReader reader):从一个实现了
IDataReader
接口的数据源中加载数据到表格。 -
LoadDataRow(Object[] values, bool fAcceptChanges):加载一个数据行数组到表格中,并根据需要接受更改。
-
ImportRow(DataRow row):将指定的数据行导入到表格中,保留原始数据行的状态。
-
Clear():删除表格中的所有数据行。
-
AcceptChanges():将所有未提交的更改应用到表格,并清除更改状态。
-
RejectChanges():取消表格中所有未提交的更改,恢复到原始数据状态。
-
Compute(string expression, string filter):计算符合指定过滤条件的数据行的表达式值。
-
Select(string filter, string sort):根据指定的过滤条件和排序条件返回一个
DataRow[]
数组。 -
Copy():创建一个具有相同结构和数据的新
DataTable
。 -
Clone():创建一个具有相同结构但不包含数据的新
DataTable
。 -
BeginLoadData():开始加载数据时,可以提高性能。
-
EndLoadData():结束加载数据时,可以提高性能
- Merge() : 合并一个和自己结构相同的Table并生成一个新的Table
DataSet
常见属性:
-
Tables:获取
DataTableCollection
对象,表示DataSet
中包含的所有表格的集合。您可以通过这个属性访问和操作各个表格。 -
Relations:获取
DataRelationCollection
对象,表示DataSet
中表格之间的关系。可以用于定义和操作表格之间的关系,如主从关系。 -
DataSetName:获取或设置
DataSet
的名称。 -
Namespace:获取或设置
DataSet
的命名空间。
常见方法:
-
ReadXml(string fileName):从 XML 文件中读取数据,将其填充到
DataSet
中。 -
WriteXml(string fileName):将
DataSet
中的数据写入到 XML 文件中。 -
AcceptChanges():将
DataSet
中所有表格的未提交更改应用,清除更改状态。 -
RejectChanges():取消
DataSet
中所有表格的未提交更改,恢复到原始数据状态。 -
Clear():从
DataSet
中删除所有的表格和关系。 -
Clone():创建一个具有相同结构但不包含数据的新
DataSet
。 -
Copy():创建一个新的
DataSet
,其中包含与原DataSet
相同的数据。 -
GetChanges():获取包含
DataSet
中所有表格的未提交更改的DataSet
。 -
GetXml():将
DataSet
中的数据以 XML 字符串的形式返回。 -
HasChanges():检查
DataSet
中是否有未提交的更改。 -
Merge(DataSet dataSet):将另一个
DataSet
的数据合并到当前DataSet
中。 -
Tables.Add():向
DataSet
中添加一个新的DataTable
。 -
Relations.Add():向
DataSet
中添加一个新的表格关系
DataRelation
常见属性:
-
ChildColumns:获取一个
DataColumn
数组,表示子表格中与关系相关联的列。 -
ChildKeyConstraint:获取
ForeignKeyConstraint
对象,表示子表格中与关系相关联的外键约束。 -
ParentColumns:获取一个
DataColumn
数组,表示父表格中与关系相关联的列。 -
ParentKeyConstraint:获取
UniqueConstraint
对象,表示父表格中与关系相关联的唯一约束。 -
RelationName:获取或设置关系的名称。
-
Nested:获取或设置一个布尔值,指示关系是否为嵌套关系。嵌套关系是一种层次化的关系,用于表示父子关系。
常见方法:
-
SetNested():将关系设置为嵌套关系。
-
ToString():返回关系的字符串表示形式,通常是关系的名称。
SqlDataAdapter
常见属性:
-
SelectCommand:获取或设置用于从数据库中检索数据的
SqlCommand
对象。 -
InsertCommand:获取或设置用于向数据库中插入数据的
SqlCommand
对象。 -
UpdateCommand:获取或设置用于更新数据库中数据的
SqlCommand
对象。 -
DeleteCommand:获取或设置用于从数据库中删除数据的
SqlCommand
对象。 -
TableMappings:获取一个
DataTableMappingCollection
对象,用于将数据库表格和DataSet
中的表格进行映射,以便填充数据。
常见方法:
-
Fill(DataSet dataSet):从数据库中检索数据并将其填充到指定的
DataSet
中。 -
Update(DataSet dataSet):将
DataSet
中的数据更改提交回数据库,用于更新、插入和删除操作。 -
FillSchema(DataSet dataSet, SchemaType schemaType):仅填充数据架构(表格结构)到
DataSet
,而不包括实际数据。 -
Dispose():释放
SqlDataAdapter
对象所使用的资源。 -
UpdateBatchSize:获取或设置在一次批处理中更新的最大行数。可以用于提高更新操作的性能。
接下来我将使用c#进行对MySQL数据库进行增删改查的操作
首先需要给项目增加mysql的包
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
using NetModular;
namespace CsharpLearn
{
public class MysqlUtil
{
private MySqlConnection connection;
private MySqlCommand command;
public void getConnection()
{
try
{
//Server=服务器地址;Port=端口号;Database=数据库名称;User=用户名;Password=密码;
//采用构建者模式创建连接字符串
//MySqlConnectionStringBuilder mySqlConnectionStringBuilder = new MySqlConnectionStringBuilder();
//mySqlConnectionStringBuilder.Server = "localhost";
//mySqlConnectionStringBuilder.Port = 3307;
//mySqlConnectionStringBuilder.Database = "lab";
//mySqlConnectionStringBuilder.UserID = "root";
//mySqlConnectionStringBuilder.Password = "123456";
//String conStr = mySqlConnectionStringBuilder.ConnectionString;
String conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
if (connection == null)
//connection = new MySqlConnection("Server=localhost;Port=3307;Database=lab;User=root;Password=123456");
//这里我们采用配置文件进行数据库的连接参数指定
connection = new MySqlConnection(conStr);
Console.WriteLine("数据库连接状态:" + connection.State);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void openConnection()
{
connection.Open();
Console.WriteLine("数据库连接状态:" + connection.State);
}
public MySqlCommand getCommend(String sql)
{
//m_commandType;
//默认为CommandType.Text
//CommandType.StoredProcedure,为储存过程语句类型,需要特殊声明
return new MySqlCommand(sql,connection);
}
//针对增删改
public int execute(String sql, MySqlParameter[] p)
{
openConnection();
MySqlCommand mySqlCommand = getCommend(sql);
if (p != null) mySqlCommand.Parameters.AddRange(p);
int count = mySqlCommand.ExecuteNonQuery();
closeConnection();
return count;
}
//针对查寻多列的统计值和具体某一列,只会返回查询的第一列,忽略其它列
public object queryOne(String sql, MySqlParameter[] p)
{
openConnection();
MySqlCommand mySqlCommand = getCommend(sql);
if (p != null) mySqlCommand.Parameters.AddRange(p);
object res = mySqlCommand.ExecuteScalar();
mySqlCommand.Parameters.AddWithValue("", "");
closeConnection();
return res;
}
public void queryMany(String sql, MySqlParameter[] p)
{
openConnection();
MySqlCommand mySqlCommand = getCommend(sql);
if (p != null) mySqlCommand.Parameters.AddRange(p);
MySqlDataReader reader = mySqlCommand.ExecuteReader();
while (reader.Read())
{
int carId = reader["carid"].ToInt();
String carBrand = reader["carbrand"].ToString();
String carColor = reader["carcolor"].ToString();
String ownersName = reader["ownersname"].ToString();
Console.WriteLine(carId + " " + carBrand + " " + carColor + " " + ownersName);
}
reader.Close();
closeConnection();
MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCommand);
DataSet myData = new DataSet();
adapter.Fill(myData, "car");
DataTable dataTable = myData.Tables["car"];
foreach (DataRow row in dataTable.Rows)
{
Console.Write(row["carid"]+"\t");
Console.Write(row["carbrand"]+"\t");
Console.Write(row["carcolor"]+"\t");
Console.Write(row["ownersname"]+"\n");
}
}
public void closeConnection()
{
connection.Close();/* 关闭连接,状态可逆,即关闭了还可以打开*/
//connection.Dispose();释放连接,状态不可逆
Console.WriteLine("数据库连接状态:" + connection.State);
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="conStr" connectionString="Server=localhost;Port=3307;Database=lab;User=root;Password=123456" providerName="MySqlConnector"/>
</connectionStrings>
</configuration>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix