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所有数据访 ...
随机推荐
- nexus在linux上搭建
Maven 仓库的分类:(maven的仓库只有两大类) 1.本地仓库 2.远程仓库,在远程仓库中又分成了3种: 2.1 中央仓库 2.2 私服 2.3 其它公共库 有个maven私服可以很方便地管理我 ...
- spring mvc $.ajax没有指定contentType ,导致后台无法接收到数据
var formData = JSON.stringify(this.rows); //将表单中的数据转为字符串 $.ajax({ type: "post", url: 'http ...
- pixi.js tools
pixi群 881784250 Awesome pixi.js tools A list of useful libs/resources/tools for renowned html5 rende ...
- 深入解析ThreadLocal类
先了解一下ThreadLocal类提供的几个方法: public T get() { } public void set(T value) { } public void remove() { } p ...
- 采用FPGA实现UART转SPI
应用笔记 V1.1 2015/2/10 采用FPGA实现UART转SPI 概述 本文提供了实现UART转SPI的Verilog代码的功能描述.这份笔记将介绍UART和SPI的基本知识,代码设计 ...
- (转)slf4j+logback将日志输出到控制台
因为博主不允许转载...这边做链接记录 http://blog.csdn.net/gsycwh/article/details/52972946
- Count the string HDU - 3336
题意: 求一个字符串的每个前缀在这个字符串中出现次数的加和 解析: 默默的骂一句...傻xkmp..博主心里气愤... 拓展kmp就好多了... 因为拓展kmp每匹配一次 就相当于这些前缀出现了一 ...
- 创建Qt项目
创建Qt项目 1 创建Qt项目 2.1 使用向导创建 打开Qt Creator 界面选择 New Project或者选择菜单栏 [文件]-[新建文件或项目]菜单项 弹出New Project对 ...
- Dll劫持漏洞详解
一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...
- C++中Vector求最大值最小值
vector<int> v: 最大值: int max = *max_element(v.begin(),v.end()); 最小值: int min = *min_element(v.b ...