ADO.NET中的五个主要对象的详细介绍与应用

首先看一个例子
配置文件


代码如下:

<configuration>
<connectionStrings>
<add name=connStr" connectionString="Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\SS.mdf;Integrated Security=true;User Instance=True"/>
</connectionStrings>
</configuration>

代码


代码如下:

string strconn = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; //从配置文件中读取连接字符串
using (SqlConnection conn = new SqlConnection(strconn)) //创建连接对象,出了using范围,连接自动关闭,对象自动销毁
{
conn.Open();//打开连接
using (SqlCommand cmd = conn.CreateCommand()) //创建命令对象
{
cmd.CommandText = "select * from T_Persons";//命令内容
DataSet dataset = new DataSet(); //创建一个数据集,相当于一个数据容器
SqlDataAdapter adapter = new SqlDataAdapter(cmd); //创建一个适配器
adapter.Fill(dataset); //将查询结果填充到数据集中
DataTable datatable = dataset.Tables[0]; //将查询到的一张表保存在DataTable对象中
for (int i = 0; i < datatable.Rows.Count;i++ )//遍历
{
DataRow row = datatable.Rows[i];//取得一行对象
string name=row["F_Name"].ToString();//取得该行对应列的值
MessageBox.Show(name);
}
}
}

对象解析


代码如下:

Connection:
和数据库交互,必须连接它。连接帮助指明数据库服务器、数据库名字、用户名、密码,和连接数据库所需要的其它参数。Connection对象会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令。
Command:
主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连结到数据源。
DataAdapter:
主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。
DataSet:
这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。
DataReader:
当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。

强类型 DataSet(ADO.NET中的重头戏)
使用方法:在项目上右击-添加-新建项-数据集,然后将表从服务器资源管理器拖放到DataSet中。注意拖放过程是自动根据表结构生成强类型DataSet等类,没有把数据托过来,程序还是连得那个数据库,自动将数据库连接字符串写在了配置文件中。

定义表的时候必须要有主键(表名:T_Persons)


代码如下:

T_PersonsTableAdapter adapter = new T_PersonsTableAdapter();//首先生成一个适配器
DataSet演示.DataSet1.T_PersonsDataTable datatable = adapter.GetData();//讲返回结果用T_PersonsDataTable类型接收
for (int i = 0; i < datatable.Count;i++ )//遍历表中的每一行
{
DataSet演示.DataSet1.T_PersonsRow row = datatable[i];//每一行放入一个T_PersonsRow中
MessageBox.Show("姓名是:"+row.F_Name+"年龄是:"+row.F_Age);//取出数据(像使用属性一样)
}

强类型DataSet的更新


代码如下:

T_PersonsTableAdapter adapter = new T_PersonsTableAdapter();
DataSet演示.DataSet1.T_PersonsDataTable datatable = adapter.GetData();//取出查询结果放入表中
DataSet演示.DataSet1.T_PersonsRow row = datatable[0];//取表的第一行
row.F_Name = "newName";//修改第一行数据的名字字段
int i = adapter.Update(datatable);
if (i > 0)
{
MessageBox.Show("修改成功");
}
else
{
MessageBox.Show("修改失败");
}

数据库中的表未增加字段:右键数据集→配置
增加字段:右键数据集→配置→查询分析器
插入新行


代码如下:

T_PersonsTableAdapter adapter = new T_PersonsTableAdapter();
int i = adapter.Insert("吉思静", 22);
if (i > 0)
{
MessageBox.Show("插入成功");
}
else
{
MessageBox.Show("插入失败");
}

空值处理


代码如下:

if(row.IsF_NameNull())//判断数据库中的该字段对应的值是否为空(这是一个方法,直接调用)
{
MessageBox.Show("数据为空");
}

强类型DataSet添加自定义SQL语句


代码如下:

右键数据集→添加→Query
查询SQL语句
SELECT * FROM dbo.T_Persons
where F_Age>20
调用该方法:
T_PersonsTableAdapter adapter = new T_PersonsTableAdapter();
DataSet演示.DataSet1.T_PersonsDataTable datatable = adapter.GetDataOlder();
查询SQL语句(带参数)
SELECT * FROM dbo.T_Persons
where F_Age>@Age
调用该方法:
T_PersonsTableAdapter adapter = new T_PersonsTableAdapter();
DataSet演示.DataSet1.T_PersonsDataTable datatable = adapter.GetDataByAge(20);
删除SQL语句(带参数)
DELETE FROM T_Persons
WHERE (F_Name = @Name)
调用该方法:
T_PersonsTableAdapter adapter = new T_PersonsTableAdapter();
int i = adapter.DeleteByName("李正兴");//成功删除返回1否则返回0

优化强类型DataSet批量处理
(1)插入3000条数据未优化用时


代码如下:

Stopwatch sw = new Stopwatch();
sw.Start();//打开时钟
T_testTableAdapter adapter = new T_testTableAdapter();
for(int i=0;i<3000;i++)//计算插入3000条数据的用时
{
adapter.Insert(i.ToString(), i);
}
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());

(2)插入3000条数据优化后用时


代码如下:

Stopwatch sw = new Stopwatch();
sw.Start();//打开时钟
T_testTableAdapter adapter = new T_testTableAdapter();
adapter.Connection.Open();//打开连接
for(int i=0;i<3000;i++)//计算插入3000条数据的用时
{
adapter.Insert(i.ToString(), i);
}
adapter.Connection.Close();//关闭连接
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());

(0)

相关推荐

  • ADO.Net 类型化DataSet的简单介绍

    一.弱类型DataSet的缺点:1.只能通过列名引用,dataset.Tables[0].Rows[0]["Age"],如果写错了列名编译时不会发现错误,因此开发时必须要记着列名.2.int age=Convert.ToInt32(dataset.Rows[0]["Age"]),取到的字段的值是object类型,必须小心翼翼的进行类型转换,不仅麻烦,而且容易出错.3.将DataSet传递给其他使用者,使用者很难识别出有哪些列可以供使用.4.运行时才能知道所有列名,数

  • ADO.NET之连接池技术的使用详解

    连接到数据库服务器通常需要一定的时间,且服务器也需要一定的资源来处理连接.Web应用程序有时处理成千上万的连接,需要相当多的资源来处理连接.ADO.NET具有连接池的特性,连接池的功能是保留一定数量的连接,当用户使用相同的连接字符串再次连接服务器时,ASO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,ADO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,连接将会返回到连接池中,下次再次调用Open方法时,将从连接池

  • ADO.NET编程之基础知识

    一.ADO.NET基础 程序和数据库交互,要通过ADO.NET进行:通过ADO.NET就能在数据库中执行SQL了.ADO.NET中提供了对不同数据库的统一操作接口(ODBC).另外还有一种操作数据库的接口是JDBC. ADO.NET中通过SqlConnection类创建到SQL Server的链接,Sqlconnection代表一个数据库的链接,ADO.NET中的链接等资源都实现了IDisposable接口. 实现了IDisposable接口的对象,在使用完了,要进行资源的释放.调用Dispos

  • ADO.NET实体数据模型详细介绍

    OleDbConnection,OracleConnection 或者SqlConnection这种连接,直接执行sql语句.现在的连接方式执行sql语句有了很大的不同,下面先看看简单的单表的增删改查操作,然后再看多表的关联查询,带参数查询等.一.ADO.NET Entity对单表的增删改查有一个表,即在工程中是一个实体user,为了测试方便,所有字段为string型. 1.增加新记录增加一条记录如下: [csharp] using (OracleEntities entities = new

  • ADO.NET基础知识汇总

    虽然我们都知道ADO.NET是对数据库的操作,但是要真的说出ADO.NET的具体含义还不是很容易. ADO.NET是ActiveX Data Objects的缩写,它是一个COM组件库,用于在microsoft技术中访问数据.之所以叫ADO.NET,应该是微软自己打的广告,希望在NET编程环境中优先使用这种数据访问接口.上面这段话基本来自百度百科.简单来说,ADO.NET就是一种数据访问接口,可以让我们在程序中调用相应的类库对数据库(通常为SQL Server,也可以是access 等其他数据库

  • ADO.NET EF中的实体修改方法

    1.传统修改模式,看下列代码 复制代码 代码如下: using (NorthwindEntities context = new NorthwindEntities()) { Region region = context.Region.FirstOrDefault(v => v.RegionID == 4); region.RegionDescription = "Test"; context.SaveChanges(); } 监控SQL语句: 复制代码 代码如下: SQL1:

  • ASP.NET中实现把Json数据转换为ADO.NET DataSet对象

    Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据.但是有些情况下DataSet Converter并不管用,而且也不一定能够满足项目需要.这里介绍另一种简单有效的方法,能够方便快速地将Json数据转为ADO.NET DataSet. 设计 事实上Newtonsoft.Json已经提供了一套完整的Json数据文档结构,Newtonsoft.Json.Linq命名空间下提供了这种文档结构的对象

  • ADO.NET 连接数据库字符串小结(Oracle、SqlServer、Access、ODBC)

    ADO.NET 连接到 SQL Server SQL Server .NET Framework 数据提供程序支持类似于 OLE DB (ADO) 连接字符串格式的连接字符串格式. 复制代码 代码如下: using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // Do work here. } 连接到 OLE DB 数据源 OLE DB .NET Framework

  • ADO.NET中的五个主要对象的详细介绍与应用

    首先看一个例子 配置文件 复制代码 代码如下: <configuration> <connectionStrings> <add name=connStr" connectionString="Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\SS.mdf;Integrated Security=true;User Instance=True"/> </connecti

  • Mybatis中SqlMapper配置的扩展与应用详细介绍(1)

    奋斗了好几个晚上调试程序,写了好几篇博客,终于建立起了Mybatis配置的扩展机制.虽然扩展机制是重要的,然而如果没有真正实用的扩展功能,那也至少是不那么鼓舞人心的,这篇博客就来举几个扩展的例子. 这次研读源码的起因是Oracle和MySQL数据库的兼容性,比如在Oracle中使用双竖线作为连接符,而MySQL中使用CONCAT函数:比如Oracle中可以使用DECODE函数,而MySQL中只能使用标准的CASE WHEN:又比如Oracle中可以执行DELETE FORM TABLE WHER

  • Java中关于Collections集合工具类的详细介绍

    Collections 是一个操作 Set.List 和 Map 等集合的工具类. Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变.对集合对象实现同步控制等方法. 排序操作 reverse(List):反转 List 中元素的顺序 shuffle(List):对 List 集合元素进行随机排序 sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序 sort(List,Comparator):根据指定的 C

  • JavaScript 中的引用类型Date 和RegExp的详细介绍

    目录 引用类型 & 引用值的理解 Date 引用类型 Date.parse()方法 Date.UTC()方法 继承的方法 RegExp RegExp 实例方法 exec() test() 继承的方法 引用类型 & 引用值的理解 引用值(或者对象)是某个特定引用类型的实例. 在ECMAScript中,引用类型是把数据和功能组织到一起的结构,经常被人错误的称作“类”.虽然从技术上讲JavaScript 是一门面向对象语言,但ECMAScrtipt 缺少传统的面相对象语言所具备的某些基本结构,包

  • JavaScript原始值与包装对象的详细介绍

    前言 随着 JavaScript 越来越流行,越来越多地开发者开始接触并使用 JavaScript. 同时我也发现,有不少开发者对于 JavaScript 最基本的原始值和包装对象都没有很清晰的理解. 那么本篇文章,就由渣皮来给大家详细介绍一下它们.

  • nodejs中exports与module.exports的区别详细介绍

    你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例如:(假设这是rocker.js文件) 复制代码 代码如下: exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 在另一个文件中你这样引用 复制代码 代码如下: var rocker = require('./rocker.js'); rocker.name(); // 'My name is Lemmy Kilmiste

  • java向多线程中传递参数的三种方法详细介绍

    在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据.本文就以上原因介绍了几种用于向线程传递数据的方法,在下一篇文章中将介绍从线程中返回数据的方法. 欲先取之,必先予之.一般在使用线程时都需要有一些初始化数据,然后线程利用这些数据进行加工处理,并

  • Node.js中文件操作模块File System的详细介绍

    File System的缩写是fs,该模块提供本地文件的读写能力. Nodejs导入文件系统模块(fs)语法如下所示: var fs = require("fs"); 异步和同步 Node.js文件系统(fs模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync() . 异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error).同步则没有回调函数. 建议大家是用异步方法,比起同步

  • Javascript中的异步编程规范Promises/A详细介绍

    Javascript里异步编程逐渐被大家接受,先前大家一般通过回调嵌套,setTimeout.setInterval等方式实现,代码看起来非常不直观,不看整个代码逻辑很难快速理解.Javascript里异步函数大概有I/O函数(Ajax.postMessage.img load.script load等).计时函数(setTimeout.setInterval)等. 这些我们都很熟悉,在复杂的应用中往往会嵌套多层,甚至以为某些步骤未完成而导致程序异常,最简单的例子:比如你往DOM中注入节点,你必

  • javascript中的变量作用域以及变量提升详细介绍

    变量作用域"一个变量的作用域表示这个变量存在的上下文.它指定了你可以访问哪些变量以及你是否有权限访问某个变量." 变量作用域分为局部作用域和全局作用域. 局部变量(处于函数级别的作用域)不像其他对面对象的编程语言(比方说C++,Java等等),javascript没有块级作用域(被花括号包围的):当是,javascript有拥有函数级别的作用域,也就是说,在一个函数内定义的变量只能在函数内部访问或者这个函数内部的函数访问(闭包除外,这个我们过几天再写个专题). 函数级别作用域的一个例子

随机推荐