认识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());
}