SqlCommand的三种方法:
执行时必须保证SqlConnection是处于open状态
ExecuteNonQuery 执行T-SQL,返回受影响的行数 。 增、删、改的通用方法
ExecuteScalar 执行查询,返回结果集的第一行第一列数据
ExecuteReader 执行查询,生成SqlDataReader
构建一个SqlCommand
参数说明:
conn:连接对象
sql:执行的T-SQL语句或存储过程
cmdType:连接类型 1:表示执行T-SQL语句 2:表示执行一个存储过程
trans:表示是否执行一个事务,不执行时,可以传入null值
paras:SqlCommand的参数列表
以下封装好的方法会返回一个所需要的SqlCommand命令,并确保已经开SqlConnection
private static SqlCommand BuilderCommand(SqlConnection conn, string sql, int cmdType, SqlTransaction trans,params SqlParameter[] paras)
{
if (conn == null)
{
throw new ArgumentNullException("连接对象不能为空!");
}
SqlCommand command = new SqlCommand(sql, conn);
if (cmdType==2)
command.CommandType = CommandType.StoredProcedure;
if (conn.State == ConnectionState.Closed)
conn.Open();
if (trans != null)
command.Transaction = trans;
if (paras != null && paras.Length > 0)
{
command.Parameters.Clear();
command.Parameters.AddRange(paras);
}
return command;
}
封装ExecuteNonQuery:
public static int ExecuteNonQuery(string sql,int cmdType,params SqlParameter[] parameters)
{
//select @@Identity 返回上一次插入记录时自动产生的ID
int result = 0;//返回结果
using (SqlConnection conn = new SqlConnection(connStr))
{
//执行脚本的对象cmd
SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters);
result = cmd.ExecuteNonQuery();//执行T-SQL并返回受影响行数
cmd.Parameters.Clear();
}
//using原理:类似于try finally
return result;
}
封装ExecuteScalar:
public static object ExecuteScalar(string sql,int cmdType, params SqlParameter[] parameters)
{
//params 只能写在一维数组之前,且只能标识参数列表中的最后一个参数
//select @@Identity 返回上一次插入记录时自动产生的ID
object result = null;//返回结果
using (SqlConnection conn = new SqlConnection(connStr))
{
//执行脚本的对象cmd
SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters);
result = cmd.ExecuteScalar();//执行T-SQL并返回第一行第一列的值
cmd.Parameters.Clear();
if (result == null || result == DBNull.Value)
{
return null;
}
else
{
return result;
}
}
}
封装SqlDataReader:
这个方法不使用using语句块,是因为不能释放连接
public static SqlDataReader ExecuteReader(string sql,int cmdType,params SqlParameter[] parameters)
{
SqlConnection conn = new SqlConnection(connStr);
//通过BuilderCommand方法,保证open连接了
SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters);
SqlDataReader reader;
try
{
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
catch (Exception ex)
{
conn.Close();
throw new Exception("创建reader对象发生异常", ex);
}
}