一、执行常规SQL语句
SqlConnection conn = new SqlConnection("连接字符串");
conn.Open();
//建立连接,并执行sql语句命令
SqlCommand cmd = new SqlCommand(SQLString, conn);
// 执行SQL语句,返回影响的记录数
res = cmd.ExecuteNonQuery();
二、执行储存过程
想执行储存过程命令,需要设置SqlCommand的CommandType类型,CommandType类型有两种:
1、cmd.CommandType = CommandType.Text;
SqlCommand(string cmdText, SqlConnection connection);中cmdText可以是"存储过程名称",也可以是“EXEC 存储过程名称”;CommandType.Text指定类型是SQL文本命令,要求必须符合sql语法,而在SqlServer中存储过程可以不加“EXEC”直接使用存储过程名称执行,也可以在名称前加“EXEC”;
如果存储过程有参数,必须带上参数,输出参数必须用OUTPUT标识,否则返回空值;
示例:
SqlConnection conn = new SqlConnection("连接字符串");
conn.Open();
//建立连接,并执行sql语句命令
string sqltxt="EXEC 储存过程名称 N'参数1',参数2,参数3";
SqlCommand cmd = new SqlCommand(sqltxt, conn);
cmd.CommandType = CommandType.Text;
// 执行SQL语句
res = cmd.ExecuteNonQuery();
补充:
ExecuteNonQuery()执行存储过程返回-1的原因:存储过程里设置了set nocount on,意思是打开不计数的开关;设置为set nocount off 就是计数,这样ExecuteNonQuery()就会返回一个大于或等于0的正数。
2、cmd.CommandType = CommandType.StoredProcedure;
SqlCommand(string cmdText, SqlConnection connection);中cmdText只能是“存储过程名称”;CommandType.StoredProcedure指定类型是存储过程名称,所以不能加EXEC,也不能加参数,也不能在存储过程名前出现空白;
/// <summary>
/// 存储过程的调用
/// </summary>
/// <param name="name">存储过程的名字</param>
/// <param name="paras">需要传入的参数列表</param>
/// <returns></returns>
public DataTable ExecSql(string name, SqlParameter[] paras = null)
{
DataTable dt = new DataTable();
try
{
//当连接处于打开状态时关闭,然后再打开,避免有时候数据不能及时更新
if (conn.State == ConnectionState.Open)
conn.Close();
conn.Open();
SqlCommand cmd = new SqlCommand(name, conn);
//给命令对象指定 要执行的是存储过程
cmd.CommandType = CommandType.StoredProcedure;
if (paras != null)
{
//将参数列表添加到命令对象的参数列表中
cmd.Parameters.AddRange(paras);
}
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(dt);
}
catch (Exception)
{
}
finally
{
conn.Close();
}
return dt;
}
|