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,表示实体的唯一性:可以直接手写,也可以使用种子标识自动生成,给定起始值,给定增长 ...
随机推荐
- 如何在MySQL中设置外键约束
引用:http://blog.sina.com.cn/s/blog_53729e4601011wja.html MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是 ...
- Unix Tutorial Eight
1.UNIX 变量 变量是在运行时将信息从shell传递到程序的一种方式.程序在特定的变量中查找“在环境中”,如果发现它们将使用存储的值.有些是由系统设置的,另一些是由你设置的,还有一些是由shell ...
- java内存及数据区
Java运行时的数据区包括:(其中前两个是线程共享的) 1.方法区(Method Area) 存储已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据 2.堆(Heap) 存放对象实例 ...
- 洛谷P1164 小A点菜(01背包求方案数)
P1164 小A点菜 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过u ...
- 洛谷P2380 狗哥采矿
P2380 狗哥采矿 题目背景 又是一节平静的语文课 狗哥闲来无事,出来了这么一道题 题目描述 一个n*m的矩阵中,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是 ...
- pod 安装
cocoapods 简介: CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods本身所 ...
- Java基础笔记(七)—— 成员变量、静态变量、局部变量
public class Test { int c; //成员变量(实例变量) static int s1; //静态变量(类变量)(全局变量) public static void main(Str ...
- Duff and Meat(贪心)
Duff is addicted to meat! Malek wants to keep her happy for n days. In order to be happy in i-th day ...
- windows下运行jar
run.bat 1. javaw运行 @echo offstart javaw -Xmx128m -Xms64m -jar testlog.jarexit 2.java运行 @echo offjava ...
- 注意sqlite3和java的整数数据类型的区别
作为新手的我,没有考虑数据库和java的数据类型的对应上的区别: sqlite3的数据类型和java数据类型对应上要小心,特别是整数类型. java 中int类型4位存储,范围 -2^31到2^31- ...