MSSQL ADO.NET
为什么要学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
MSSQL ADO.NET的更多相关文章
- 基础 ADO.NET 访问MYSQL 与 MSSQL 数据库例子
虽然实际开发时都是用 Entity 了,但是基础还是要掌握和复习的 ^^ //set connection string, server,database,username,password MySq ...
- [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...
- 分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节
1:MSSQL SQL语法篇: BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | vie ...
- .NET基础拾遗(6)ADO.NET与数据库开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- C++-数据库【1】-C++连接MSSQL数据库
测试环境—— 系统:Win7 64bit 编译器:VC++ 2015 数据库:MSSQL 2008 R2 #include <Windows.h> #include <stdio.h ...
- ado.net 用c#与数据库连接实现增删改查
ADO.NET: 数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 是所有数据访问技术的基础 ...
- Entity Framework与ADO.Net及NHibernate的比较
Entity Framework 是微软推荐出.NET平台ORM开发组件, EF相对于ado.net 的优点 (1)开发效率高,Entity Framework的优势就是拥有更好的LINQ提供程序. ...
- ADO.NET 增、删、改、查
ADO.NET:数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中也可以将数据库中的数据提取到内存中供程序调用 所有数据访问技术的基础 连接 ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
随机推荐
- ctf实验平台-成绩单
题目链接:http://120.24.86.145:8002/chengjidan/ 平台地址:http://123.206.31.85/ 第一步:暴库 id=-1' union select 1,2 ...
- 【Apache】ab工具
格式:ab [options] [http://]hostname[:port]/path -n requests Number of requests to perform //在测试会话中所执行 ...
- sublime text3 php开发必要的插件
一.安装Sublime Text 3 官网 http://www.sublimetext.com/3 一定要选择ST3,而不是ST2,3比2好用,真的,后面你就知道了. 选择对应的版本安装.完事后,要 ...
- BZOJ1564 NOI2009二叉查找树(区间dp)
首先按数据值排序,那么连续一段区间的dfs序一定也是连续的. 将权值离散化,设f[i][j][k]为i到j区间内所有点的权值都>=k的最小代价,转移时枚举根考虑是否修改权值即可. #includ ...
- 51nod 1089最长回文子串V2 (manacher)
经典题 manacher是一种很神奇的算法, 算是动态规划的一种,不过利用的信息非常有效 #include <iostream> #include <cstdio> #incl ...
- uoj 36 玛里苟斯
[清华集训2014]玛里苟斯 - 题目 - Universal Online Judge k=1,2,3,4,5各占20pts是提示 应当分开考虑 k=1 拆位,如果第i位有1,则有1/2的概率xor ...
- 如何设置eclipse格式化xml代码时不自动换行
如何设置eclipse格式化代码时不自动换行 2015年12月23日 09:08:36 qq_20889581 阅读数:3770 标签: eclipse格式化android 更多 个人分类: Ecli ...
- PID控制算法的C语言实现九
(1)微分先行PID控制算法 微分先行PID控制的特点是只对输出量yout(k)进行微分,而对给定值rin(k)不进行微分.这样,在改变给定值时,输出不会改变,而被控量的变化通常是比较缓和的.这种输出 ...
- Codeforces Round #271 (Div. 2) D 简单dp
D. Flowers time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input ...
- 洛谷P2563 [AHOI2001]质数和分解
题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如,9 的质数和表达式就有 ...