zoukankan      html  css  js  c++  java
  • cmd.Parameters.Clear() 作用及影响

    public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] cmdParms)
            {

                SqlCommand cmd = new SqlCommand();

                using (SqlConnection conn = new SqlConnection(Constr))
                {
                    ProCommand(cmd, conn, cmdText, cmdType, cmdParms);
                    int val = cmd.ExecuteNonQuery();
                    //cmd.Parameters.Clear();
                    return val;
           

                }

            }  

    private static void ProCommand(SqlCommand cmd, SqlConnection conn, string cmdText, CommandType cmdType, SqlParameter[] cmdParms)
            {

                if (conn.State != ConnectionState.Open)
                    conn.Open();

                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                cmd.CommandType = cmdType;

                if (cmdParms != null)
                {
                    cmd.Parameters.AddRange(cmdParms);
                }
            }

    运行连续调

     
                string sqlInsert = "INSERT INTO test (gname) VALUES (@gname)";
                string sqlSelect = "SELECT * FROM test WHERE gname=@gname";
                SqlParameter parms = new SqlParameter("@gname""testUser");

                SQLHelp.ExecuteNonQuery(sqlInsert, CommandType.Text, parms);
                SQLHelp.ExecuteNonQuery(sqlSelect, CommandType.Text, parms);

    会出错,出错原因

         当我看到cmd.Parameters.Add(parm) 时发现cmd.Parameters是SqlParameterColeection类型的,而SqlParameterColeection在framework中有个怪脾气,“它不用别人用过的”,说得明白点就是:如果一个对象A被一个SqlParameterColeection引用后,此时有另一个SqlParameterColeection再引用A对象时就会发生异常。

    当第一次调用ExecuteNonQuery时会有一个SqlParameterCollection引用parms,注意,这时第一次ExecuteNonQuery调用时产生的cmd还未被垃圾回收器回收,它依然引用着parms,直到真正被回收后,当第二次调用ExecuteNonQuery又会有另一个SqlParameterCollection(cmd.Parameters)将去引用parms,这样就会抛出异常了!!! 

     

    原因是你用到了SqlDataReader,你用DataTable缓存结果集就没问题了,因为当你的SqlDataReader没有关闭之前,那个返回型参数将得不到值,但是你在遍历那个SqlDataReader 之前就清空了Parameters,因此返回值无法回写。看看你的Helper中,有没有执行后得到DataTable或者DataSet的方法,有的话直接用那个就绝对不会有问题的。

    解决这个问题、

    一、cmd.Parameters.Clear() 增加个cmd实例化后面

    public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] cmdParms)
            {
    
                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Clear();
                using (SqlConnection conn = new SqlConnection(Constr))
                {
                    ProCommand(cmd, conn, cmdText, cmdType, cmdParms);
                    int val = cmd.ExecuteNonQuery();
                    //cmd.Parameters.Clear();
                    return val;
                }
            }  

    二、不用SqlDataReader 读取,用DataTable或者DataSet的方法

    参考:http://blog.csdn.net/chenyiying37/article/details/5797090 

    http://www.debugease.com/csharp/143516.html

  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/chixiaojin/p/2437392.html
Copyright © 2011-2022 走看看