ADO.NET

You might also like

You are on page 1of 34

ADO.

NET
12.2.2 ADO.NET体系结构
.NET Data Provider

 .NET Data Provider是指访问数据源的一组类库,包


含的4个对象。
对象名称 功能说明
Connection 提供和数据源的连接功能。
Command 用来执行SQL语句。
DataAdapter 是DataSet对象和数据源间的桥梁。
DataAdapter使用4个Command对象来运行查询、
新建、修改、删除的SQL命令,把数据加载到
DataSet,或者把DataSet内的数据送回数据源。
DataReader 通过Command对象运行SQL取得数据流,以便
进行只进、只读的数据浏览。
.NET Data Provider

在.NET Framework中常用的有如下4组数据提供程序:

 (1)SQL.NET Data Provider:用来访问SQL Server


数据库。

 (2)OLEDB.NET Data Provider:用来访问Oledb数


据源。

 (3)ODBC.NET Data Provider:用来访问ODBC 数据


 (4)ORACLE.NET Data Provider :用来访问Oracle


数据库的连接
DataSet

 在内存中的临时数据库。

 断开式数据操作。

 其实就是一个存放在内存中的数据暂存区,这些数据
必须通过DataAdapter对象与数据库进行数据交换。

 在DataSet内部允许同时存放一个或多个不同的数据
表(DataTable)对象。
DataSet
ADO.NET数据库的访问流程1

① 建立Connection对象,创建一个数据库连接。
② 使用Command对象对数据库发送新增删查等命令。
③ 执行CUD操作。

创建DataReader对象读取数据。
ADO.NET数据库的访问流程2

① 建立Connection对象,创建一个数据库连接。
② 使用Command对象对数据库发送新增删查等命令。
③ 创建DataAdapter对象,从数据库中取得数据。
④ 创建DataSet对象,将DataAdapter对象填充到DataSet对
象(数据集)中。
⑤ 如果需要,可以重复操作,一个DataSet对象可以容纳多
个数据集合。
⑥ 关闭数据库。
⑦ 在DataSet上进行所需要的操作。为了将一个DataSet数
据集的数据输出到窗体中或者网页上,需要设定数据显
示控件的数据源为该数据集。
SqlConnection对象

属性 说 明
ConnectionString 获取或设置用于打开数据库的字符串。
ConnectionTimeo 获取在尝试建立连接时终止尝试并生
ut 成错误之前所等待的时间。
Database 获取当前数据库或连接打开后要使用
的数据库的名称。
DataSource 获取数据源的服务器名或文件名。
Provider 获取在连接字符串的“Provider=”子
句中指定的SQL提供程序的名称。
State 获取连接的当前状态。
SqlConnection对象

方法 说 明
Open 使用 ConnectionString 所指定的属性设置
打开数据库连接。
Close 关闭与数据库的连接。这是关闭任何打开
连接的首选方法。
CreateCommand 创建并返回一个与 SqlConnection 关联的
SqlCommand 对象。
ChangeDatabase 为打开的SqlConnection 更改当前数据库。
建立连接字符串ConnectionString

 先创建一个SqlConnection对象,将其
ConnectionString属性设置为如下值:

"Data Source=LCB-PC\SQLEXPRESS;Initial
Catalog=Stud;User ID=sa;Password=12345"
ConnectionString中的常用的关键字值

Data Source:指定要连接的数据库实例或网络地址。
Initial Catalog(或Database):要连接的数据库名称。
Integrated Security(或Trusted_Connection):当为
False(默认)时,将在连接中指定用户ID和密码;为
True时,将使用当前Windows帐户凭据进行身份验证。
Persist Security Info:当该值设置为False(默认)或no
(推荐)时,如果连接是打开的或者一直处于打开状态
,那么安全敏感信息(如密码)将不会作为连接的一部
分返回。重置连接字符串将重置包括密码在内的所有连
接字符串值。
User ID:登录帐户。
Password(或Pwd):登录密码。
将连接字符串存放在配置文件中

 可以在配置文件中保存连接字符串,例如:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="connStr"
connectionString="server=.;database=mydb;uid=zhangsan;pwd=123"/
>
</connectionStrings>
</configuration>

static string connString =


ConfigurationManager.ConnectionStrings["connStr"].ConnectionStrin
g;
using语句

 主要用于自动释放用于存储不再需要的对象的内存,避
免内存泄漏。

 为using语句提供的对象必须实现 IDisposable接口。
此接口提供了 Dispose 方法,该方法将释放此对象的资
源。。

 using最为广泛的应用:数据库操作

 using 等同于 try...finally


SqlCommand 对象

 一般对数据库的操作被概括为CRUD—Create、Read、
Update和Delete。在ADO.NET中定义SqlCommand 类去执
行这些操作。
SqlCommand 对象

属性 说 明

CommandText 获取或设置要对数据源执行的 T-SQL 语句或存储过程。

CommandTimeout 获取或设置在终止执行命令的尝试并生成错误之前的等
待时间。

CommandType 获取或设置一个值,该值指示如何解释CommandText属
性。

Connection 数据命令对象所使用的连接对象

Parameters 参数集合(SqlParameterCollection)
SqlCommand 对象

方法 说 明
CreateParamet 创建SqlParameter对象的新实例。
er
ExecuteNonQu 针对Connection 执行SQL语句并返回
ery 受影响的行数。
ExecuteReader 将CommandText发送到Connection并
生成一个SqlDataReader。
ExecuteScalar 执行查询,并返回查询所返回的结果
集中第一行的第一列。忽略其他列或
行。
创建SqlCommand 对象

 SqlCommand 类的主要构造函数如下:

SqlCommand ();

SqlCommand (cmdText);

SqlCommand (cmdText,connection);

 其中,cmdText参数指定查询的文本。connection参数
是一个SqlConnection,它表示到SQL Server数据库的
连接。
创建SqlCommand 对象

string mystr = System.Configuration.ConfigurationManager.


ConnectionStrings["myconnstring"].ToString();
myconn.ConnectionString = mystr;
myconn.Open();
SqlCommand mycmd = new SqlCommand("SELECT * FROM
student“,myconn);
mycmd.Connection=myconn;
SqlCommand的方法

 ExecuteScalar方法执行返回单个值的SQL命令。

 ExecuteNonQuery方法执行不返回结果的SQL命令。

该方法主要用来更新数据,通常使用它来执行UPDATE、
INSERT和DELETE语句。

该方法不返回行,对于UPDATE、INSERT和DELETE语句,
返回值为该命令所影响的行数,对于所有其他类型的语
句,返回值为-1。
SqlDataReader对象

 当执行返回结果集的命令时,需要一个方法从结果集中
提取数据。处理结果集的方法有两个:
(1)使用SqlDataReader对象;
(2)同时使用SqlDataAdapter对象和DataSet对象。
SqlDataReader类的属性和方法

属性 说明
FieldCount 获取当前行中的列数
IsClosed 获取一个布尔值,指出SqlDataReader对象是否关闭
RecordsAffected 获取执行SQL语句时修改的行数

方法 说明
Read 将SqlDataReader对象前进到下一行并读取,返回布尔值指示是否
有多行
Close 关闭SqlDataReader对象
IsDBNull 返回布尔值,表示列是否包含NULL值
NextResult 将SqlDataReader对象移到下一个结果集,返回布尔值指示该结果
集是否有多行
GetString 返回指定列的值,类型为字符串
GetInt32 返回指定列的值,类型为整型值
GetDouble 返回指定列的值,类型为双精度值
GetDataTime 返回指定列的值,类型为日期时间值
GetOrdinal 返回指定列的序号或数字位置(首列序号为0)
创建SqlDataReader对象

 SqlDataReader对象不能使用new来创建。
 通常调用Command类的ExecuteReader方法,这个方法将
返回一个DataReader对象。例如:
SqlCommand cmd = new SqlCommand
(CommandText,ConnectionObject);
SqlDataReader myreader = cmd.ExecuteReader();
遍历SqlDataReader对象的记录

 当ExecuteReader方法返回DataReader对象时,当前光
标的位置是第一条记录的前面。必须调用Read方法把光
标移动到第一条记录,然后,第一条记录将变成当前记
录。
经常使用while循环来遍历记录:
while (myreader.Read())
{
//读取数据
}
访问字段中的值

(1)Item属性
 每一个DataReader对象都定义了一个Item属性,此属性
返回一个代码字段属性的对象。Item属性是DataReader
对象的索引。Item属性总是基于0开始编号的:
myreader[FieldName]
myreader[FieldIndex]
(2)Get方法
每一个DataReader对象都定义了一组Get方法,那些方法
将返回适当类型的值。例如:
myreader.GetString(1)
SqlDataReader特点

 注意:使用时必须保证连接是打开的
 说明:每个读取对象都单独占用一个连接
 属性HasRows判断是否结果集中有行
 通过索引器reader[index]读取结果集中某列的数据,注
意索引从0开始
 如果访问的值为null则会报错,所以需要使用
reader.IsDbNull(index)进行非空验证
 如果执行了多个查询语句则会返回多个结果集,使用
NextResult()方法。通过do-while循环遍历
SQL语句参数化

 格式:@参数名
 例如,UPDATE course SET cName = @Name WHERE cID
= @ID
 其中@ID和@Name均为参数,在执行该语句之前需要为参
数赋值。
 可以用以下命令向Parameters参数集合中添加参数值:
 mycmd.Parameters.Add("@Name",SqlType.VarChar,10)
.Value = Name1;
 mycmd.Parameters.Add("@ID",
SqlType.VarChar,5).Value = ID1;
SQL语句参数化

 再如:
cmd.CommandText = "select * from [user] where
uUserName=@UserName and uPwd=@Password";
cmd.Parameters.Add(new SqlParameter(“@UserName
","admin"));
cmd.Parameters.Add(new SqlParameter(“@Password
",password));
 参数在SQLServer内部不是简单的字符串替换,
SQLServer直接用添加的值进行数据比较,因此不会有注
入漏洞攻击。
连接池

 Ado.Net默认启用了连接池
 禁用连接池:在连接字符串中,设置Pooling=false;
 Ado.net连接池使用总结:
 1.第一次打开连接会创建一个连接对象
 2.当这个连接关闭时(调用Close()方法时)会将当前那个连接对象放入池中
 3.下一个连接对象,如果连接字符串与池中现有连接对象的连接字符串完全一致,
则会使用池中的现有连接,而不会重新创建一个
 4.只有对象调用Close(),的时候才会放入池中,如果一个连接对象一直在使用,则
下次再创建一个连接对象发现池中没有,也会再创建一个新连接对象
 5.在池中的连接对象,如果过一段时间没有被访问则自动销毁
 6.使用建议:尽量晚打开,尽量早关闭
SqlDataAdapter

 SqlDataAdapter对象可以执行SQL命令以及调用存储过
程、传递参数,最重要的是取得数据结果集,在数据库
和DataSet对象之间来回传输数据。
SqlDataAdapter类的方法

方法 说明
Fill 用来自动执行SqlDataAdapter对象的
SelectCommand属性中相对应的SQL语句,以检索
数据库中的数据,然后更新数据集中的DataTable对
象,如果DataTable对象不存在,则创建它
FillSchem 将DataTable添加到DataSet中,并配置架构以匹配
a 数据源中的架构
GetFillPar 获取当执行SQL SELECT语句时由用户设置的参数
ameters
Update 用来自动执行UpdateCommand、InsertCommand
或DeleteCommand属性相对应的SQL语句,以使数
据集中的数据来更新数据库。
使用Fill方法

 Fill方法用于向DataSet对象填充从数据源中读取的数据。
调用Fill方法的语法格式有多种,常见的格式如下:

 SqlDataAdapter对象名.Fill(DataSet对象名,"数据表名
");

 第一个参数是数据集对象名,表示要填充的数据集对象;
第二个参数是一个字符串,表示在本地缓冲区中建立的临
时表的名称。

 例如,以下语句用course表数据填充数据集mydataset1:

SqlDataAdapter1.Fill(mydataset1,"course");
使用Update方法

 Update方法用于将数据集DataSet对象中的数据按
InsertCommand属性、DeleteCommand属性和UpdateCommand
属性所指定的要求更新数据源,即调用3个属性中所定义的
SQL语句来更新数据源。调用格式如下。

 SqlDataAdapter对象名.Update(DataSet对象名,[数据表名
]);

 第一个参数是数据集对象名,表示要将哪个数据集对象中
的数据更新到数据源中;第二个参数是一个字符串,表示
临时表的名称。
DataSet与DataTable

DataSet:存在于内存中的临时数据库,数据集
DataTable:临时表
为临时数据库创建表,并添加到临时数据库中:
ds.Tables.Add(dt);
为表中创建列DataColumn:需要指定列名、列数据类型:
dt.Columns.Add(dc1);
增加行数据:dt.Rows.Add(...)//如果有自动增长列,则这
么写就不正确了
DataRow dr=dt.NewRow();
dr[int]或dr[string]访问行中的某列
查询数据库中的数据加到datatable上,再绑定到
datagridview上
使用SqlDataAdapter实现
可以使用sda.SelectCommand进行参数设置

You might also like