executenonquery(SqlHelper类中的ExecuteNonQuery方法解析)

发布时间:2025-12-10 19:27:11 浏览次数:20

SqlHelper类中的ExecuteNonQuery方法解析-

SqlHelper类中的ExecuteNonQuery方法解析在SqlHelper类(windows原)中,ExecuteNonQuery方法有八个重载,接下来我们来一一解析。第一个方法,在数据库连接对象(connection),命令类型(commandType),命令行文(commandText),SqlParameter参数数组(paramsSqlParameter[])都存在的情况下,我们使用这个方法。publicsta…

在SqlHelper类(windows原)中,ExecuteNonQuery方法通常用于执行数据库更新与返回存储过程的输出参数,它有九个重载,接下来我们来一一解析。
首先介绍一下此方法可以输入哪些参数:
1.数据库连接对象:SqlConnection类型或者SqlTransaction类型(SQL事务)

2.数据库连接字符串:String类型,可以使用此字符串通过SqlConnection()构造函数生成数据库连接对象,至于如何写这个字符串建议看看这篇文章点击查看
举个例子:@"Data Source =DESKTOP-BGCP8VN\MSSQLSERVER01; Initial Catalog = Test; User ID = sa; Password = 123456;Integrated Security=FALSE;" 分别代表服务器名,数据库名,用户名,密码,安全验证方式。

3.命令类型:CommandType类型,有三种:
3.1 SQL 文本命令。(默认。) Text = 1
3.2 存储过程的名称。StoredProcedure = 4
3.3 表的名称。TableDirect = 512

4.命令行文:String类型,根据命令类型不同而不同
4.1当命令类型为Text时,参考这篇文章点击查看写SQL命令
举个例子:@"INSERT INTO T_User VALUES(@userID,@userName,@userSex,@userPassword,@userLevel)";表示在T_User表中插入括号里的几个值。
4.2当命令类型为StoredProcedure时,使用存储过程名称
4.3当命令类型为TableDirect时,设置为要访问的表的名称

5.参数数组:params SqlParameter[]数组,此数组包含可包含多个参数,构造函数包含好几个重载,例如:
SqlParameter (String, SqlDbType, Int32, ParameterDirection, Byte, Byte, String, DataRowVersion, Boolean, Object, String, String, String)
其中参数分别代表:该类使用参数名、参数的类型、参数的长度、方向、精度、小数位数、源列名称、DataRowVersion 值之一、用于源列映射的布尔值、SqlParameter 的值、此 XML 实例的架构集合所在的数据库的名称、此 XML 实例的架构集合所在的关系架构以及此参数的架构集合的名称。
举一个初始化参数数组的例子:

    SqlParameter[] sqlparamter = new SqlParameter[]//参数第一项代表参数名,第二项代表参数类型    {        new SqlParameter("@userID", SqlDbType.Int),        new SqlParameter("@userName", SqlDbType.Char,30),        new SqlParameter("@userSex", SqlDbType.Char,6),        new SqlParameter("@userPassword", SqlDbType.Char,16),        new SqlParameter("@userLevel", SqlDbType.Char,8),    };

是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活CLion DataGrip DataSpell dotCover dotMemory dotTrace GoLand PhpStorm PyCharm ReSharper ReShaC++ Rider RubyMine WebStorm 全家桶 刷新

【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…

6.参数的对象数组:params object[]数组,可以用来生成参数数组。

第一个重载,在数据库连接对象(connection),命令类型(commandType),命令行文(commandText),SqlParameter参数数组(params SqlParameter[])都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters){  if (connection == null) throw new ArgumentNullException("connection");//1  // 创建SqlCommand命令,并进行预处理  SqlCommand cmd = new SqlCommand();  bool mustCloseConnection = false;  PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);//2  // 执行命令  int retval = cmd.ExecuteNonQuery();//3  // 清除参数,以便再次使用.  cmd.Parameters.Clear();//4  if (mustCloseConnection)  connection.Close();//5  return retval;//6}

解读:
1.首先判断数据库连接对象(connection)有效,否则抛出ArgumentNullException错误;
2.使用PrepareCommand方法使用输入的参数来使用预处理用户提供的命令(配置SqlCommand对象),同时得到了mustCloseConnection值,如果连接是打开的,则为true,其它情况下为false;
3.使用SqlCommand类的ExecuteNonQuery()方法来对连接执行 Transact-SQL 语句并返回受影响的行数;
4.使用SqlParameterCollection类的Clear()方法清空这些参数;
5.如果连接是打开的则调用SqlConnection类的Close()方法关闭此数据库连接对象;
6.返回第3步的运行结果。
这边提供ExecuteNonQuery()可能返回的异常类型:

T:System.InvalidCastException:当 System.Data.SqlClient.SqlParameter.Value 设置为 System.IO.Stream 时,使用了除 Binary或 VarBinary 之外的 System.Data.SqlClient.SqlParameter.SqlDbType流支持。当 System.Data.SqlClient.SqlParameter.Value 设置为 System.IO.TextReader 时,使用了除Char、NChar、NVarChar、 VarChar 或 Xml 之外的 System.Data.SqlClient.SqlParameter.SqlDbType。当System.Data.SqlClient.SqlParameter.Value 设置为 System.Xml.XmlReader 时,使用了除 Xml之外的 System.Data.SqlClient.SqlParameter.SqlDbType。T:System.Data.SqlClient.SqlException:在对锁定的行执行该命令期间发生了异常。如果使用的是 Microsoft .NET Framework 1.0 版,将不会生成该异常。以流的方式进行操作间发生的超时。T:System.IO.IOException: 在以流的方式进行操作期间出现在 System.IO.Stream、System.Xml.XmlReader 或 System.IO.TextReader中的错误。 T:System.InvalidOperationException:进行流式操作期间的已关闭或已放置的 System.Data.SqlClient.SqlConnection。T:System.ObjectDisposedException:进行流式操作期间 System.IO.Stream、System.Xml.XmlReader 或 System.IO.TextReader 对象已关闭。

第二个重载,在数据库连接字符串(connectionString),命令类型(commandType),命令行文(commandText),SqlParameter参数数组(params SqlParameter[])都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters){       if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");//1       using (SqlConnection connection = new SqlConnection(connectionString))//2.1       {       connection.Open();//2.2       return ExecuteNonQuery(connection, commandType, commandText, commandParameters);//2.3       }}

解读:
1.首先判断数据库连接字符串(connectionString)有效,否则抛出ArgumentNullException错误;
2.1.这是using语句的另一种用法,在程序编译阶段,编译器会自动将using语句生成为try-finally语句,并在finally块中调用对象的Dispose方法,来清理资源。所以,using语句等效于try-finally语句。此处生成一个SqlConnection对象。

using (Class1 cls1 = new Class1(), cls2 = new Class1()){somecode;  // the code using cls1, cls2} // call the Dispose on cls1 and cls2

等效于

try{Class1 cls1 = new Class1(), cls2 = new Class1();somecode;}finally{cls1.Dispose();cls2.Dispose();}

2.2.调用SqlConnection类的open方法,查询一下我们可以看到open方法继承于DbConnection类,SqlConnection类中重写了open方法,查询不到实现方法,暂时不管。open的作用是使用 ConnectionString 所指定的设置打开数据库连接。
2.3.从2.1中得到了SqlConnection数据库连接对象connection,此处我们又可以调用第一种重载,返回返回值。

第三个重载,在数据库连接字符串(connectionString),命令类型(commandType),命令行文(commandText)都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText){     return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null);}

我们可以看到这种重载只是让第二种重载的SqlParameter参数数组缺省,继续查询我们可以看到,如和命令相关联的SqlParameter参数数组为空则执行默认值。

第四个重载,这是一个存储过程专用重载,在数据库连接字符串(connectionString),存储过程名称(spName),分配到存储过程输入参数的对象数组(parameterValues)都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues){    if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");//1    if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");//2    // 如果存在参数值    if ((parameterValues != null) && (parameterValues.Length > 0))//3.1    {         // 从探索存储过程参数(加载到缓存)并分配给存储过程参数数组.         SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);//3.2         // 给存储过程参数赋值         AssignParameterValues(commandParameters, parameterValues);//3.3         return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);//3.4    }    else    {    // 没有参数情况下    return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);//4  }}

1.检测数据库连接字符串存在,否则抛出异常;
2.检测存储过程名称存在,否则抛出异常;
3.1.检测分配到存储过程输入参数的对象数组(parameterValues)不为空;
3.2.使用数据库连接字符串(connectionString),存储过程名称(spName)生成存储过程参数集,分配给存储过程参数数组;
3.3.使用AssignParameterValues()方法使用输入参数的对象数组(parameterValues)对3.2中得到的存储过程参数数组,进行赋值,至此得到了SqlParameter[]数组commandParameters;
3.4.此处调用的又是第二种重载,填入储存过程名称类型CommandType.StoredProcedure以及3.3中产生的存储过程参数数组commandParameters;
4.没有存储过程输入参数时调用第三种重载。

第五个重载,在数据库连接对象(connection),命令类型(commandType),命令行文(commandText)都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText){      return ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])null);}

我们可以看到这种重载只是让第一种重载的SqlParameter参数数组缺省,继续查询我们可以看到,如和命令相关联的SqlParameter参数数组为空则执行默认值。

第六个重载,这是一个存储过程专用重载,在数据库连接对象(connection),存储过程名称(spName),分配到存储过程输入参数的对象数组(parameterValues)都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues){  if (connection == null) throw new ArgumentNullException("connection");//1  if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");//2  // 如果有参数值  if ((parameterValues != null) && (parameterValues.Length > 0))//3.1  {     // 从缓存中加载存储过程参数     SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);//3.2     // 给存储过程分配参数值     AssignParameterValues(commandParameters, parameterValues);//3.3     return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters);//3.4  }  else  {     return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName);//4  }}

1.检测数据库连接对象存在,否则抛出异常;
2.检测存储过程名称存在,否则抛出异常;
3.1.检测分配到存储过程输入参数的对象数组(parameterValues)不为空;
3.2.使用数据库连接字符串(connectionString),存储过程名称(spName)生成存储过程参数集,分配给存储过程参数数组;
3.3.使用AssignParameterValues()方法使用输入参数的对象数组(parameterValues)对3.2中得到的存储过程参数数组,进行赋值,至此得到了SqlParameter[]数组commandParameters;
3.4.此处调用的又是第一种重载,填入储存过程名称类型CommandType.StoredProcedure以及3.3中产生的存储过程参数数组commandParameters;
4.没有存储过程输入参数时调用第五种重载。

前六个重载小结:
所有需要提供的参数有:数据库连接对象(connection)【数据库连接字符串(connectionString)】,命令类型(commandType),命令行文(commandText)【存储过程名称(spName)】,SqlParameter参数数组(params SqlParameter[])【输入参数的对象数组(params object[])】。
实际上后面五个重载最后调用的都是第一个重载,只是为了更灵活的使用而已,分别在如下情况时使用:
1.需要指定数据库连接对象,命令类型,命令行文,参数数组的用第一种重载;
2.需要指定数据库连接字符串,命令类型,命令行文,参数数组的用第二种重载;
3.需要指定数据库连接字符串,命令类型,命令行文,没有参数的用第三种重载;
4.需要指定数据库连接对象,命令类型,命令行文,没有参数的用第五种重载;
5.储存过程专用(命令类型默认为CommandType.StoredProcedure),需要指定数据库连接字符串,存储过程名称,参数的对象数组的用第四种重载;
6.储存过程专用(命令类型默认为CommandType.StoredProcedure),需要指定数据库连接对象,存储过程名称,参数的对象数组的用第六种重载;

接下来的三种重载都是操作SQL事务:

第七个重载,在需要操作SQL事务的数据库连接对象(transaction),命令类型(commandType),命令行文(commandText),SqlParameter参数数组(params SqlParameter[])都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters){  if (transaction == null) throw new ArgumentNullException("transaction");  if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");//1  // 预处理  SqlCommand cmd = new SqlCommand();  bool mustCloseConnection = false;  PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);//2  // 执行  int retval = cmd.ExecuteNonQuery();//3  // 清除参数集,以便再次使用.  cmd.Parameters.Clear();//4  return retval;//5}

1.首先判断数据库连接对象(transaction)有效,否则抛出ArgumentNullException错误;
2.使用PrepareCommand方法使用输入的参数来使用预处理用户提供的命令(配置SqlCommand对象),同时得到了mustCloseConnection值,如果连接是打开的,则为true,其它情况下为false;
3.使用SqlCommand类的ExecuteNonQuery()方法来对连接执行 Transact-SQL 语句并返回受影响的行数;
4.使用SqlParameterCollection类的Clear()方法清空这些参数;
5.返回第3步的运行结果。

第八个重载,在需要操作SQL事务的数据库连接对象(transaction),命令类型(commandType),命令行文(commandText)都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText){   return ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])null);}

我们可以看到这种方法只是让第七种重载的SqlParameter参数数组缺省,继续查询我们可以看到,如和命令相关联的SqlParameter参数数组为空则执行默认值。

第九个重载,这是一个存储过程专用重载,在需要操作SQL事务的数据库连接对象(transaction),存储过程名称(spName),分配到存储过程输入参数的对象数组(parameterValues)都存在的情况下,我们使用这个重载。

public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues){  if (transaction == null) throw new ArgumentNullException("transaction");  if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");//1  if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");//2  // 如果有参数值  if ((parameterValues != null) && (parameterValues.Length > 0))//3.1   {    // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()    SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName);//3.2    // 给存储过程参数赋值    AssignParameterValues(commandParameters, parameterValues);//3.3    // 调用重载方法    return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters);//3.4   }   else   {    // 没有参数值    return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName);//4   }}

1.检测数据库连接对象存在,否则抛出异常;
2.检测存储过程名称存在,否则抛出异常;
3.1.检测分配到存储过程输入参数的对象数组(parameterValues)不为空;
3.2.使用数据库连接字符串(connectionString),存储过程名称(spName)生成存储过程参数集,分配给存储过程参数数组;
3.3.使用AssignParameterValues()方法使用输入参数的对象数组(parameterValues)对3.2中得到的存储过程参数数组,进行赋值,至此得到了SqlParameter[]数组commandParameters;
3.4.此处调用的又是第一种方法,填入储存过程名称类型CommandType.StoredProcedure以及3.3中产生的存储过程参数数组commandParameters;
4.没有存储过程输入参数时调用第八种方法。

七到九重载小结:和2-6重载一样,实质上都是调用了第一种重载,只是这三种方法适用于SQL事务操作。
1.需要指定要操作SQL事务的数据库连接对象,命令类型,命令行文,参数数组的用第七种重载;
2.需要指定要操作SQL事务的数据库连接对象,命令类型,命令行文的用第八种重载;
3.储存过程专用(命令类型默认为CommandType.StoredProcedure),需要指定要操作SQL事务的数据库连接对象,存储过程名称,参数的对象数组的用第九种重载;

最后总结:
参数一共四类,特定情况命令类型与参数数组可缺省,其他两项不可缺省。
1.数据库连接对象(connection)【非SQL事务可用数据库连接字符串(connectionString)代替】
2.命令类型(commandType)【当为储存过程时可以缺省】
3.命令行文(commandText)【当为储存过程时可用存储过程名称(spName)代替】
4.SqlParameter参数数组(params SqlParameter[])【当为储存过程时可用输入参数的对象数组(params object[]),可缺省】。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477