ADO.NET笔记二

一、 The Connection Class (实现接口 IDbConnection

作用:在对数据库操作 ( 增、删、查、改 ) 前连接数据库。

接口 IDbConnection 规定了 Connection 类必须实现的属性和方法。

connection string

l  一组用分号(;)分隔的 name/value 组成的字符串,顺序和大小写无关。

l  不同的 RDBMS provider connection string 不同。

如:

Sqlserver

l  Data Source =localhost; Initial Catalog =Northwind; user id =sa;password =openesame

l  Data Source =localhost; Initial Catalog =Northwind; Integrated Security=SSPI

OLE DB

l  Data Source =localhost; Initial Catalog =Northwind; user id =sa;password =openesame; Provider=MSDAORA  ( 注:表明用的是 MSDAORA OLE DB provider )

Data Source =localhost; Initial Catalog =Northwind; Integrated Security=SSPI

Access database file

Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:/DataSources/Northwind.mdb

 

 

 

Connection 对象中 connection string 参数的传递两种方式:

1.         构造函数参数。

2.         手动添加属性。

connection string 参数一般放在配置文件里,不要硬编码。

如: web.config

<configuration>

<connectionStrings>

<add name="Northwind" connectionString=

"Data Source=localhost; Initial Catalog=Northwind; Integrated Security=SSPI"/>

</connectionStrings>

...

</configuration>

 

程序中检索 connection string

 

using System.Web.Configuration;

string connectionString =

WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

 

确保 Connection 对象释放的两种方式:

数据库连接是有限资源,必须确保使用完后及时释放。

1.         try-catch-finally

将释放语句放在 finally 中。

2.         using 程序块

将访问数据语句放到 using 块中,此块中对象必须实现接口 Idisposable,当程序运行完此块或异常退出时,CLR会立即调用对象的Dispose()方法来释放相关对象。

    Connection对象的Dispose()方法和Close()方法是一样的。

 

Connection Pooling (连接池)

l  连接池维持多个连接,当用时从连接池取,用完后放回连接池。 这样高效,不用随时 open close

l  当用连接池时,调用 Connection 对象的 Open() 方法时,会从连接池取得连接,当调用 Dispose() 方法或 Close() 方法 将连接放回连接池。

l  ADO.NET并无连接池机制,相反,各provider一般提供了连接池的实现。

 

the SQL Server Oracle provider, 在默认状态下,其连接池是自动打开和应用的。

 

连接池参数:

l  Max Pool Size (默认 100 连接池中允许存放的连接的最大数量,如果最大数量的连接已经被应用,那么下一个连接要求将会排队等待被释放的可用的连接。(如果排队等候的时间大于 Connection.Timeout ,则将会有错误出现)。

l  Min Pool Size (默认 0 ): 通常连接池中连接的最小数目,当系统初始创建第一个连接时,将会在连接池中创建数目为 Min Pool Size 的连接,所以系统首次访问数据库时,会有少许延迟。

l  Pooling (默认true: 如果true ,则使用连接池。

l  Connection Lifetime (默认0 ,即关闭此功能): 当一个连接使用完后释放回连接池,如果当前时间减去该连接建立的时间的值大于 Connection Lifetime 设定的值(秒),该连接被销毁。

 

二、 The Command and DataReader Classes

Command

Command 对象执行命令前必须先设置属性: CommandType, CommandText, and Connection

Values for the CommandType Enumeration

l  CommandType.Text (默认为此值 ): command 将执行对象的属性 CommandText 中存储的 sql 语句。

l  CommandType.StoredProcedure comman d 将执行数据库中的 stored procedure ,属性 CommandText 中值为 stored procedure 的名字。

l  CommandType.TableDirect (不提倡用): command 将会将属性 CommandText 中存储的表的值全部检索出来, mssql provider 不支持此功能。

 

Command 对象的三个方法:

l  ExecuteNonQuery() :执行非选择命令( insert,delete,update 等), 返回值为影响的行数,还可用来执行数据定义命令,如 create, alter, or delete database objects(such as tables, indexes, constraints).

l  ExecuteScalar() :执行 SELECT query ,并返回查询集合的第一行中第一个字段的值。应用 : COUNT() or SUM() 等。

l  ExecuteReader() :执行 SELECT query 并返回一个 DataReader 对象( readonly, forward-only cursor. )。

 

DataReader

 

DataReader是连接相关的,其查询的数据是在数据库中,而不是在程序中,DataReader相当于在数据库中放了个指针,一旦连接断开就无法读取数据了,

 

优点: forward-only, read-only 所以高效。

缺点:无排序,

 

DataReader 的方法:

l  Read() :将行指针移动到下行。 在读第一行数据时,此方法必须被调用。值为 true 表示还有一行可读 s ,如果为 false 表示没值了。

l  GetValue()

l  GetValues() :将当前行的各字段值保存到一个数组(数组长度大于字段数,如果小于字段数则只存一部分)中。 DataReader.FieldCount property 字段数量)。

l  GetInt32(),GetChar(),GtDateTime(), GetXxx()

l  NextResult()

 

CommandBehavior 列举

当执行 ExecuteReader() 重载方法 ExecuteReader(System.Data.CommandBehavior) ; 如果参数为 System.Data.CommandBehavior.CloseConnection ,则当 DataReader 关闭时,其相关的连接也立即关闭。如果用 id 检索一条记录时,用 System.Data.CommandBehavior .SingleRow 可提高性能。

 

处理多结果集

如果 Command 对象的 CommandText 为多 select 语句组成字符串,则执行后返回的 DataReader 包含多结果集,执行 NextResult() 方法可移动到下一个结果集。

 

 

ExecuteNonQuery() 方法

 

执行非选择命令( insert,delete,update 等), 返回值为影响的行数,如果执行命令不是 insert,delete,update 等则 返回 -1

Using Parameterized Commands

能不被 SQL injection 攻击。因为他不是简单的拼字符串,而是整个的作为一个值。可用 event validation. 来预防 post injection 攻击。

如:

Sql 语句中占位符 @CustID

SqlCommand cmd = new SqlCommand(sql, con);

cmd.Parameters.AddWithValue("@CustID", txtID.Text);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值