ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)
ADO.NET(一)
ADO.NET结构
命名空间(车延禄)
System.Data——
所有的一般数据访问类
System.Data.Common——
各个数据提供程序共享(或重写)的类
System.Data.Odbc—— ODBC提供程序的类
System.Data.OleDb—— OLE
DB提供程序的类
System.Data.Oracle—— Oracle提供程序的类
System.Data.SqlClient——
Sql Server提供程序的类
System.Data.SqlTypes—— Sql Server数据类型
System.Data命名空间中的类
DataSet——
这个对象主要用于断开连接,它包含一组DataTable,以及这些表之间的 关系。
DataTable—— 数据的一个容器,
DataTable由一个或多个DataColumn组成,每个DataColumn由一个或多个包含数据的 DataRow生成。
DataRow——
许多数值,类似于数据库表的一行,或电子数据表中的一行。
DataColumn—— 包含列的定义,例如名称和数据类型。
DataRelation——
DataSet 中两个DataTable之间的链接,用于外键码和主/从关系。
Constraint—— 为DataColumn
(或一组数据列)定义规则,例如惟一值。
特定数据库的类
SqlCommand、OleDbCommand、OracleCommand和ODBCCommand——
SQL语句的包装器或存储过程的调用。
SqlCommandBuilder、OleDbCommandBuilder、OracleCommandBuilder和ODBCCommand
Builder——
用于从一个select子句中生成SQL语句(例如INSERT、UPDATE和DELETE语句)的类。
SqlConnection、OleDbConnection、OracleConnection和ODBCConnection——
数据库连接。类似于ADO
Connection。
SqlDataAdapter、OleDbDataAdapter、OracleDataAdapter和ODBCDataAdapter——
用于存储选择、插入、更新和删除语句的类,因此可以用于生成DataSet和更新数据库。
SqlDataReader、OleDbDataReader、OracleDataReader和ODBCDataReader——
只向前的连接数据读取器。
SqlParameter、OleDbParameter、OracleParameter和ODBCParameter——
为存储过程定义一个参数。
SqlTransaction、OleDbTransaction、OracleTransaction和ODBCTransaction——数据库事务处理,包装在一个对象中。
ADO.NET类最重要的特性是它们可以使用断开连接的方式工作
SqlConnection对象
功能:建立与数据库的连接
功能:建立与数据库的连接
命名空间: System.Data.SqlClient
System.Data.SqlClient
属性:
ConnectionString: 设置连接字符串
设置连接字符串
“server=.;database=pubs;uid=sa;pwd=”
如果本机上运行多个 如果本机上运行多个 SqlServer SqlServer 实例,则 server server 属性后面应用 属性后面应用
\\实例名 来实现连接。
State:连接状态(打开,关闭)
方法:
Open():打开数据库连接 ;
Close():关闭数据库连接 ;
CreateCommand():返回SqlCommand类型
如:
using
System.Data.SqlClient;
// 设置连接字符串
string string
str="server=.;database=pubs;uid=sa;pwd=";
str="server=.;database=pubs;uid=sa;pwd=";
// 创建连接实例
SqlConnection
conn = new SqlConnection(str);
// 打开连接
conn.Open();
…………
…………
// 关闭连接
conn.Close();(车延禄)
一般情况下,当在.NET中使用“稀缺”的资源时,最好确保每个资源在使用后立即关闭。尽管.NET垃圾最终都会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。
当编写访问数据库的代码时,这是非常明显的,使用完数据库应当立即强制关闭数据库连接。
打开与关闭数据库链接的一般方法如下:
try
{
using (SqlConnection conn = new SqlConnection ( source ))
{
//打开链接
conn.Open ( ) ;
//执行数据库访问操作
//关闭连接
conn.Close ( ) ;
}
}
catch (Exception
e)
{
//异常处理
}
这里显式调用了Close(),但这是不必要的,因为using子句将确保在任何情况下都执行关闭操作。
using子句确保实现IDisposable接口的对象在退出块时立即被释放。无论块是如何退出的,using子句都会确保关闭数据库连接。无论在哪里获得资源,最好都使用using
()语句,因为尽管我们都会编写Close()语句,但有时会忘记,此时using子句就会发挥作用。
SqlCommand对象
功能:执行
Sql语句,对数据库进行操作。
属性:
CommandType: 执行的命令类型
StoredProcedure-执行存储过程
Text-执行
SQL语句
CommandText:要执行的存储过程或SQL语句
Connection:要使用的数据库连接
Parameters:参数集合
Transaction:获取或设置将在其中执行的command
事务
方法:
ExecuteReader():执行Sql语句,并返回SqlDataReader类型。主要用于对返回select语句的执行
ExecuteNonQuery():执行Sql语句,并返回影向的行数。主要用于对update,insert,delete语句的执行
ExecuteScalar():
执行Sql语句,返回首行首列。主要用于对返回单值的Sql查询语句的执行。如:count(*)
例:
string
str="server=.;database=pubs;uid=sa;pwd=";
SqlConnection conn = new
SqlConnection(str);// 创建连接 创建连接
conn.Open();//打开连接
////////////////////////////////
SqlCommand cmd = new SqlCommand(); //
生成Command实例
cmd.Connection = conn;
cmd.CommandType =
CommandType.Text; // 设置执行命令的格式
cmd.CommandText = “select count(*) from
employee”;//要执行的SQL
int count = (int)cmd.ExecuteScalar();
//执行命令,并返回首行首列
///////////////////////////////
conn.Close();//
关闭
使用Parameters向SQL语句传送查询参数
查执行SQL语句和存储过程的时候不可避免地会需要给SQL语句或存储过程传递值,这时请不要拼接SQL语句。而要使用Parameters属性向SqlCommand传递参数。
cmdTeacher.CommandText
= "SELECT * FROM teacher WHERE tno = @tno";
//添加参数
cmdTeacher.Parameters. cmd.Parameters.Add Add(“ @tno”,
SqlDbType.VarChar,50);
//给参数赋值
cmdTeacher.Parameters["@tno"].Value =
"t001";
也可以把上面的两句合并为一句
cmdTeacher.AddWithValue("@tno","t001");
调用存储过程
1.将SqlCommand的CommandType属性设为CommandType.StoredProcedure
2.将SqlCommand的CommandText属性设为存储过程的名称
使用输入参数:
略
使用输出参数:
存储过程的形参中需要添加输出参数output
C#主要代码如下:
...
cmd.Parameters.Add("@Code",SqlDbType.VarChar,50).Direction
= ParameterDirection.Output;
...
conn.Open();
cmd.ExecuteNonQuery();
string myCode =
cmd.Parameters["@Code"].ToString();
conn.Close();
此时的myCode中的值就是存储过程的输出参数。
使用返回值:
存储过程中默认自带一个@RETURN_VALUE的返回值参数。我们只需要通过读取@RETURN_VALUE参数的值就可以取出存储过程的返回值。
...
cmd.Parameters.Add("@RETURN_VALUE",SqlDbType.VarChar,50).Direction
= ParameterDirection.ReturnValue;
...
conn.Open();
cmd.ExecuteNonQuery();
string retValue =
cmd.Parameters["@RETURN_VALUE"].ToString();
conn.Close();
此时retValue中的值就是存储过程的返回值。
使用事务
在程序中要实现事务有两种实现的思路:
1.在存储过程中使用事务
2.在程序代码中使用事务
a.在存储过程中使用事务
begin
transaction
...
if @@ERROR <> 0
rollback
else
commit
transaction
b.在C#代码中使用事务SqlTransaction
应用程序通过在SqlConnection对象上调用BeginTransaction来创建SqlTransaction对象。
如:
SqlConnection myConnection = new SqlConnection(myConnString);
myConnection.Open();
SqlCommand myCommand =
myConnection.CreateCommand();
SqlTransaction myTrans;
myTrans = myConnection.BeginTransaction();
myCommand.Connection
= myConnection;
myCommand.Transaction =
myTrans;
try{
myCommand.CommandText = "Insert into …
VALUES (…)";
myCommand.ExecuteNonQuery();
myTrans.Commit();
}
catch(Exception e)
{
myTrans.Rollback();
}
finally {myConnection.Close(); }
还可以使用TransactionScope来使用事务
TransactionScope提供了对事务的轻量级的控制。(车延禄)
如:两个数据访问类:
public class
EMPDA
{
private SqlConnection conn;
public
EMPDA()
{
conn = new Conn().Connection;
}
public void insert(string username,string name)
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into emp values(@username,@name)";
cmd.Parameters.AddWithValue("@username",username);
cmd.Parameters.AddWithValue("@name",name);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
public class StudentDA
{
private SqlConnection conn;
public StudentDA()
{
conn = new Conn().Connection;
}
public void
insert(string username, string password,string nickname)
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into users
values(@username,@password,@nickname)";
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", password);
cmd.Parameters.AddWithValue("@nickname", nickname);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
对上面两个数据访问类使用事务
using (TransactionScope ts = new
TransactionScope())
{
new EMPDA().insert("cheyanlu",
"车延禄");
new StudentDA().insert("cheyanlu", "bbb",
"车延禄");
ts.Complete(); //事务提交
}
SqlDataReader对象:
用来读取数据库中返回记录的对象。
SqlDataReader类的构造函是受保护的,所以不能直接使用new关键字来实例化SqlDataReader类。要生成SqlDataReader对象只能用SqlCommand对象的ExecuteReader()方法。
SqlDataReader对象不同于Java中的ResultSet和ADO中的RecordSet,它是一个基于连接的,只读的,只向前的读取器。它在内存中只保留一条记录,所以它占用资源少,效率高。
使用SqlDataReader对象读取数据时,进行操作时必需保证数据库连接处于打开状态
当数据库链接关闭时,SqlDataReader对象也会自动关闭。
属性:
FieldCount (int)获取当前行中的列数
HasRows (bool)获取该读取器中是否包含一行或多行
方法:
Close()
关闭读取器(车延禄)
Read()
将当前记录读到内存中,并把记录指针移到下一条记录。如果记录指针在最后一条记录的后面,会返回false
SqlDataReader的常用语法
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
//...
}
使用SqlDataReader读取指定列的内容
1 、使用列名: dr["列名"]
最慢但可读性好
2 、使用类型访问器:dr.GetString(0)最快,可读性差,可维护性差
3
、使用列序号:dr[1]效率居中,可读性差,可维护性差