菜鸟问一个简单的C# 函数问题
经常看网上的一些.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方法又没有返回值?