C# 高级编程(笔记7)
关于ADO.NET:
1.数据源
数据源定义的是连接到实际数据库的一条路径而已,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接的,如odbc数据源。也就是说数据源仅仅是数据库的连接名称,一个数据库可以有多个数据源连接。
2.ODBC,OLEDB,ADO,ADO.NET的区别
A. ODBC:底层的数据库访问技术,提供了一组规范的API,只能用于访问关系型数据库,很难访问对象数据库及其他非关系型数据库
B. OLEDB:底层的数据库访问技术,建立在ODBC功能之上的一个开放规范,可以访问关系型和非关系型数据库(信息源)
C. ADO: 是基于OLEDB的访问接口,它是面向对象的OLEDB技术,继承了OLEDB的优点,属于数据库访问的高层接口。
D. ADO.NET:
1)基于OLEDB技术以及.NET Framework类库,可以访问关系型和非关系型数据库/信息源[如:XML, Excel]
2)ADO.NET附带了3个数据库客户端名称空间,第1个用于SQL Server,第2个用于ODBC数据源,第3个用于通过OLEDB实现的数据库。
3.高效地使用连接
一般情况下,当在.NET中使用“稀缺”的资源时,如数据库连接、窗口或图形对象, 最好确保每个资源在使用完后立即关闭
主要有两种方式可以确保数据库连接等类似的“稀缺”资源在使用完后立即释放:
1.第一种方式----利用try...catch...finally语句块 try { conn.Open(); } catch() { } finally { conn.Close(); //缺点是需记住在finally方法中手动关闭连接 } 2.第二种方式----使用using语句块 只有实现了IDisposable接口的对象,才可以对其使用using语句 using(SqlConnection conn = new SqlConnection( source )) { conn.Open(); //Do something useful }
----using语句对应的IL Code是try{}...finally{}语句块,在finally块中调用Dispose()方法
4.定义命令(Command)
Command有三种类型:
A.CommandType.Text(默认):调用SQL子句
B.CommandType.StoredProcedure:调用存储过程
C.CommandType.TableDirect[只对OLEDB提供程序有效]:调用完整的表语句(仅从给定的表中选择所有列和行)
5.执行命令
A.ExecuteNonQuery()
这个方法一般用于update、insert或delete语句,其中唯一的返回值是受影响的记录个数。但如果调用带输出参数的存储过程,该方法就有返回值
B.ExecuteReader()[长时间占用数据库连接]
根据使用的提供程序返回一个类型化的DataReader对象,返回的对象可以用于遍历返回的记录.
例如:
SqlCommand cmd = new SqlCommand();
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
//
}
C.ExecuteScalar()
----返回结果集中第一行第一列的值
----该方法返回一个对象,根据需要,可以把该对象强制转换为合适的类型。如果所调用的sQL只返回一列,则最好使用ExecuteScalar方法来检索这一列。这也适合于只返回一个值的存储过程
6.DataSet类
是数据的离线容器,即一次性把数据读入内存,然后立即关闭数据库连接,会占用较多内存,DataSet类由一组数据表[DataTable对象]组成
7.创建DataTable的3种方式
A.由运行库生成
SqlDataAdapter da = new SqlDataAdapter(select, cnnon); DataSet ds = new DataSet(); da.Fill(ds, "Customers"); //填充Customers表
B.编写代码创建
DataTable Person = new DataTable("Person"); Person.Columns.Add(new DataColumn("PersonId",typeof(Int32))); ...
C.在XML的定义文件(XSD)中描述DataTable
8.填充DataSet
A.用数据适配器填充DataSet
SqlDataAdapter da = new SqlDataAdapter(select, cnnon);
B.从XML中填充DataSet类
DataSet ds = new Dataset();
ds.ReadXm1(".\\MyData.Xml");