通过ADO.NET连接数据原理
文章目录
简介:
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