• Net学习日记_ADO.Net_1


    ADO.Net

    为啥要学习ADO.Net?他是啥?

    不能让普通用户学习sql,搭建一个界面(Web Winform)让用户方便的操作数据库中的数据。

    ADO.net就是提供的一堆类库,这个类库里面有很多专门操作各种数据库的类,他们都是实现统一接口,(所有数据库)

     

    ADO.Net组成

    第一部分:.Net Framework数据提供程序,命名空间:System.Data.SqlClient

    Connection 连接数据库的通道

    Command 命令执行对象

    DataReader 数据读取器

    DataAdapter 数据适配器

    第二部分:数据集,命名空间:System.Data

    本地化的结果集,就是把数据库查询之后的结果集,取出来存到本地内存中

    其他常见类:

    ConnectionStringBuilder:自动化生成连接字符串

    连接字符串就是告诉程序,要怎么连接数据库,连接到哪个数据库,用什么登陆方式

    Parameter:带参数的SQL语句

    Transaction:在ADO.Net中使用事务

    与DataSet相关的类:

    1.*DataView//视图类,DataTable中的数据以不同的视角查看

    2.*DataRowView//DataView中的行。

    3.DataTable //DataSet中的数据表

    4.DataRow//DataTable中的行

    5.DataColumn//DataTable中的列

    *DataRealation//DataTable与DataTable的关系

    *Constraint//DataTable中建立的约束

    三大对象的理解

    Connection 从程序到数据库的一条路(必须得有)

    Command 从上面的那条路,走到数据库去取出很少的数据的一个人(对象)

    DataReader 从上面的那条路,开到数据库取相对较多的数据的摩托车(读取器)

    DataAdapter从上面的那条路,,开到数据库取出很多数据的卡车(适配器)

    我们根据实际想要取出来的数据量的大小,选择以上三个对象

     

    最简单的Ado&Connection

    //1.准备好通往数据库的路,但是这条路还有修好
    SqlConnection conn = new SqlConnection("server=.;database=HeiMaBlog;uid=sa;pwd=suncoder");
    //2.准备一个命令对象
    SqlCommand cmd = new SqlCommand();
    //2.1 告诉命令对象要做的事情,就是sql语句,可以吧查询分析器的语句原封不动的复制过来
    cmd.CommandText = "select getdate()";
    //2.2 告诉命令对象,去数据库的路
    cmd.Connection = conn;
    //3.开通道路
    conn.Open();//在命令对象执行命令之前才打开通道
    //4.叫命令对象去干活
    MessageBox.Show(cmd.ExecuteScalar().ToString());
    //5.关闭数据库连接
    conn.Close();
    MessageBox.Show(conn.State);//打印的Closed,说明conn对象还在,没有被销毁,但是路已经断了
    conn.Dispose();//表示当前对象可以被回收,什么时候回收呢
    MessageBox.Show(conn.State);//这里还可以访问对象
    1. 创建连接通道 conn
    2. 创建命令对象
    3. 指定命令对象要执行的命令
    4. 指定命令对象使用的连接通道
    5. 打开连接
    6. 执行命令
    7. 关闭,销毁连接

    Conn对象多次关闭不会报错,多次打开会报错

    关于using

    //实现了IDisposable接口的对象,可以使用using进行资源管理
    //using会在作用于结束的时候自动调用对象的dispose方法
    //1.
    using (SqlConnection conn = new SqlConnection("server=.;database=。。。。。。。"))
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "";
        cmd.Connection = conn;
        conn.Open();
        cmd.ExecuteScalar();
        //conn.Close();//关闭的是程序和数据库之间的连接,
        //conn.Dispose();//这个方法内部是调用了close方法的
    }
    //2. using (conn = new SqlConnection()){}
    //3. conn = new SqlConnection(); using (conn){}

    ADO.Net连接池

    池概念:在电脑内存里的一个键值对集合,键是连接字符串,值是conn对象。

    由于每次正常连接数据库都会至少执行3个操作(1.登录数据库服务器2.执行操作3.注销用户),所以每次通过Connection向数据库服务器申请一个连接都比较耗时。{ADO.Net是默认启用了连接池。}

    string constr = "server=.;database=heimablog;uid=sa;pwd=suncoder;Pooling=true";//Pooling告诉程序,是否是用连接池

    在连接字符串里,设置Pooling的值为false,就可以不适用连接池

    如果使用相同的连接字符串来创建一个新的Conn对象,那么就会直接从连接池中取出这个对象,不会重新创建,

    Conn的statchenge事件,这个事件就是可以去到在状态改变的时候,改变之前的状态和改变之后的状态

    Conn,state属性,可以取到当前的状态,这个状态是个枚举

    Conn.open()

    Conn.close()

    因为conn的父类实现了IDisposeable接口,所以我们可以使用using来管理资源,using可以再大括号解释的时候,自动调用对象的dispose方法,

    Conn的dispose方法默认调用了close方法,就可以不用手动写代码关闭连接

    Command对象

    Command对象,就是执行数据库查询的人,我们给它一个命令(sql语句),它有三大方法去执行这个语句,并且返回相应的数据 

    三大方法

    (1)ExecuteScalar()          这个是返回sql语句查询出来的结果集的第一行第一列的一个object值

    (2)ExecuteNonQuery()    执行非查询语句(增,删,改),并且返回受影响行数

    (3)ExecuteReader()        返回一个读取器,这个读取器读取的是服务器内存里的一个结果集数据,我们通过hasRows属性可以知道这个结果集有木有数据,

                                            Read()方法,可以让读取器向前进一行,并且把这一行的数据装到当前对象里,通过datareader[下标],就可以去到当前行的数据。

                                           下标从0开始,dr[0] 这个是通过下标查询结果集里面对应下标的列的数据,

                                           dr["Name"] 查询结果集里面对应列名的列的数据,

                                           因为,我们在sql语句中可以给列名取别名,所以这里的列名就不一定和数据库的列名相同。

    一般,我们用上面的方式取值,因为,第二种方式实际上还是先通过名字找到对应的下标,然后再通过下标找到数据,如果数据量不是很大,随便用哪个。

    Try catch

    捕捉程序运行时的错误,保证在一个功能出错的时候,不会使整个程序崩溃,让其他功能还能继续适用.

    Try Catch并不影响多大效率,情况是在没有报错的情况下,一旦报错,基本上消耗要大10倍.

    Try用法是要用在非常容易出错的地方,出错概率微乎其微的就不用.

    ExecuteScalar

    返回查询语句查询到的结果集的第一行第一列的值,由于程序本身不能确定返回值到底是什么类型的。所以,返回的时候object类型,需要我们自己做数据类型转换

    SqlConnection conn = new SqlConnection("server=.;database=。。。);
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = "select count(id) from Student";
    conn.Open();
    int res = Convert.ToInt32(cmd.ExecuteScalar());
    MessageBox.Show(res);

    在一个insert语句执行完毕后,得到刚才新增的主键

    INSERT INTO dbo.Teacher (Name, Gender, Salary)OUTPUT INSERTED.id VALUES('王五',0,102)
    DELETE FROM dbo.Teacher OUTPUT DELETED.id WHERE id=1007

    在insert语句的values前面加上“inserted.主键” 这样就可以去到新增之后的主键,对比普通的insert语句,普通的是显示受影响行数,如果加了output的就是返回主键值。

    和@@identity类似

    Deleted 是刚刚删除的数据,如果同时删除的不只一行数据那么会返回多个值。

  • 相关阅读:
    SignalRMvc的简单例子
    CTE递归查询
    数据库表设计(邻接表、路径枚举、嵌套集、闭包表)
    EF事务
    context日志
    Context连接和断开的情况下的CRUD操作
    Sql语句拼接(EXEC和sp_executesql的区别)
    实体框架中的变更跟踪
    sql server 添加字段并且赋默认值和说明
    C# .ToString() 格式化
  • 原文地址:https://www.cnblogs.com/lisong-home/p/7735849.html
Copyright © 2020-2023  润新知