经常看网上的一些.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方法又没有返回值?
比如:
/// <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方法又没有返回值?
解决方案 »
- 使用list绑定到DataGridView的时候。。。
- winfrom里的DataGrid里怎么放控件?
- C#的Service项目中,怎么使用FolderBrowserDialog?
- [急急急]为什么我用BinaryWriter往文件里写字符串,会在写入文件的字符串前多出一个字节来?
- 不可序列话的类的实例不能在remoting中传递吗???
- 有ds1.table[0],ds2.table[0],如何写代码把ds2.table[0]变成ds1.table[1]?
- 请教一个基础问题,关于static方法的
- WebBrowser 循环创建问题
- 我想在自定义控件中定义自己的属性,表现形式:下拉菜单。。每选一个item..属性随之改变。。。如何添加这样的属性,并且实现这个属性。。
- 好像属性不能被继承和重载?
- 如和在List<object>对象的第一个位置添加一个对象?
- webbrowser 取ID问题
其实就相当于 一个执行语句而已!!
大哥,看清楚点,第2个方法,只是给CMD对象附上了参数,真正执行还是在第一个方法的CMD
SqlCommand是引用类型,传递的是地址,只要不在方法里改变引用的指向,不加ref也可。