目录
知识点小结(CommandType和CommandBehavior)
前言
昨晚和小伙伴研究了一下SQLHelper中的一下代码,发现知识知道怎么运行,出什么结果,但是并不知道都是干什么的。今天上午花了半个小时有研究了一下,研究的比以前稍微懂一点了,暂时趁热做一个总结,后续再继续优化。
详细介绍
ADO.NET对象模型最主要的四个组成部分分别是Connection(SQLConnection)、Command(SQLCommand)、DataReader(SQLDataReader),DataAdapter(SQLDataAdapter)。这几种模型在进行C#重构的时候会用到,而且非常明显的作用,此时会感觉到语言的强大性。
我们知道,在对一些数据进行查询的时候,大概经历下面几个过程:连接数据库→访问执行命令→返回执行命令的结果并且进行处理→关闭连接
1.首先最基本的是Connection(SqlConne);
其中要作用就是连接数据库。我们首先需要引用命名空间System.Data.SqlClient(using System.Data.SqlClient);接着创建SQLConnection类型的实例对象SqlConnection,为其属性ConnectionString赋值连接字符串;然后调用Open()方法,这就完成了数据库的连接操作;最后记得在完成访问数据操作之后,调用Close()方法,关闭连接。
常用方法:
Open():使用COnnectionString中指定的属性设置数据库连接。
Close():关闭数据库连接。
常用属性:
ConnectionString:获取或设置用来打开SQLServer数据库的连接字符串
ConnectionTimeout:获取等待时间,即终止尝试连接操作或者返回错误信息之前的等待时间。
DataSource:获取要连接的SQL Server实例名称。
Database:获取数据库的名称。
2.其次是command(SqlCommand)
在成功连接数据库之后,就要对数据库进行访问操作,也就是数据的增删改查工作,SQLCommand类最基本常用的属性和方法如下所示(其他的不在这里列举,读者可自行查询)
方法:
ExecuteNonQuery():用于执行SQL语句,该方法用于不需要返回任何记录的情况(例如,INSERT,DELETE或UPDATE查询)
ExecuteReader():用于执行SQL语句并返回一组数据。
ExecuteScalar():用于执行查询,并返回查询所返回的结果集中第一行第一列的内容,其他内容将被忽略。
ExecuteXmlReader():以XmlReader 形式返回结果集。
属性:
CommandText:设置对数据源执行的文本命令
CommandTimeout:等待时间
CommandType:对CommandText属性的解释(枚举,其中包括StoredProcedure、TableDirect和Text)
Connection:数据库连接。
Parameters:Parameter对象的集合
ExecuteReader()方法
3、DataReader(SQLDataReader)
DataReader用于从数据源获取只读且只进的数据集。DataReader是在查询的过程中获取数据,而不是等待查询结束。
DataReader通过Command对象的ExecuteReader() 方法获得,
机房七层解释
接下来以机房重构七层为例来大概介绍一下。
1.我们知道D层是数据访问层,在D层都有一个SQLHelper的实例化,通过转定义(F12)我们可以发先此作用是进行数据库的连接,但是此时并没有连接成功,因为此时并没有Open()【也就是打开数据库】。
2.接下来D层要进行的任务就是进行传参和sql语句,
3.当参数都传完之后就要进行数据的查询,此时开始调用sqlHelper中相应的方法。
4.在相应的方法中,我们会发现第一步工作时进行实例化一个内存表,此作用是将查询的数据存入到实例化的表中,便于读取使用。当内存表有了之后,就开始打开数据库(下图中的Getconn方法),通过sqlcommand然后开始进行查询。
comtext:是D层传过来的string SQL语句, GetConn是调用一个打开数据库的方法。
cmd.CommandType=ct:命令对象的执行形式数text型。(下面介绍一下CommandType)
5.所有准备工作结束之后就开始执行命令,
ExecuteReader():用于执行SQL语句并返回一组数据。
commandBehavior是一个枚举(下面会介绍一下)。
dt.Load():加载定义的内存表。最后就是Return(返回表到D层);
【Using:此作用非常强大,此链接可以帮到你。 using的强大作用】
知识点小结(CommandType和CommandBehavior)
这两个都是枚举类型。
1.Commandtype:
CommandType.Text代表执行的是SQL语句
CommandType.StoreProcedure代表执行的是存储过程【七层会常用到这两种类型】
CommandType.TableDirect:需要将CommandText属性设为要访问的表的名称,执行后返回该表的所有行和列。
public enum CommandType
{
//
// 摘要:
// SQL 文本命令。 (默认。)
Text = 1,
//
// 摘要:
// 存储过程的名称。
StoredProcedure = 4,
//
// 摘要:
// 表的名称。
TableDirect = 512
}
2.CommandBehavior
#region 程序集 System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll
#endregion
namespace System.Data
{
//
// 摘要:
// 提供查询结果及其对数据库的影响的说明。
[Flags]
public enum CommandBehavior
{
//
// 摘要:
// 查询可能返回多个结果集。 执行查询可能会影响数据库状态。 Default 未设置 System.Data.CommandBehavior 标志,因此调用
// ExecuteReader(CommandBehavior.Default) 在功能上等效于调用 ExecuteReader()。
Default = 0,
//
// 摘要:
// 查询返回单个结果集。
SingleResult = 1,
//
// 摘要:
// 查询仅返回列信息。 使用 System.Data.CommandBehavior.SchemaOnly 时,用于 SQL Server 的 .NET Framework
// 数据提供程序在要执行的语句前加上 SET FMTONLY ON。
SchemaOnly = 2,
//
// 摘要:
// 查询返回列和主键信息。
KeyInfo = 4,
//
// 摘要:
// 查询应返回结果集中的单行。 执行查询可能会影响数据库状态。 某些 .NET Framework 数据提供程序可能(但不要求)使用此信息来优化命令性能。 使用
// System.Data.OleDb.OleDbCommand 对象的 System.Data.OleDb.OleDbCommand.ExecuteReader
// 方法指定 System.Data.CommandBehavior.SingleRow 时,用于 OLE DB 的 .NET Framework 数据提供程序使用
// OLE DB IRow 接口(如果可用)执行绑定。 否则,它使用 IRowset 接口。 如果期望 SQL 语句仅返回一行,则指定 System.Data.CommandBehavior.SingleRow
// 也可提高应用程序性能。 执行应返回多个结果集的查询时,可指定 SingleRow。 在这种情况下,如果同时指定了多结果集 SQL 查询和单行,返回的结果仅包含第一个结果集的第一行。
// 不返回查询的其他结果集。
SingleRow = 8,
//
// 摘要:
// 提供一种方法,以便 DataReader 处理包含带有大型二进制值的列的行。 SequentialAccess 不是加载整行,而是使 DataReader
// 能够以数据流的加载数据。 然后可以使用 GetBytes 或 GetChars 方法来指定开始读取操作的字节位置,以及正在返回的数据的有限缓冲区大小。
SequentialAccess = 16,
//
// 摘要:
// 执行命令时,关闭关联的 DataReader 对象时,关联的 Connection 对象也会关闭。
CloseConnection = 32
}
}
关于DataAdapter(数据适配器)
数据适配器DataAdapter 用来从数据库中读取数据,并将数据填充到DataSet以及DataTable中;同时,DataSet和DataTable还可以将数据写回到数据库中,完成数据库中数据的更新。使用DataAdapter获取数据库数据的流程:连接数据库(连接数据源) —> 获取数据库中的数据 —> 使用DataAdapter填充到DataSet和DataTable中。
一、特点介绍
1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
DataAdapter和DataReader的工作原理
二、DataAdapter和DataReader
DataReader是一个向前的指针,本身并不包含数据,调用一次Read()方法它就向前到下一条记录,一个DataReader必须单独占用一个打开的数据库连接!
DataAdapter象一座桥梁,一头连起数据库表,一头连起一个DataSet或者DataTable,在把数据库中的数据填充到DataSet或DataTable后就可以“过河拆桥”,不用再连接到数据库,而可以直接从DataSet或DataTable中获取数据。
DataReader只能读取数据库,而且所操作的表必须处于连接状态,但是要对数据库进行写操时,只能借助Command类, DataAdapter它建立在Command对象之上,它具有Command类的一切功能,能够
将数据填充到DataSet对象中,而且不用再连接到数据库,而可以直接从DataSet或DataTable中获取数据。(因为它采用的无连接传输模式)
使用DataReader对象可以从数据库中得到只读的、只能向前的数据流,还可以提高应用程序的性能,减少系统开销,同一时间,只有一条行记录在内存中。
DataAdapter对象可以自动打开和自动关闭数据库连接,适配器的主要工作流程:Connection对象建立与数据源的连接, DataAdapter对象经由Command对象返回给DataAdapter,最后将DataAdapter对象加入到DataSet对象的DataTables对象中。
另外,从数据量级来说,DataAdapter的Fill过程较慢(写内存),一般用于小型数据处理;DataReader,一般用于大型数据处理。
Datareader
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
//实例化数据库内存中的一个表
DataTable dt = new DataTable();
//cmdText:查询的文本;getConn():连接数据库的方法
cmd = new SqlCommand(cmdText, GetConn());
//执行命令对象的执行形式,默认为Text
cmd.CommandType = ct;
//将参数加入到参数集中
cmd.Parameters.AddRange(paras);
//在执行命令时,将关联 Connection 对象已关闭时关联 DataReader 对象已关闭
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
//将提供的数据源中的值填充到DataTable,如果已存在,则合并
dt.Load(sdr);
}
//返回表到DAL层
return dt;
}
DataAdapter
public static DataTable GetDataTable(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
DataTable dt = new DataTable();
adapter.SelectCommand.Parameters.AddRange(ps);
adapter.Fill(dt);
return dt;
}
}