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

ADO.NET的几大组成部分

ADO.NET由五大类库组成,分别是:

  1. Connection(用于建立与 数据库的连接)
  2. Command(用于执行SQL语句)
  3. DataReader(用于读取数据)
  4. DataAdapter(用于填充把数据填充到DataSet)
  5. DataSet(数据集,用于程序中)

通常,从程序中访问数据库的方法是:

  1. 创建一个到数据库的连接
  2. 打开数据库连接
  3. 创建ADO记录集
  4. 从记录集中提取需要的数据
  5. 关闭记录集
  6. 关闭连接

下面就分别根据这一个过程结合ADO.NET的五大类库进行解释。

要想使用ADO.NET需要在程序中引用System.Data.SqlClient。其中包含了对Sql Server进行操作的数据访问类:

  • SqlConnection:连接数据库
  • SqlCommand:数据库命名对象
  • SqlCommandBuilder:生成SQL命令
  • SqlDataReader:数据读取器
  • SqlDataAdapter:数据适配器,用于填充DataSet
  • SqlParameter:为存储过程定义参数
  • SqlTransaction:数据库事务

建立连接

首先,要想访问数据库,我们需要一个媒介把程序与数据库连接起来。这就是连接字符串,它的基本语法为:Data Source(数据源) + Initial Catalog(数据库名称) + User ID(用户名) + Password(密码)。

String connectString = "Data Source = myServerAddress;Initial Catalog = myDataBase;User Id = myUserName; Password = myPassword;";

或者

String connectString = "Server =myServerAddress;Database = myDataBase; User Id = myUsername; Password = myPassword;";

注意:对于Sql Server来说,它支持两种身份验证方法,一种是windows身份验证,另一种是Sql Server身份验证。如果要用windows身份验证,就需要在连接字符串中包括Integrated Security属性。该属性默认为False。需要设置为True后才能使用windows身份验证。 
除了这几个必须的字段,连接字符串中还有许多可选的属性,在这里我就不一一列举,列出一些相关资料供感兴趣的朋友自行查阅,一个连接字符串可以包含哪些属性(http://book.51cto.com/art/200812/99995.htm)。

接着,有了连接字符串就可以创建连接对象了。

SqlConnection connection = new SqlConnection(connecString); 

或者可以使用专门的连接字符串生成器:

SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder()
{
DataSource=”“,
InitialCatalog=”“,
UserID=”“,
Password=””
};
SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString());

然后使用连接对象可以打开或关闭连接。 
connection.Open(); 
connection.Close();

执行命令

打开连接之后就可以操作数据库了,在这里需要用到SqlCommand命令对象。 
它具有四个主要属性,这些属性会在初始化的时候赋默认值: 
CommandText:空字符串(”“) 
CommandTimeout:30 
CommandType:CommandType.Text 
Connection:Null

创建命令对象: 
SqlCommand command = connection.CreateCommand(); 
或 
SqlCommand command = new SqlCommand();

SqlCommand包含了几个重要的属性: 
CommandText:用于获取或设置药对数据源之行的SQL语句、表明或存储过程。 
CommandType:设置你执行的SQL语句类型,有三个枚举,分别是Text(SQL文本命令),StoredProcedure(存储过程),TableDirect(表名)。 
Parameters:设置你的T-SQL中需要用到的参数。

几个重要的方法: 
ExecuteNonQuery:返回被SQL语句执行影响的行数(int),主要执行增删改操作。 
ExecuteReader:执行SQL或存储过程,返回的是SqlDataReader类型,主要用来查询。 
ExecuteScalar:返回执行结果集中的第一行第一列,如果没有数据,则返回NULL。 
CreateParameter:创建SqlParameter实例。 
举例说明:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;//必须
using System.Data.SqlClient;//必须
namespace Command
{
class Program
{
static void Main(string[] args)
{
SqlConnectionStringBuilder conStr = new SqlConnectionStringBuilder();
conSt.DataSource=@".\SQLEXPRESS";
conStr.IntegratedSecurity=true;
conStr.InitialCatalog="db_Test";
StringBuilder strSQL = new StringBuilder();
for(int i=0;i<=100;i++)
{
strSQL.Append("insert into tb_Test");
strSQL.Append("values('");
string name = "test"+i.ToString();
strSQL.Append(name);
}
using(SqlConnection con = new SqlConnection(conStr.ConnectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand(strSQL.ToString(),con);
int impactedNumber = cmd.ExecuteNonQuery();//返回受影响的行数
object firstData = cmd.ExecuteScalar();//返回执行结果中的第一行第一列,此方法可用于获取插入数据的ID,(int lineNumber =(int)cmd.ExecuteScalar();)
}
}
}
}

SQL参数

若想在程序中传递参数给数据库,可以使用SqlParameter。该类有几个重要的属性:

  • ParameterName:设置参数名
  • Value:给参数设置值
  • Size:设置参数字节最大长度
  • SqlDbType:参数在SQL中的类别

    和几个重要的方法:

  • AddWithVlue

  • Add
  • AddRange

    举例说明:

 SqlConnection connection =new SqlConnection(""))
{
SqlCommand cmd = connection.CreateCommand();
cmd.CommandText="";
cmd.Parameters.Add("@name",SqlDbType.NVarChar).Value = "deng";//方法一
cmd.Parameters.AddWithValue(@"name","deng");//方法二
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@name",SqlDbType.NvarChar,100){Value="deng"},
};
cmd.Parameters.AddRange(parameters);//可以放一个参数数组,包含多条参数,在此只举一个例子
}

可以通过cmd.Parameters[i].Value设置和读取数值。

数据读取

利用查询语句得到的数据信息需要通过数据读取器进行操作。 
举例:

SqlConnetion con = new SqlConnection("")
{
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText="";
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
{
While(dr.Read())
{
string str = dr.GetSqlString(0).ToString();
}
}
}

介绍几个常用的方法:

  1. GetOrdinal:可以获取指定列名的序列号,int name = dr.GetOrdinal(“name”);
  2. GetName:与上面的方法对应,可以通过列号返回列名字。
  3. IsDBNull:判断当前读取的数据是否为Null。
  4. NextResult:当查询为批处理查询时,使用这个方法去获取下一个结果集,返回值为Bool,如果存在多个结果集,则为true;否则为false。
  5. Read:读取数据。

常用属性有:

  1. HasRow:判断是否有数据。
  2. FieldCount:获取读取的列数。
  3. IsClosed:判断读取的数据流是否关闭。

SqlDataReader是连接相关的,也就是说与数据库的连接一断开就无法读取数据库中的数据,说明查询结果并不是放在程序中,而是放在数据库的服务中。

事务

需要用到SqlTransaction类,需要在指定位置命名存储点,该存储点之后的操作都将会回滚。 
例子:

SqlConnection con = new SqlConnection(strCon);
con.Open();
SqlTransaction transaction = con.BeginTransaction();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = ""
cmd.Transaction = transaction;
transaction.Save("transaction point");
transaction.Rollback("transaction point");

数据适配器

SqlDataAdapter类有四个重载构造函数:

  • 无参
  • SqlDataAdapter(SqlCommand)
  • SqlDataAdapter(String,SqlConnection)
  • SqlDataAdapter(String, ConnectionString)

填充数据例子:

DataSet dataSet = new DataSet();
SqlConnection con = new SqlConnection("");
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText="select xxx from tb_xxx";
SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
dataAdapter.Fill(dataSet);

填充后的数据可以使用SqlCommandBuilder进行增删改查。

例子:

SqlConnection con = new SqlConnection(ConnectionString();
con.Open();
SqlDataAdapter da = new SqlDataAdapter("select xxx from tb_xx");
DataSet ds =new DataSet();
da.Fill(ds);
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
DataRow row = ds.Tables[0].NewRow();
row[0]="a";
row[1]="b";
ds.Tables[0].Rows.Add(row);
da.Update(ds);

SqlCommandBuilder 可以把DataSet增加的数据转化为SQL语句用来更新数据库。然后调用Update方法。

文章来源:https://www.cnblogs.com/dfhelloworld/p/4951845.html

ADO.NET整理 [转]的更多相关文章

  1. ADO.NET--收藏整理别人的教程

    本文所有内容均从前辈的博客中收集整理而来,仅供自己学习参考的时候快速访问用. ADO.NET入门教程(一) 初识ADO.NET ADO.NET入门教程(二)了解.NET数据提供程序 ADO.NET入门 ...

  2. 关于ADO.NET的一些知识整理

    ADO.NET是什么 虽然我们都知道ADO.NET是对数据库的操作,但是要真的说出ADO.NET的具体含义还不是很容易. ADO.NET是ActiveX Data Objects的缩写,它是一个COM ...

  3. ado.net知识整理

    对ado.net总是半知半解,五大对象也总是混淆,近期自己做小项目练手,整理了一些知识点 ado.net的无要素(摘自其他博文) Connection 物件    Connection 对象主要是开启 ...

  4. 从头开始学习数据库及ADO.NET——竹子整理

    目前为止,学习编程一年有余,写过管理系统,写过商城,写过桌面,接触的多了,乱七八糟的点太多,一堆前段框架,后台类库,纷纷杂杂,更新迭代之快也是令人咋舌.于是我就在想,作为一名程序员,哪些内容是实打实的 ...

  5. ADO.NET的整理

    ADO.NET的几个对象 Connection:管理数据库的连接 Command:对数据库执行命令 DataReader:数据流读取器,返回的数据都是快速的且只是“向前”的数据流.无法实例化,只能通过 ...

  6. 【资料整理】ADO.NET

    ADO.NET: 1.SYSTEM.DATA 命名空间下类的集合的统称,用于操作 连接数据库的 它提供了统一的编程接口,可以操作不同的数据库 数据库实例:默认实例(MSSQLSEVER)和命名实例(M ...

  7. ADO.NET数据访问模板整理

    /// <summary> /// 数据访问类:hi_test /// </summary> public partial class TestDA { public Test ...

  8. ADO.Net笔记整理(一)

    几次装机,Notes已烟消云散,近日因为Node.js死活搞不定,无奈装机,备份好的东东,没想到磁盘扇区出现异常,可能是PE启动盘的病毒,只好将磁盘全部重新分区,恢复数据也懒得恢复了,日积月累关乎将来 ...

  9. 从头开始学习数据库及ADO.NET之PostgreSql字段约束——竹子整理

    约束数据表列执行的规则.这些是用来防止无效的数据被输入到数据库中..这确保数据库中的数据的准确性和可靠性. 约束可以是列级或表级.仅适用于表级约束被应用到整个表的列级约束.为列定义的数据类型,本身是一 ...

随机推荐

  1. volatile 关键字笔记

    你应该知道的 volatile 关键字 当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据. ...

  2. HiCar基本功能介绍

    HiCar基本功能介绍 基本概述 一方面,基于操作系统超强的分布式能力,HUAWEI HiCar通过手机和汽车之间的连接,基于三层标准与能力,构建手机和汽车互助资源池,把手机的服务生态延伸到车内,实现 ...

  3. MindSpore平台系统类

    MindSpore平台系统类 Q:MindSpore只能在华为自己的NPU上跑么? A: MindSpore同时支持华为自己的Ascend NPU.GPU与CPU,是支持异构算力的. Q:MindSp ...

  4. Imec推出高性能芯片的低成本冷却解决方案

    Imec推出高性能芯片的低成本冷却解决方案 Imec unveils low-cost cooling solution for high-performance chips 3D打印冷却器优于传统解 ...

  5. 为什么edge AI是一个无需大脑的人

    为什么edge AI是一个无需大脑的人 Why edge AI is a no-brainer 德勤预计,到2020年,将售出超过7.5亿个edge AI芯片,即在设备上而不是在远程数据中心执行或加速 ...

  6. 前端 JS 之 AJAX 简介及使用

    概述 AJAX 是一个缩写,它的全名是 Asynchronous JavaScript and XML,意思就是异步 JavaScript 和 XML,即用JavaScript执行异步网络请求. AJ ...

  7. spring赌上未来的一击:WebFlux性能实测

    最近花了一点时间系统的测试验证了在SpringBoot框架下使用SpringMVC和Spring WebFlux两种框架开发接口,对比了响应时间以及压测吞吐量的区别. WebFlux&Spri ...

  8. 【Python报错】ValueError: If using all scalar values, you must pass an index

    问题: 1.ValueError: If using all scalar values, you must pass an index.意思是:如果使用所有标量值,则必须传递索引 2.再看错误发生代 ...

  9. Linux常用命令详解上

    Linux常用命令详解上 目录 一.shell 二.Linux命令 2.1.内部命令与外部命令的区别 2.2.Linux命令行的格式 2.3.编辑Linux命令行的辅助操作 2.4.获得命令帮助的方法 ...

  10. explicit 关键字 禁止隐式转换

    explicit可以抑制内置类型隐式转换,所以在类的构造函数中,使用explicit关键字,防止不必要的隐式转换