.有一个sqlhelper类,从web.config里获得了连接
在数据层里,是不是还要一个连接类?
public void UserInsert()
{
using(???????)
}...该怎么写.,拜托大家贴上来

解决方案 »

  1.   

    SQLHelper类给我们操作数据库提供了便利,有些人说,SqlHelper类运行存储过程无法获取参数的返回值,这个认识是错误的。 SqlHelper类调用存储过程的方法有下面类似的两种类型:
    public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 
    public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) 很多人没注意到第一种调用方法是能运行存储过程的,认为commandText参数只是传递sql命令,其实当CommandType 是存储过程的时候,commandText可以是存储过程的名字,看看SqlHelper上的参数说明:
    /// <param name="connectionString">A valid connection string for a SqlConnection</param>
            /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
            /// <param name="commandText">The stored procedure name or T-SQL command</param>
            /// <param name="commandParameters">An array of SqlParamters used to execute the command</param>
            /// <returns>An int representing the number of rows affected by the command</returns>
    我开始也是没注意这个问题,后来翻看它的源码才注意到了,前面尝试调用第二方法来获取返回值,其实这是无法获取的。第二种调用说明上已经清楚的指出了不能获取参数的返回值。
    /// <res>
            /// This method provides no access to output parameters or the stored procedure's return value parameter.
    仔细看的里面的实现将会发现:
    它调用了:GetSpParameterSet(connection, spName, false);
    接着调用:GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter);
    在GetSpParameterSetInternal里面有这样的判断:
    string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter":"");很显然没有返回值,然后在DiscoverSpParameterSet方法内通过 if (!includeReturnValueParameter) 
        {
                    cmd.Parameters.RemoveAt(0);//由于自动检测参数时, 会在参数列表的首项加入@Return_Value.如果不需要它时,就要移去
        }
    消除返回参数。其实由于第二种方法传递的是object类型的数据进去,根本就没有把需要返回参数返回值这种信息传递进去,程序无法知道你是不是需要返回参数的值。而且object类型是值类型,函数内改变它的值也带不回来。之所以会有第二种调用方法是为了我们能更方便的调用存储过程,不必去关系存储过程参数名是什么,知道它的参数顺序就可以了,它主要是利用SqlCommandBuilder.DeriveParameters(cmd);来获取参数信息的,利用hashtable保存了Parameters。(为什么要用hashtable来保存,不保存应该也可以行的通的,还是从hashtable 里才clone一份Parameters出来用的。用静态的hashtable存储了最近一次调用的SqlParameter ,如果下次还是同一次调用,速度会快一些,不用去SqlCommandBuilder.DeriveParameters了,少连一次数据库)第一种方法显然是要麻烦很多,要创建 SqlParameter 对象,还要注意存储过程参数名称等问题。下面是第一种方法调用例子:
    string name;
            SqlParameter [] para=new SqlParameter[2];
            para[0]=new SqlParameter("@yhm","adm");
            para[1]=new SqlParameter("@name",SqlDbType.VarChar,100);
            para[1].Direction=ParameterDirection.Output;
            SqlHelper.ExecuteNonQuery(ConfigString.connectString, CommandType.StoredProcedure, "up_getUserName", para);
            name = para[1].Value.ToString();
            Response.Write(name); 其实很简单,只是我们没注意而已。sqlhelper内使用SqlConnection参数调用的话,将会根据SqlConnection的状态来决定sqlhelper关不关闭SqlConnection。如果SqlConnection在传入的时候是关闭的,那么sqlhelper会自己打开自己关闭;否则sqlhelper不会处理SqlConnection。 以上信息来自  http://lovexuwenhao.javaeye.com/blog/465580
      

  2.   

    demo://读取数据库连接字符串
            string settings = Convert.ToString(ConfigurationManager.ConnectionStrings["SqlServices"]);
            using (SqlConnection myconn = new SqlConnection(settings))
            {
                //创建数据库连接对象
                //打开数据库连接
                myconn.Open();
                //创建数据库命令
                SqlCommand mycmd = new SqlCommand("AddUser", myconn);
                //设置数据库命令类型为存储过程
                mycmd.CommandType = CommandType.StoredProcedure;            SqlParameter accountparameter = mycmd.Parameters.Add("@UserAccount", SqlDbType.NVarChar, 50);
                accountparameter.Value = tbx_user.Text;            SqlParameter Emailparameter = mycmd.Parameters.Add("@Email", SqlDbType.NVarChar, 50);
                Emailparameter.Value = tbx_email.Text;            SqlParameter userpwd = mycmd.Parameters.Add("@UserPwd", SqlDbType.NVarChar, 50);
                userpwd.Value = tbx_pwd.Text;            mycmd.ExecuteNonQuery();
                myconn.Close();
            }
      

  3.   

      public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    DataSet dataSet = new DataSet();
                    connection.Open();
                    SqlDataAdapter sqlDA = new SqlDataAdapter();
                    sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
                    sqlDA.Fill(dataSet,tableName);
                    connection.Close();
                    return dataSet;
                }
            }