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所有数据访 ...
随机推荐
- Navicat Premium_11.2.7简体中文版 破解版本 windows版本
亲测可用 自己一直在用的 https://pan.baidu.com/s/1VVKKQoIKVB0BgNXBK4YTrQ
- AdminLTE 框架应用(一 )- 插件介绍
原AdminLTE中的插件让我大部分都移除了,第一是占地方,需要的时候再引入也不迟,第二就是有些插件已经过时了,有比较好的插件可以替代.附上项目插件截图 1.bootstrap-addTabs 提供多 ...
- 初探Android动画之门
原文地址:http://www.cnblogs.com/kross/p/3376451.html 最近自学了下动画的相关知识,总结为今天的文章,希望对大家有帮助. Android中的动画大致分为三种: ...
- Fetch POST All in One
Fetch POST All in One FPAIO "use strict"; /** * * @author xgqfrms * @license MIT * @copyri ...
- 《Unix网络编程卷1:套接字联网API》读书笔记
第一部分:简介和TCP/IP 第1章:简介 第2章:传输层:TCP.UDP和SCTP TCP:传输控制协议,复杂.可靠.面向连接协议 UDP:用户数据报协议,简单.不可靠.无连接协议 SCTP:流控制 ...
- SAM I AM UVA - 11419(最小顶点覆盖+输出一组解)
就是棋盘问题输出一组解 https://blog.csdn.net/llx523113241/article/details/47759745 http://www.matrix67.com/blog ...
- 【刷题】BZOJ 4650 [Noi2016]优秀的拆分
Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆分是优秀的.例如,对于字符串 aabaabaa,如果令 A ...
- 【比赛】HNOI2018 寻宝游戏
考试的时候就拿了30points滚粗了 听说myy对这题的倒推做法很无奈,官方题解在此 正解思路真的很巧妙,也说的很清楚了 就是分别考虑每一位,会发现题解中的那个性质,然后把询问的二进制数按照排序后的 ...
- 洛谷 P2664 树上游戏 解题报告
P2664 树上游戏 题目描述 \(\text{lrb}\)有一棵树,树的每个节点有个颜色.给一个长度为\(n\)的颜色序列,定义\(s(i,j)\) 为 \(i\) 到 \(j\) 的颜色数量.以及 ...
- 解题:NOIP 2018 赛道修建
题面 几乎把我送退役的一道题,留在这里做个纪念. 考场看出来是原题结果为了求稳强行花了一个小时写了80pts暴力,然后挂了55pts(真·暴力写挂),结果今天花了不到半个小时连想带写一遍95pts(T ...