c#学习之Ado.Net

发布时间 2023-09-27 23:59:28作者: 突破铁皮

Ado.Net

一种数据访问技术,应用程序可以连接到数据库,并以各种方式来操作其中的数据,一个com组件库,.Net中数据,优先选择的数据访问接口。

组成

1.DataSet   非连接的核心组件,独立于任何数据源的数据访问,多种不同的数据源

2.Data Provider(数据源提供程序)   用于连接数据库,执行命令,检索结果

Connection 提供与数据源的连接,例如MysqlConnection等

Command 执行数据库命令的对象

DataReader 从数据源中提供快速的只读数据流

DataAdapter 提供DataSet对象与数据源的桥梁

DataReader和DataAdapter的区别

MySqlDataReaderMySqlDataAdapter 都是在 C# 中与 MySQL 数据库进行数据交互的工具,但它们在用途和工作方式上有一些重要的区别。

 

  1. 用途

    • MySqlDataReader:主要用于执行 SQL 查询并逐行检索结果数据。它是一种只读数据流,适用于对结果集进行快速迭代,通常用于处理大型结果集或需要逐行处理数据的情况。

    • MySqlDataAdapter:用于执行 SQL 查询并将结果填充到数据容器(通常是 DataSetDataTable)中。它适用于在内存中存储和操作整个结果集,通常用于绑定数据到 UI 控件或在本地应用程序中进行复杂的数据操作。

  2. 工作方式

    • MySqlDataReader:执行 SQL 查询后,将结果流式读取到内存中,逐行返回数据。它保持与数据库的连接打开,因此在使用完 MySqlDataReader 后,需要显式关闭连接。

    • MySqlDataAdapter:执行 SQL 查询后,将整个结果集加载到内存中的数据容器中(如 DataSetDataTable)。然后,你可以关闭与数据库的连接,因为数据已经在本地可用。

  3. 适用场景

    • MySqlDataReader 适用于需要对大型结果集进行迭代处理的情况,例如在后台处理大量数据记录或需要逐行处理数据的批量操作。

    • MySqlDataAdapter 适用于需要在应用程序内部存储和操作整个结果集的情况,例如在 Windows Forms 或 Web 应用程序中绑定数据到 UI 控件、执行数据筛选或进行复杂的数据操作。

  4. 连接状态

    • MySqlDataReader 在执行期间保持连接打开,因此需要谨慎管理连接状态,确保及时关闭连接,以防止资源泄漏。

    • MySqlDataAdapter 在数据填充后通常会关闭连接,因为数据已加载到内存中,不再需要保持与数据库的持续连接。

 

连接池

即存放连接的容器,当客户每次请求连接时,会先在连接池中寻找是否有空闲的连接,如果有就给客户端,没有则新开一个连接并放入连接池

Max Pool Size:最大连接数

Min Pool Size:最小连接数

Pooling 是否启用连接池

默认情况下连接池的启用的

 

SqlConnection

常见属性:

  1. ConnectionString:获取或设置用于连接到数据库的连接字符串。连接字符串包括数据库的位置、认证信息、连接超时等。

  2. Database:获取当前连接的数据库的名称。

  3. DataSource:获取数据库服务器的名称或网络地址。

  4. State:获取当前连接的状态,例如打开、关闭、连接中等。

  5. ClientConnectionId:获取连接的唯一标识符。

  6. ServerVersion:获取与数据库服务器实例关联的版本信息。

常见方法:

  1. Open():打开数据库连接。

  2. Close():关闭数据库连接。

  3. Dispose():释放由 SqlConnection 对象占用的资源。通常在使用完连接后手动调用。

  4. ChangeDatabase(string databaseName):切换到另一个数据库。

  5. CreateCommand():创建一个与连接关联的新 SqlCommand 对象,用于执行SQL命令。

  6. BeginTransaction():开始数据库事务。

  7. EnlistDistributedTransaction():将连接与分布式事务相关联,用于分布式事务处理。

  8. GetSchema():获取数据库的模式信息。

连接字符串有多种传值方式,最优的是配置传值

构造函数传值,调用ConnectionString直接传值,使用SqlConnectionStringBuilder生产对应的构建器构建,放到config中读取

 

sqlcommend

常见属性:

  1. CommandText:获取或设置要执行的SQL命令文本。

  2. CommandType:获取或设置SQL命令的类型,通常是 Text(普通文本命令)或 StoredProcedure(存储过程)。

  3. Connection:获取或设置与 SqlCommand 相关联的 SqlConnection 对象,用于执行命令。

  4. Parameters:获取包含与SQL命令相关的参数的 SqlParameterCollection 对象,可用于传递参数给SQL命令。

  5. Transaction:获取或设置与 SqlCommand 相关联的事务,以便在事务内执行命令。

常见方法:

  1. ExecuteReader():执行SQL查询命令并返回一个 SqlDataReader 对象,用于检索查询结果。

  2. ExecuteNonQuery():执行SQL命令,如插入、更新或删除数据,返回受影响的行数。

  3. ExecuteScalar():执行SQL命令并返回结果集的第一行第一列的值。

  4. ExecuteXmlReader():执行SQL命令并返回一个 XmlReader 对象,用于检索XML格式的结果。

  5. Prepare():为命令的执行做准备,通常用于执行多次相同命令的情况,以提高性能。

  6. Cancel():尝试取消正在执行的命令。

 

SqlParameter

常见属性:

  1. ParameterName:获取或设置参数的名称,通常以 @ 开头。

  2. Value:获取或设置参数的值。

  3. DbType:获取或设置参数的数据类型,用于指定参数的数据类型,例如整数、字符串、日期等。

  4. Direction:获取或设置参数的方向,包括输入参数、输出参数和双向参数。

  5. Size:获取或设置参数的大小,用于指定字符串参数的最大长度。

  6. IsNullable:获取或设置一个值,指示参数是否可为空。

  7. SourceColumn:获取或设置参数值的源列名称,通常用于数据同步和更新操作。

常见方法:

  1. ResetDbType():重置参数的数据类型为默认类型。

  2. ResetSize():重置参数的大小为默认大小。

  3. ResetValue():重置参数的值为默认值。

sqlCommand.Parametes.Add()用于给command添加参数

现在使用AddWithValue("","")添加单个参数不用实例化一个SqlParameter类

AddRange()添加一个SqlParameter数组

 

SqlDataReader

该类对象只能进行读取操作不能进行修改,该类会一直占用连接直到执行完毕,此期间其余的操作都会处于等待状态因此当操作完必须关闭连接

常见属性:

  1. FieldCount:获取查询结果集中的列数。

  2. Item[string name]:通过列名获取当前行中列的值。

  3. Item[int index]:通过列的索引获取当前行中列的值。

  4. HasRows:检查查询结果集是否包含至少一行数据。

  5. IsClosed:检查 MySqlDataReader 是否已经关闭。

常见方法:

  1. Read():将 MySqlDataReader 移动到查询结果集中的下一行,返回 true 表示有更多行可读,false 表示已经到达结果集的末尾。

  2. GetName(int index):通过列的索引获取列的名称。

  3. GetOrdinal(string name):通过列的名称获取列的索引。

  4. IsDBNull(int index):检查指定列是否包含 NULL 值。

  5. GetValue(int index):获取指定列的值,返回一个 object 类型的值。

  6. GetBoolean(int index):获取指定列的布尔值。

  7. GetInt32(int index):获取指定列的整数值。

  8. GetString(int index):获取指定列的字符串值。

  9. GetDateTime(int index):获取指定列的日期时间值。

  10. GetDecimal(int index):获取指定列的十进制数值。

  11. Close():关闭 MySqlDataReader 对象,释放与之关联的资源。

DataSet和DataTable,类似一个缓存中的数据库和表,即把从数据库中读取到的数据储存到内存中,则使用DataSet和DataTable进行储存

一个DataTable只能属于一个DataSet

DataRelation用于描绘表之间的关系

SqlDataAdapter用于数据库和dataset之间的适配器,可以将数据库的数据中获取并填充到dataset中,变为离线数据,这时候就可以断开和数据库的连接,避免连接的占用,也可以将修改后的离线数据上传会数据库进行数据更新

DataTable

常见属性:

  1. Columns:获取 DataColumnCollection 对象,表示表格的列集合,可以用于添加、删除、和操作列。

  2. Rows:获取 DataRowCollection 对象,表示表格的行集合,可以用于添加、删除、和操作行。

  3. TableName:获取或设置表格的名称。

  4. PrimaryKey:获取或设置一个 DataColumn 数组,表示表格的主键列。

  5. DefaultView:获取一个 DataView 对象,允许对表格进行排序、过滤和搜索。

  6. Constraints:获取 ConstraintCollection 对象,用于定义表格的约束条件,例如唯一性约束和外键约束。

常见方法:

  1. NewRow():创建一个新的 DataRow 对象,该对象具有与表格相同的结构。

  2. Load(IDataReader reader):从一个实现了 IDataReader 接口的数据源中加载数据到表格。

  3. LoadDataRow(Object[] values, bool fAcceptChanges):加载一个数据行数组到表格中,并根据需要接受更改。

  4. ImportRow(DataRow row):将指定的数据行导入到表格中,保留原始数据行的状态。

  5. Clear():删除表格中的所有数据行。

  6. AcceptChanges():将所有未提交的更改应用到表格,并清除更改状态。

  7. RejectChanges():取消表格中所有未提交的更改,恢复到原始数据状态。

  8. Compute(string expression, string filter):计算符合指定过滤条件的数据行的表达式值。

  9. Select(string filter, string sort):根据指定的过滤条件和排序条件返回一个 DataRow[] 数组。

  10. Copy():创建一个具有相同结构和数据的新 DataTable

  11. Clone():创建一个具有相同结构但不包含数据的新 DataTable

  12. BeginLoadData():开始加载数据时,可以提高性能。

  13. EndLoadData():结束加载数据时,可以提高性能

  14. Merge() : 合并一个和自己结构相同的Table并生成一个新的Table

DataSet

常见属性:

  1. Tables:获取 DataTableCollection 对象,表示 DataSet 中包含的所有表格的集合。您可以通过这个属性访问和操作各个表格。

  2. Relations:获取 DataRelationCollection 对象,表示 DataSet 中表格之间的关系。可以用于定义和操作表格之间的关系,如主从关系。

  3. DataSetName:获取或设置 DataSet 的名称。

  4. Namespace:获取或设置 DataSet 的命名空间。

常见方法:

  1. ReadXml(string fileName):从 XML 文件中读取数据,将其填充到 DataSet 中。

  2. WriteXml(string fileName):将 DataSet 中的数据写入到 XML 文件中。

  3. AcceptChanges():将 DataSet 中所有表格的未提交更改应用,清除更改状态。

  4. RejectChanges():取消 DataSet 中所有表格的未提交更改,恢复到原始数据状态。

  5. Clear():从 DataSet 中删除所有的表格和关系。

  6. Clone():创建一个具有相同结构但不包含数据的新 DataSet

  7. Copy():创建一个新的 DataSet,其中包含与原 DataSet 相同的数据。

  8. GetChanges():获取包含 DataSet 中所有表格的未提交更改的 DataSet

  9. GetXml():将 DataSet 中的数据以 XML 字符串的形式返回。

  10. HasChanges():检查 DataSet 中是否有未提交的更改。

  11. Merge(DataSet dataSet):将另一个 DataSet 的数据合并到当前 DataSet 中。

  12. Tables.Add():向 DataSet 中添加一个新的 DataTable

  13. Relations.Add():向 DataSet 中添加一个新的表格关系

DataRelation

常见属性:

  1. ChildColumns:获取一个 DataColumn 数组,表示子表格中与关系相关联的列。

  2. ChildKeyConstraint:获取 ForeignKeyConstraint 对象,表示子表格中与关系相关联的外键约束。

  3. ParentColumns:获取一个 DataColumn 数组,表示父表格中与关系相关联的列。

  4. ParentKeyConstraint:获取 UniqueConstraint 对象,表示父表格中与关系相关联的唯一约束。

  5. RelationName:获取或设置关系的名称。

  6. Nested:获取或设置一个布尔值,指示关系是否为嵌套关系。嵌套关系是一种层次化的关系,用于表示父子关系。

常见方法:

  1. SetNested():将关系设置为嵌套关系。

  2. ToString():返回关系的字符串表示形式,通常是关系的名称。

 

SqlDataAdapter

常见属性:

  1. SelectCommand:获取或设置用于从数据库中检索数据的 SqlCommand 对象。

  2. InsertCommand:获取或设置用于向数据库中插入数据的 SqlCommand 对象。

  3. UpdateCommand:获取或设置用于更新数据库中数据的 SqlCommand 对象。

  4. DeleteCommand:获取或设置用于从数据库中删除数据的 SqlCommand 对象。

  5. TableMappings:获取一个 DataTableMappingCollection 对象,用于将数据库表格和 DataSet 中的表格进行映射,以便填充数据。

常见方法:

  1. Fill(DataSet dataSet):从数据库中检索数据并将其填充到指定的 DataSet 中。

  2. Update(DataSet dataSet):将 DataSet 中的数据更改提交回数据库,用于更新、插入和删除操作。

  3. FillSchema(DataSet dataSet, SchemaType schemaType):仅填充数据架构(表格结构)到 DataSet,而不包括实际数据。

  4. Dispose():释放 SqlDataAdapter 对象所使用的资源。

  5. 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>