经常看网上的一些.NET开源代码,发现数据层类里面一般有这样的方法。
比如:
        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms); //这里调用了另外一个方法
                        int rows = cmd.ExecuteNonQuery(); //为什么这里的CMD对象能执行?
                        cmd.Parameters.Clear();
                        return rows;
                    }
                    catch (System.Data.SqlClient.SqlException E)
                    {
                        throw new Exception(E.Message);
                    }
                }
            }
        }这个方法是执行SQL语句,在方法里面又调用了PrepareCommand 这个方法:private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }现在问题来了,注意看这2段
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms); //这里调用了另外一个函数
                        int rows = cmd.ExecuteNonQuery(); //为什么这里的CMD对象能执行?CMD对象是在第一个方法里面创建的,但是在这个方法里面调用了另外一个方法以后,CMD对象就有参数可以执行了,这是为什么呢? 又没有用OUT或者REF引用,怎么能把PrepareCommand方法里面的CMD等同于ExecuteSql方法里面的CMD对象呢?而且PrepareCommand方法又没有返回值?

解决方案 »

  1.   

    那什么情况下,对象的地址会变呢?因为以前看C#书的时候,说进入函数以后所作的操作不影响函数外部定义的变量,除非用REF把地址传进去。那为什么这里没有用REF,函数内部的操作还是会影响到外部的对象呢?
      

  2.   

    那2个cmd又不是同一个 ,肯定能执行啊  第2个方法就是用事务执行多条sql语句 
    其实就相当于 一个执行语句而已!!
      

  3.   


    大哥,看清楚点,第2个方法,只是给CMD对象附上了参数,真正执行还是在第一个方法的CMD
      

  4.   

    cmd是引用类型,只要不在方法里改变引用的指向,不加ref也可。
      

  5.   

    SqlCommand cmd 是引用类型,传递的是地址
      

  6.   

    SqlCommand cmd 是引用类型,传递的是地址就是这个原因
      

  7.   

    问题在于值类型与引用类型的区别。
    SqlCommand是引用类型,传递的是地址,只要不在方法里改变引用的指向,不加ref也可。