ADO.net数据访问方法
ADO.NET是一组用于和数据源进行交互的面向对象的类库。
核心组件有两个:
DataSet 是 ADO.NET 的非连接(断开)结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,ADO.NET结构可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。
ADO.NET 结构的另一个核心元素是 .NET 数据提供程序(Data Provider)。具体包括:
- Connection 对象提供与数据源的连接。
- Command对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。
- DataReader 对象从数据源中提供快速的,只读的数据流。
- DataAdapter 对象提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。
用ADO.NET访问数据一般有两种方法,1.连接模式(直接对数据库进行操作)2.非连接模式(靠数据集)
1.连接模式(直接对数据库进行操作)
步骤:
- 先建立连接字符串 SqlConnection con = new SqlConnection(str)//str是连接数据库的connectionstring
- 创建command SqlCommand cmd = new SqlCommand(sql语句,con);
- 执行读取。cmd.Excutereader()这是获得一个Sqldatareader的结果集,DataReader是一个快速的,轻量级,只读的遍历访问每一行数据的数据流。,用完后记得close因为值允许一个reader,或者 cmd.ExcuteSaclar()查询单个结果 或者cmd.ExecuteNonQuery执行一条语句。
//构造连接字符串
SqlConnectionStringBuilder sbd = new SqlConnectionStringBuilder();
sbd.ConnectionString = ConfigurationManager.ConnectionStrings["delcon"].ConnectionString;//从配置文件得到数据源
sbd.Pooling = true;
sbd.MinPoolSize = ;
sbd.MaxPoolSize = ;
sbd.ConnectTimeout = ;
sbd.AsynchronousProcessing = true;//异步连接说明
//拼接SQL字符串
StringBuilder strSQL = new StringBuilder();
strSQL.Append("insert into dbo.UserInfo(UserName,UserScore) ");
strSQL.Append("OUTPUT inserted.ID values(@UserName,@UserScore)");
command:
为了防止被数据库注入,一般都要使用parameter来参数化查询:
//构造Parameter对象
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("@UserName",SqlDbType.VarChar,), new SqlParameter("@UserScore", SqlDbType.VarChar,), };
//给parameter对象赋值
paras[].Value = "王杰";
paras[].Value = "";
//遍历将parameter添加到cmd中
foreach (var item in paras)
{
cmd.Parameters.Add(item);
}
必须掌握的几个方法
ExecuteNonQuery: 执行不返回数据行的操作,并返回一个int类型的数据。
注意:对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。 对于其他所有类型的语句,返回值 为 -1。
ExecuteReader: 执行查询,并返回一个 DataReader 对象。
ExecuteScalar: 执行查询,并返回查询结果集中第一行的第一列(object类型)。如果找不到结果集中第一行的第一列,则返回 null 引用。
注:
1、 User是SQL SERVER的关键字,在表名中应尽量避免,如果必须是User表,可以用SELECT * FROM [User]这样的语句来查询该表的内容
2、 SqlCommand 类的ExecuteScalar()方法返回的是查询结果的第一行第一列的数据
3、 在插入数据的同时想要获得当前插入数据的id(主键)号,可以通过output语法和ExecuteScalar方法实现,这是在SQLSERVER 2005以后的版本中都有的,具体语法如下:
cmd.CommandText = “INSERT INTO T_Users(UserName,PassWord) OUTPUT inserted.Id Values(“admin”, “123456”)”;
int id = Convert.ToInt32(cmd.ExecuteScalar());
2.非连接模式(靠数据集)通过数据集访问数据
数据集是最常用的访问数据的方式,其主要流程是连接数据库、进行数据查询、将查询结果填充到数据集、对数据集中的数据进行展示和操作、将操作后的数据集提交数据库,通过这一系列操作实现对数据库的修改,此过程主要通过DataSet、DataAdapter、DataTable、DataRow、DataColumn、SqlCommandBuilder等类实现。
先是查询
- 1.SqlDataAdapter sqadpt = new SqlDataAdapter(strSQL.ToString(),con);//通过adapter来获得数据
- //将数据填充到数据集Dataset中
SqlCommandBuilder scb = new SqlCommandBuilder(sqadpt );//生成插入、删除、更新语句,这步写上不影响读取
- 2.DataSet dtset = new DataSet();//先实例化dataset
- sqadpt.Fill(dtset);//通过adapter来填充dt的实例
- //现在要通过Datatable来对Dataset中的数据进行展示和修改
- 3.DataTable dttable = new DataTable();//创建数据表对象
- dttable = dtset.Tables[0];//dataset来填充datatable数据表对象
对数据进行修改要用到SqlCommandBuilder的对象实例
具体实例:对数据集的修改,可以通过DataRow以及SqlCommandBuilder对象的实例来实现,
//创建DataAdapter对象实例
SqlDataAdapter sqldadp = new SqlDataAdapter(SQL查询语句, con); SqlCommandBuilder scb = new SqlCommandBuilder(sqldadp);//生成插入、删除、更新语句
DataSet ds = newDataSet();//创建DataSet对象
sqldadp.Fill(ds);//填充DataSet
DataTable dttable = new DataTable();//创建数据表对象
dttable = ds.Tables[];//dataset来填充datatable数据表对象
DataRow Myrow =dttable .NewRow();//在数据表中创建新的空白记录对象
//从前台页面接受要插入的数据
Myrow["name"]= Name.Text;
....
//将接收到的数据添加到DataTable中
DataRow .Rows.Add(Myrow); //更新数据库中的内容
sqldadp.Update(ds); //执行Update操作
如果是更新数据的话,也是获得DataTable的某一行后,然后对其中的数据进行赋值修改,然后提交,如果是删除操作,则是通过DataTable获取某行后,用DataRow接受,然后再调用DataTable的Rows属性的Remove方法删除,具体如下代码:
DataTable dt = ds.Tables[];
dt.Rows.Remove(Myrow);
网络数据的事务处理
事务处理是为了防止在网络上多用户对数据库的并发操作破坏数据的一致性和完整性,而事务处理主要通过SqlTransaction对象完成,其主要的方法有:Commit()方法主要负责提交事务处理完成真正的数据库查询更新操作,Rollback()方法主要负责当数据查询更新等数据库操作出现异常时的事务回滚。ADO.NET的事务处理主要通过SqlCommand对象来实现事务对象,代码如下:
using (SqlConnection con = new SqlConnection("Data Source = localhost; Initial Catalog = UserDate; Integrated Security = True"))
{
SqlTransaction transql = null;//申明SqlTransaction对象的实例
SqlCommand cmd = new SqlCommand();
try
{
con.Open();//创建数据库链接
transql = con.BeginTransaction();//开始事务处理
cmd.Connection = con;//设置Command对象的链接
cmd.Transaction = transql;//设置Command对象的事务
//设置带参数的SQL语句
cmd.CommandText = "INSERT INTO b1(name, company, position, shijian) VALUES(@Name, @Company, @Position, @Datetime)";
//为参数赋值(注意参数在数据库中的数据类型)
cmd.Parameters.Add(new SqlParameter("Name", Name.Text)); cmd.Parameters.Add(new SqlParameter("Company", Company.Text)); cmd.Parameters.Add(new SqlParameter("Position", Position.Text)); cmd.Parameters.Add(new SqlParameter("Datetime", DateTime.Parse(Datetime.Text)));//注意数据类型转换
//执行SQL语句
cmd.ExecuteNonQuery();
//提交事务
transql.Commit();
Response.Write("添加成功!<br>");
}
catch
{
//如果程序抛出异常则做事务回滚
transql.Rollback();
}
}
注:在上面的代码中,特别要注意SqlTransaction的实例接收的是SqlConnection实例的BeginTransaction()的返回值,SqlCommand的实例的Transaction属性接收的是SqlTransaction的实例,即SqlConnection实例的BeginTransaction()的返回值,而整个事务的过程是由SqlCommand实例来书写的,也就是说,在SqlCommand实例里面的代码相对应的事务都由SqlTransaction的实例自动生成,前提是必须要有transql = con.BeginTransaction();cmd.Transaction = transql;这两句代码,最后用SqlTransaction的Commit()方法或者Rollback()对事务进行提交或者回滚
ADO.net数据访问方法的更多相关文章
- ADO.NET数据访问技术
ADO.NET数据访问技术 就是将C#和MSSQLl连接起来的纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用.是所有数据访问技术的基础. A ...
- ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...
- .NET中微软实体框架的数据访问方法
介绍 本文的目的是解释微软的实体框架提供的三种数据访问方法.网上有好几篇关于这个话题的好文章,但是我想以一个教程的形式更详细地介绍这个话题,这个教程对于开始学习实体框架及其方法的人来说是个入门.我们将 ...
- Spring.NET 中的 ADO.NET 数据访问的示例
Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...
- ADO.NET数据访问模板整理
/// <summary> /// 数据访问类:hi_test /// </summary> public partial class TestDA { public Test ...
- ADO.NET 数据访问类查询、属性扩展
今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select( ...
- ADO.net数据访问
需要引用对应命名空间:System.Data.SqlClient; SqlConnection:连接对象SqlCommand:命令对象SqlDataReader:读取器对象 //造连接字符串 stri ...
- SQL Server的跨服务器数据访问方法
想要在SQL服务器上访问另一个服务器的数据,可以采用此方式: 1.建立数据库链接: 右键“链接服务器”,选择“新建链接服务器...” 以上的操作也可以通过SQL脚本实现: exec sp_addlin ...
- ADO.NET数据访问基础与综合应用2020年10月31日20:17:09学习笔记
四.创建数据表 1.数据表的名称. 2.表中的字段名.数据类型.是否可以为空.字段的约束.必备的字段(通常会有一个ID,表示实体的唯一性:可以直接手写,也可以使用种子标识自动生成,给定起始值,给定增长 ...
随机推荐
- Java基础 -- 泛型之泛型参数
泛型机制常用的参数有3个: “?”代表任意类型.如果只指定了<?>,而没有extends,则默认是允许任意类. extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或 ...
- Note: File Recipe Compression in Data Deduplication Systems
Zero-Chunk Suppression 检测全0数据块,将其用预先计算的自身的指纹信息代替. Detect zero chunks and replace them with a special ...
- 反射实现增删改查(DAO层)——查询数据
先贴出代码,后续补充自己的思路.配置文件.使用方式: /** * * 数据查询 * */ @Override public List<?> queryObject(List<Map& ...
- 【转】C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字
源地址:http://www.cnblogs.com/94cool/p/4332957.html
- poj 1635 Subway tree systems(树的最小表示)
Subway tree systems POJ - 1635 题目大意:给出两串含有‘1’和‘0’的字符串,0表示向下搜索,1表示回溯,这样深搜一颗树,深搜完之后问这两棵树是不是同一棵树 /* 在po ...
- 消耗战——dp+虚树
题目 [题目描述] 在一场战争中,战场由 $n$ 个岛屿和 $n-1$ 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为 $1$ 的岛屿,而且他们已经没有足够多 ...
- css 实现三级联动菜单
昨天因为项目中想要把二级联动菜单改成三级联动菜单,所以我就单独写了一个tab导航栏,用纯css的方式实现的三级联动.一开始我想着可以用js实现,但是js的hover事件和mouseenter,mous ...
- 无法访问http,会强制跳到https
1. Close Safari. 2. Delete the ~/Library/Cookies/HSTS.plist file. 3. Reopen Safari.
- JMeter - 连续性能测试 - JMeter + ANT + Jenkins集成 - 第2部分
目标: 创建包含性能测试流程的持续交付管道,以尽早检测任何与性能相关的问题. 通常,全面的性能测试将在分段/预生产环境中完成,该环境可能与您的生产环境相同.在完成QA功能/回归验证后,将代码推送到分段 ...
- Java中文编程开发,让Java编写更改复杂
额?what? 在B站无意中看到一张图,无意间已发了自己的好奇,实际上我早就知道Java支持Unicode编码也就是可以使用中文命名规则,但是我们可以包装一下,玩一玩完全使用中文编码也未尝不可,但是经 ...