认识ADO.NET中Command的主要三个方法

认识Command
作者:秋名
撰写时间:2020 年 8 月 04 日
关键技术: ADO.NET中Command的三个方法

ExecuteReader:通常用来执行一个查询操作
ExecuteNonQuery:通常对数据库中的数据进行增、删、改的操作
ExecuteScalar:用于执行SQL语句

1、ExecuteReader通常用来执行一个查询操作,返回一个SqlDataReader对象或OleDbDataReader对象。当使用DataReader对象时,它被设计为一个只读、只进的数据流。这些数据流都是从数据库返回的。所以,每次的访问或操作只有一个记录保存在服务器的内存中。
DataReader具有较快的访问能力,并且使用较少的服务器资源。DataReader提供了“游标式”读取方法,当从结果中读取了一行,则“游标”会继续读取到下一行。通过Read方法可以一行一行读取数据,并且返回bool值,以判断从数据库中是否读取完数据。示例:

  //cmd.ExecuteReader() 查询 返回一个对象:SqlDataReader 
        //SqlDataReader 数据流 实时读取  游标 指针  固定--不灵活:只进不出,只能前进,不能后退  只读
        //适用:只是读取数据,不做修改的情况下   数据量比较小
        private static void TestExecuteReader()
        {
            SqlDataReader dr = null;
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                //string sql = "select * from UserInfos";
                //统计UserInfos表有多个条记录
                // string sql = "select count(1) from UserInfos where Age>25";
                string sql = "select UserId,UserName,Age from UserInfos";
                //创建执行命令的对象 SqlCommand
                SqlCommand cmd = new SqlCommand(sql, conn);
                //执行命令
                //1.执行T-SQL语句或存储过程,并返回返回查询结果集中的第一行第一列的值,忽略其他行或列。
                //适用:作查询,返回一个值   记录数  数据运算而出的结果 
                //命令类型:查询---- DQL 数据查询语言 
                //共有的条件:conn状态 必须是Open
                //连接使用原则:最晚打开,最早关闭

                conn.Open();
                //dr读取数据整个过程,conn必须保持Open
                dr = cmd.ExecuteReader();
                //dr读取数据过程中,要即时保存,读一条丢一条
                while (dr.Read())//是否可以前进到一条记录
                {
                    int userId = int.Parse(dr["UserId"].ToString());
                    string userName = dr["UserName"].ToString();
                    int age = int.Parse(dr["Age"].ToString());
                    Console.WriteLine($"UserId:{userId},UserName:{userName},Age:{age}");
                }
                dr.Close();
                //conn.Close();
            }
            //这里来读取,是无法读取数据
            //while (dr.Read())//是否可以前进到一条记录
            //{
            //    int userId = int.Parse(dr["UserId"].ToString());
            //    string userName = dr["UserName"].ToString();
            //    int age = int.Parse(dr["Age"].ToString());
            //    Console.WriteLine($"UserId:{userId},UserName:{userName},Age:{age}");
            //}
            //dr.Close();
            //conn.Close();
        }

执行ExecuteReader方法时,通过CommandBehavior的枚举值CloseConnection可在关闭SqlDataReader对象时自动断开SqlConneciton连接。

2、ExecuteNonQuery通常对数据库中的数据进行增、删、改的操作,返回受影响的行数(为整型)。。在进行数据库事务处理时或不需要DataSet为数据库进行更新时,ExecuteNonQuery()方法是数据操作的首选。因为ExecuteNonQuery()支持多种数据库语句的执行。
注:当使用select查询时,返回值为-1;使用create table或drop table返回0。示例:

  /// <summary>
        /// 执行cmd.ExecuteNonQuery:通常对数据库中的数据进行增、删、改的操作
        /// </summary>
        private static void TestExecuteNonQuery()
        {
            int count = 0;
            //conn默认状态是Closed
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                string uName = "linux";
                string uPwd = "2235";
                int age = 18;
                int deptId = 2;
                //创建命令  T-SQL 存储过程
                //拼接式SQL  致命弱点:很容易被SQL注入

                //新增
                string sql = "insert into UserInfos (UserName,UserPwd,Age,DeptId) values ('"+uName+"','"+uPwd+"',"+age+","+deptId+")";
                //删除
                //string delSql = "delete from UserInfos where userid=1";
                //修改
                //string updSqpl= "update UserInfos set UserName='json',UserPwd='123',age='20',deptId=1 where userid=1";
                //创建执行命令的对象 SqlCommand
               SqlCommand cmd = new SqlCommand(sql, conn);
                //执行命令
                //1.执行T-SQL语句或存储过程,并返回受影响的行数
                //命令类型:插入、更新、删除---- DML 
                //共有的条件:conn状态 必须是Open
                //连接使用原则:最晚打开,最早关闭
                conn.Open();
                count = cmd.ExecuteNonQuery();
               // conn.Close();
            }
            if (count > 0)
            {
                 Console.WriteLine("用户信息添加 成功!");
                 //Console.WriteLine("用户信息修改 成功!");
                //Console.WriteLine("用户信息删除 成功!");
            }
        }

3、ExecuteScalar用于执行SQL语句,但返回的是object类型的数据。如果执行的是查询语句select时,则查询返回的结果是第一行的第一列;如果不是查询语句时,则返回的事为实例化的对象,必须通过类型转换得到。

  private static  void  TestExecuteScalar()
        {
            object o = null;
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                // string sql = "select * from UserInfos";
                //统计UserInfos表有多个条记录(使用count(*)不支持表数据比较多的统计,count(1)统计条数会比较快)
                //string sql = "select count(1) from UserInfos where Age>25";
                string sql = "insert into UserInfos (UserName,UserPwd,Age,DeptId) values ('text','sdfa',12 , 2 );select @@identity";
                //用select @@identity得到上一次插入记录时自动产生的ID
                //创建执行命令的对象 SqlCommand
                SqlCommand cmd = new SqlCommand(sql, conn);
                //执行命令
                //1.执行T-SQL语句或存储过程,并返回返回查询结果集中的第一行第一列的值,忽略其他行或列。
                //适用:作查询,返回一个值   记录数  数据运算而出的结果 
                //命令类型:查询---- DQL 数据查询语言 
                //共有的条件:conn状态 必须是Open
                //连接使用原则:最晚打开,最早关闭
                conn.Open();
                o = cmd.ExecuteScalar();
                conn.Close();
            }
            if(o!=null)Console.WriteLine("返回值:"+o.ToString());
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值