通过ADO.NET连接数据原理

简介:

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

组成:

数据提供程序(常用类)

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

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

断开式数据操作

Demo

先体验一下如何使用ADO.NET在vs中连接数据库,并操作。
我现在仅仅是为了创建连接,为了简单,首先创建一个“控制台应用程序”的项目:
通过ADO.NET连接数据原理

/*连接数据库的基本步骤如下:
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();
        }
    }
}

执行结果:

通过ADO.NET连接数据原理

下面来说一下增删改查语句(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

代码原件:

https://download.****.net/download/aiming66/10700997