为什么要学ADO.NET
之前我们所学的只能在查询分析器里查看数据,操作数据,我们让普通用户去学sql,所以我们搭建了一个界面(Web/Winform) 让用户方面的操作数据库中的数据
什么是ADO.NET
ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类(操作文件),System.Data 这组类是用来操作数据库(不光是MSSQL Server),
它提供了统一的编程接口让操作其它数据库(Access、Oracle等)的方式和操作MSSQL Server一致。
ADO.NET组成,数据提供程序(常用类)
Connection,用来连接数据库
Command,用来执行SQL语句
DataReader只读、只进的结果集,一条一条读取数据(StreamReader、XmlReader微软的类库中这些Reader的使用方式都差不多)
DataAdapter,一个封装了上面3个对象的对象。
DataSet(数据集),临时数据库。断开式数据操作
ADO.NET中的其他常见类
ConnectionStringBuilder //自动生成连接字符串
Parameter //带参数的SQL语句
Transaction //在ADO.NET中使用事务
与DataSet相关的类:
DataView //视图类,DataTable中的数据以不同的视角查看
DataRowView //DataView中的行。
DataTable //DataSet中的数据表
DataRow //DataTable中的行
DataColumn //DataTable中的列
DataRealation //DataTable与DataTable的关系
Constraint //DataTable中建立的约束
Ado.net访问数据库的方式。
1.连接数据用Connection
2.执行SQL语句Command
3.执行完毕之后将结果一条一条返回。DataReader
使用DataAdapter+DataSet,这种方法本质还是通过Connection、Command、DataReader将数据全部取出来然后放到了DataSet中。//看DataAdapter的构造函数
Connection对象
如何让应用程序与数据库建立连接?Connection对象。
读取Sql Server数据库使用
1.创建SqlConnection对象
2.获取连接字符串
2.1. VS视图-服务器资源管理器-数据库连接上点右键-添加连接 在新添的数据库上点右键 属性 里有连接字符串
2.2. 使用SqlConnectionStringBuilder帮助获取连接字符串
2.3. 使用PropertyGrid控件的SelectedObject属性与SqlConnectionStringBuilder配合使用。
3.打开连接.(多次打开问题:ConnectionState枚举)
4.关闭连接 //相当于设置了路障
5.释放资源 //相当于把路拆了,这块地可以盖楼了。
Ps:调用Connection.Dispose()【继承自Component类的方法】方法时,内部调用了Close(),connection不能重复打开。
Command对象
操作Sql Server数据库使用SqlCommand对象,SqlCommand表示向服务器提交的一个命令(SQL语句等) , CommandText属性为要执行的SQL语句.
创建SqlCommand对象:
1.通过new关键字创建
2.通过IDbConnection.CreateCommand()方法创建(编写通用代码的时候使用(多态))
常用的方法
--ExecuteNonQuery() 方法除了执行增删改sql语句外,执行其他Sql语句返回的都是-1
--ExecuteScalar() 一般建议当执行的sql语句返回单个值得时候使用(单行/单列)
--ExecuteReader() 一般建议当执行sql语句返回多行多列的时候使用
--其实执行任何的sql语句使用以上的任意一个方法都可以。
--使用任何一个方法都会将我们指定的sql语句发送到服务器执行。只不过是不同的方法执行完毕sql语句后,给我们返回的结果不同而已。
--ExecuteScalar() 函数内部其实就是调用了ExecuteRead()方法,并且通过reader只读取第一行的第一列,然后作为一个object来返回,这样的话给我们感觉好像ExecuteScalar()是返回了一个object
StatementCompleted事件
每条SQL语句执行完毕之后触发。
多条语句同时执行(用分号隔开),如何获取每条语句所影响的行数?//实际返回值为每条语句所影响的行数的和。
reader.GetOrdinal("ColumnName"); //放在循环外面 //在循环里面始终要使用索引来获取列的数据,不要使用列明(低效率)
SqlDataReader使用注意事项
返回reader后数据在哪里?数据库服务器缓存
当使用DataReader的时候必须保证Connection为Open状态。
1. reader只读(不能通过reader修改数据。)、只进
2. reader每次读取一条就释放一条所以只能向前不能后退
由于功能有限,所以读取速度很快,适合从数据库中读取大量数据
使用reader根据列索引读取列数据而不是列名
使用强类型的GetString()、GetInt32、GetFloat()、GetDouble()….
数据库中的类型与C#的不太一样,数据库中的float,得用c#的GetDouble()来获取。
IsDbNull()
如果返回多个结果集则用NextResult()方法。通过do-while循环测试。
sql profiler[sql事件探查器,帮助找错]
ADO.NET连接池
1.默认情况下是启用连接池的。
2.可以在连接字符串中通过Pooling=false禁用连接池
3.当启用连接池后:
1>第一次创建连接对象的时候,确实是真正的创建了一个连接对象,并且连接数据库服务器,并且验证用户名和密码是否正确。
2>当第一个用户使用完毕该连接后,当该用户调用con.Close()方法的时候,并没有将该连接对象真正的关闭(该连接并没有关闭)。
也就是说:当调用con.Close()的时候,其实只是表示当前用户使用完毕了这个连接,要把该连接放入连接池中。当把一个连接对象放入连接池中后,那么其他的连接就可以使用连接池中的该连接对象了。
【当每个用户使用完毕连接后,立刻调用该连接对象的close()方法依然是非常有意义的,这样就可以保证把连接对象放入池中,放入池中后(放入池中的连接对象并没有关闭),其他新来的连接就可以继续使用该连接对象了,没有必要重新开一个新的连接】
3>当一个新的连接过来以后,是不是池中只要有空闲的连接对象,就可以使用呢?不是!
1. 只有新来的连接对象使用的连接字符串与池中现有的连接对象的连接字符串一模一样的时候才会从池中直接获取一个连接对象来使用,否则,会重新创建一个新的连接对象。
2. ado.net 会为每个连接字符串维护一个针对该连接字符串的池。对于不同的连接字符串的连接,依然会创建新的连接对象。
【注意】如果在程序中,不同的操作都是使用相同的连接字符串,那么建议启用连接池,如果每次操作使用的都是不同的连接字符串,那么建议最好禁用连接池,否则为每个连接字符串都维护一个连接池,对于数据库服务器来说就是每个连接都不关闭,所以性能不好。
一般什么情况下使用到ADO.NET连接池
1.创建对象的时候比较耗时
2.对象频繁被使用
如何清空连接池?Connection的静态方法 SqlConnection.ClearAllPools()、 SqlConnection.ClearPool()
Ado.net连接池使用总结
1. 第一次打开连接会创建一个连接对象。
2. 当这个连接关闭时(调用Close()方法时)会将当前那个连接对象放入池中。
3. 下一个连接对象,如果连接字符串与池中现有连接对象的连接字符串完全一致,则会使用池中的现有连接,而不会重新创建一个。
4. 只有对象调用Close(),的时候才会放入池中,如果一个连接对象一直在使用,则下次再创建一个连接对象发现池中没有,也会再创建一个新连接对象。
在池中的连接对象,如果过一段时间没有被访问则自动销毁。
--DataSet-DataTable-SqlDataAdapter
关于DataSet(临时数据库、内存数据库)、DataTable(内存表)
--SqlParameter的问题
new SqlParameter("@id",0) //有bug,不建议使用,会报错参数@id未赋值
new SqlParameter("@id",SqlDbType.Int){Value=0}; //建议这样使用
SqlHelper封装类,参考:链接:http://pan.baidu.com/s/1eQKyxz0 密码:8nq3