博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过ADO.NET连接数据原理
阅读量:2241 次
发布时间:2019-05-09

本文共 6720 字,大约阅读时间需要 22 分钟。

文章目录

简介:

ADO.NET就是一组类库,这个类库可以让我们通过程序的方式访问数据库。

组成:

数据提供程序(常用类)

  • connection:用来连接数据库
  • command:用来执行SQL语句
  • dataReader:只读,只进的结果集,一条条的读取数据。
  • dataAdapter:一个封装上面三个类的对象

数据集(dataset),临时数据库

断开式数据操作

Demo

先体验一下如何使用ADO.NET在vs中连接数据库,并操作。

我现在仅仅是为了创建连接,为了简单,首先创建一个“控制台应用程序”的项目:
在这里插入图片描述

/*连接数据库的基本步骤如下:

1、创建连接字符串——用来表示连接某服务器的某数据库实例,以及用户名和密码
2、创建连接对象
3、打开连接(如果打开数据库连接没有问题,表示连接成功。)
4、关闭连接(释放资源)
*/

1、连接字符串的创建

#region 1.创建连接字符串/*连接字符串包括以下几个部分:1、data source:服务器实例(可填:ip,localhost,.(英文的句号),计算机名称等)2、Initial Catalog :初始化连接的数据库实例名称。3、Integrated Security:	如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,也就是使用“windows 身份验证”连接。	如果integrated security=false,或者不写,表示一定要输入正确的数据库登录名和密码。*///string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=true";//string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=SSPI"; //string constr = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456";// string constr = "Data Source=.;Initial Catalog=CRB_TPM;userid=sa;password=123456";string constr = "data source=.;database=CRB_TPM;uid=sa;pwd=123456";  #endregion

2、创建连接对象

因为我们创建完连接使用后,需要释放资源,为了方便,我们使用using ,关于using 的用法详见:补充2

#region 2.创建连接对象//using 类似于使用try finally 方法,最后使用using (SqlConnection con=new SqlConnection(constr))//将鼠标定位到SqlConnection单词上,shift+alt+F10 可以查看需要导入的命名空间{
}#endregion

3、打开连接:

using (SqlConnection con=new SqlConnection(constr))//将鼠标定位到SqlConnection单词上,shift+alt+F10 可以查看需要导入的命名空间{
//3、测试打开连接: con.Open(); //4、关闭连接,并且释放资源 //con.Close();//可以不写,因为Dispose中调用了close方法。 //con.Dispose();//因为我们使用的是using 的方式,所以不需要使用手动的Dispose }

数据库连接的创建全部代码如下:

using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{
class Program {
static void Main(string[] args) {
/*连接数据库的基本步骤如下: 1、创建连接字符串——用来表示连接某服务器的某数据库实例,以及用户名和密码 2、创建连接对象 3、打开连接(如果打开数据库连接没有问题,表示连接成功。) 4、关闭连接(释放资源) */ #region 1.创建连接字符串 /*连接字符串包括以下几个部分: 1、data source:服务器实例(可填:ip,localhost,.(英文的句号),计算机名称等) 2、Initial Catalog :初始化连接的数据库实例名称。 3、Integrated Security: 如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,也就是使用“windows 身份验证”连接。 如果integrated security=false,或者不写,表示一定要输入正确的数据库登录名和密码。 */ //string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=true"; //string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=SSPI"; string constr = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456"; #endregion #region 2.创建连接对象 //using 类似于使用try finally 方法,最后使用 using (SqlConnection con=new SqlConnection(constr))//将鼠标定位到SqlConnection单词上,shift+alt+F10 可以查看需要导入的命名空间 {
//3、测试打开连接: con.Open(); Console.WriteLine("成功打开资源。注意:如果con.open() 失败,则无法执行此句打印代码。");//如果con.open() 失败,则无法执行此句代码。 //4、关闭连接,并且释放资源 //con.Close();//可以不写,因为Dispose中调用了close方法。 //con.Dispose();//因为我们使用的是using 的方式,所以不需要使用手动的Dispose } #endregion Console.WriteLine("关闭连接释放资源。"); Console.readkey(); } }}

执行结果:

在这里插入图片描述

下面来说一下增删改查语句(insert 语句为例):

用过ADO.NET向表中插入一条语句,具体流程代码中均有体现

using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{
class Program {
static void Main(string[] args) {
#region 通过ADO.NET 向表中插入语句 //1、创建连接字符串 string ConStrForInsert = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456"; //2、创建连接对象 using (SqlConnection con=new SqlConnection(ConStrForInsert)) {
//3、打开连接 //con.Open();//不建议在这里打开连接对象(连接对象最晚打开,最早关闭,节省资源) //编写slq语句 string sql = " insert into Log(id,Title,[Type],WriteTime,UserID)values('03B2C499-2BEE-4DAA-83E3-0000DB028819','插入语句','insert测试',GETDATE(),'07B2C499-2BEE-4DAA-83E3-0000DB028819')"; //4、创建一个执行sql语句的对象(命令对象)sqlcommand using (SqlCommand cmd=new SqlCommand(sql,con)) {
// 打开连接(连接对象最晚打开,最早关闭,节省资源) con.Open(); //开始执行sql语句 int r = cmd.ExecuteNonQuery(); Console.WriteLine("成功插入{0}行数据",r); Console.WriteLine("点击任何按钮继续执行"); Console.ReadKey(); #region 补充:以下三种方式均可执行sql语句增删改查语句。 //cmd.ExecuteNonQuery();//适用于insert、update、delete语句中,返回受影响的行数。 //cmd.ExecuteScalar();//适用于返回结果集中只有单个结果的时候,即第一行第一列的值,其他的值忽略。 //cmd.ExecuteReader();//适用于查询并返回多行多列的时候。 //ExecuteNonQuery():只有执行insert、update、delete语句的时候,返回int类型的值,表示受影响的行数,执行其他的sql语句成功后返回-1 //ExecuteScalar() :当sql语句执行的时候,如果是聚合函数(例如:select count(1) from T_user),那么ExecuteScalar()返回的不可能是null,因为聚合函数不可能是null。但是如果sql语句不是聚合函数,那么ExecuteScalar()方法有可能返回null,所以在使用ExecuteScalar()的返回值的时候,需要先判断是否为null #endregion } #region 类似SqlCommand cmd=new SqlCommand(sql,con)的写法 //using (SqlCommand cmd = new SqlCommand()) //{
// cmd.CommandText = sql; // cmd.Connection = con; //} #endregion } #endregion } }}

补充1:Integrated Security简介

默认情况下,Integrated Security 属性为 False ,这意味着将禁用Windows身份验证。如果没有显式地把这个属性的值设置为True,连接将使用SQL Server身份验证,因此,必须提供SQL Server用户ID和密码。Integrated Security属性还能识别的其他值只有SSPI(Security Support Provider Interface,安全性支持提供者接口).在所有的Windows NT操作系统上,其中包括Windows NT 4.0、2000、XP,都支持值SSPI。它是使用Windows身份验证时可以使用的惟一接口,相当于把Integrated Security 属性值设置为True。

补充2:using 的三种用法

1.using指令。using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到。

例如:using System; 一般都会出现在*.cs中。
2.using别名。using + 别名 = 包括详细命名空间信息的具体的类型。
这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候。当需要用到这个类型的时候,就每个地方都要用详细命名空间的办法来区分这些相同名字的类型。而用别名的方法会更简洁,用到哪个类就给哪个类做别名声明就可以了。注意:并不是说两个名字重复,给其中一个用了别名,另外一个就不需要用别名了,如果两个都要使用,则两个都需要用using来定义别名的。
例如:
  using aClass = NameSpace1.MyClass;
  using bClass = NameSpace2.MyClass;
3.using语句,定义一个范围,在范围结束时处理对象。
场景:
当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
要达到这样的目的,用try…catch来捕捉异常也是可以的,但用using也很方便。
例如:
using (Class1 cls1 = new Class1(), cls2 = new Class1())
{
// the code using cls1, cls2
} // call the Dispose on cls1 and cls2

代码原件:

你可能感兴趣的文章
十个值得一试的开源深度学习框架
查看>>
【LEETCODE】240-Search a 2D Matrix II
查看>>
【LEETCODE】53-Maximum Subarray
查看>>
【LEETCODE】215-Kth Largest Element in an Array
查看>>
【LEETCODE】241-Different Ways to Add Parentheses
查看>>
【LEETCODE】312-Burst Balloons
查看>>
【LEETCODE】232-Implement Queue using Stacks
查看>>
【LEETCODE】225-Implement Stack using Queues
查看>>
【LEETCODE】155-Min Stack
查看>>
【LEETCODE】20-Valid Parentheses
查看>>
【LEETCODE】290-Word Pattern
查看>>
【LEETCODE】36-Valid Sudoku
查看>>
【LEETCODE】205-Isomorphic Strings
查看>>
【LEETCODE】204-Count Primes
查看>>
【LEETCODE】228-Summary Ranges
查看>>
【LEETCODE】27-Remove Element
查看>>
【LEETCODE】66-Plus One
查看>>
【LEETCODE】26-Remove Duplicates from Sorted Array
查看>>
【LEETCODE】118-Pascal's Triangle
查看>>
【LEETCODE】119-Pascal's Triangle II
查看>>