.有一个sqlhelper类,从web.config里获得了连接
在数据层里,是不是还要一个连接类?
public void UserInsert()
{
using(???????)
}...该怎么写.,拜托大家贴上来
在数据层里,是不是还要一个连接类?
public void UserInsert()
{
using(???????)
}...该怎么写.,拜托大家贴上来
解决方案 »
- .net中怎么使用同一个ID不同的值来同时显示这一个网站,还可以同时100人访问
- 如何在自定义控件中使用泛型属性?
- 问个gridview控制列的文字显示个数的问题.
- 后台生成excel文件
- 请C#一正规表达式,检查是否为a-zA-ZA0123456789_-,其它全为无效
- 为什么无法获取到DataGrid中的TextBox值?
- 关于GridView绑定XML文件的蹊跷现象
- web发送即时消息,如果不用javascript+xml,是否还有其它方法?
- asp.net中,怎么动态在页面上的textBox的光标所在处插入一段字符串?100分相送,在线
- 两张表格对齐
- 无意中点了.NET版块的排行榜,进入了前100名,问个小问题,可散技术分!
- VS2008下SetAuthCookie无效
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
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();
}
{
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;
}
}