Command执行方法
执行命令前必须保证conn的状态是Open;
连接的使用原则:最晚打开,最早关闭
目录
1、ExecuteNonQuery() 实现增删改
执行T-SQL语句或存储函数,并返回受影响的行数;
命令类型:插入、更新、删除 DML
static void TestExecuteNonQuery()
{
string Str = ConfigurationManager.ConnectionStrings
["connStr"].ConnectionString;
SqlConnection conn = new SqlConnection(Str);
string uName = "jon";
string uPwd = "456";
int age = 25;
int deptId = 2;
//拼接式SQL; 致命弱点:很容易被SQL注入
string sqlStr = "insert into tesTable(uName,uPwd,age,deptId) values" +
"('" + uName + "','" + uPwd + "','" + age + "','" + deptId + "');";
SqlCommand command = new SqlCommand();
command.Connection = conn;
command.CommandText = sqlStr;
conn.Open();
int count = command.ExecuteNonQuery();
Console.WriteLine("受影响的行数:"+count);
conn.Close();
}
2、ExecuteScalar()实现查
执行T-SQL语句或存储过程,并返回查询结果集中的第一行第一列的值,忽略其他行或列
命令类型:查询 DQL 数据查询语言
适用:做查询,返回一个值 【object类型】 记录数 数据运算的结果 查询某条记录的某个字段值
static void TestExecuteScalar()
{
string str = ConfigurationManager.ConnectionStrings
["connStr"].ConnectionString;
SqlConnection connection = new SqlConnection(str);
SqlCommand command = new SqlCommand();
string sqlstring = "select * from tesTable";
//使用伪造的列,来统计表的数据条数,以此优化性能
string sqlstring2 = "select count(1) from tesTable";
command.Connection = connection;
command.CommandText = sqlstring2;
connection.Open();
object o = command.ExecuteScalar();
if (o != null)
{
Console.WriteLine("共计数据:"+o.ToString()+"条");
}
connection.Close();
}
执行结果:
数据库内容:
3、ExecuteReader()实现查
返回一个对象:SqlDataReader(读取数据的数据流)
SqlDataReader 该对象读取速度比较高效,占用内存较小;
一种实时读取的方式,类似于游标(指针)的存在;
读取方式固定,不够灵活,只进不出的方式(只能前进,不能后退);
在读取数据的过程中,需要保持连接状态为Open,否则数据不会被读取
适用:只读取数据,不做修改的情况;由于一直占用连接,因此适用数据量较小的场景
static void TestExecuteReader()
{
string str = ConfigurationManager.ConnectionStrings
["connStr"].ConnectionString;
SqlConnection connection = new SqlConnection(str);
string sqlString = "select * from tesTable";
SqlCommand command = new SqlCommand();
command.CommandText = sqlString;
command.Connection = connection;
connection.Open();
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr["uName"].ToString()+"\t"+dr["uPwd"].ToString() + "\t" + dr["age"].ToString());
}
connection.Close();
}
运行结果:
数据库内容:
Tips:使用伪造列,来提升数据查询性能
select count(1) from tesTable;
相对于 【count(*) 】不用遍历所有的列,只会根据行数生成伪造列1,返回总记录条数