public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) {
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
------------------------------------------------------------------------------------
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, 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 = cmdType; if (cmdParms != null) {
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
------------------------------------------------------------------------------今天看petshop中这段代码,这里为什么cmd传给PrepareCommand中与这样的代码                  int i=2;
                   //i最后的值还是2
private static void add(int i)
{
i=20;
}
为什么cmd可以加SqlParameter参数。是不是要ref这样关键字?这里有些不解。
有没有人能为我指点一下?谢谢!

解决方案 »

  1.   

    if (cmdParms != null) {
    foreach (SqlParameter parm in cmdParms)
    cmd.Parameters.Add(parm);
    }用了这一句,是把SqlParameter遍历出来加到了SqlCommand语句里的
      

  2.   

    我的意思cmd是形参,cmdParms也是形参啊。
    形参传给函数后,不会有变化吧。应该加关键字ref.就像这样的两段程序
    ---------------------------------------------------------------
                      int i=2;
                      add(i);//i最后的值还是2
    private static void add(int i)
    {
    i=20;
    }                  int i=2;
                      add(ref i);//i最后的值是20
    private static void add(ref int i)
    {
    i=20;
    }
    ----------------------------------------------------------
      

  3.   

    值传递传的是i的另外一个副本,当然是不改变i的值。
    但是如果如下:
    pbulci static int i=2;
                      add(20);//i最后的值就是20
    private static void add(int ii)
    {
    i=ii;
    }
      

  4.   

    我觉得还是不对啊。这里不一样啊:ExecuteNonQuery是cmd是前面没有static,并且PrepareCommand中cmd是单独声明了的,为SqlCommand类型啊。不懂啊???哪个高手解决一下,与这个例子哪点不同
    就像这样的例子:最后test.aspx打出的结果还是1啊
    test.aspx中:this.Response.Write(testclass.ExecuteNonQuery().ToString());
    ----------------------------------------testclass.cs中:
    public abstract class testclass
    {
    //
    // TODO: 在此处添加构造函数逻辑
    // public static int ExecuteNonQuery()
    {
    int i=1;
    PrepareCommand(i,20);
    return i;
    }
        private static void PrepareCommand(int i,int j)
        {
         i=j;
        }
    }