[50分两问]关于.net中的存储过程问题
这几天看了下SqlHelper,再加上初学,于是乎手写了一个,有几点疑问:
(环境:vs2008 beta2+sql server 2005)
先贴代码:
sqlhelp.cs文件
public class SqlHelper
{
private SqlConnection Connection;
private string connectionString;
public string ConnectionString
{
get { return connectionString; }
set { connectionString = value; }
}
private CommandType _CommandType;
public CommandType CommandType
{
get{return _CommandType;}
set{_CommandType=value;}
}
public SqlHelper()
{
connectionString = ConfigurationManager.ConnectionStrings[ "connectionString "].ConnectionString;
Connection = new SqlConnection(connectionString);
}
/// <summary>
/// 构造函数(初始化SqlConnection)
/// </summary>
/// <param name= "connectionString "> </param>
public SqlHelper(string connectionString)
{
this.Connection = new SqlConnection(connectionString);
this.CommandType=CommandType.Text;
}
/// <summary>
/// 初始化SqlCommand对象
/// </summary>
/// <param name= "commandText "> T-Sql语句 </param>
/// <returns> SqlCommand对象 </returns>
private SqlCommand BuildInitCommand(string commandText)
{
SqlCommand Command = new SqlCommand(commandText, Connection);
Command.CommandType = this._CommandType;
return Command;
}
/// <summary>
/// 初始化SqlCommand对象
/// </summary>
/// <param name= "commandText "> T-Sql语句 </param>
/// <param name= "op "> SqlParameter数组 </param>
/// <returns> SqlCommand对象 </returns>
private SqlCommand BuildInitCommand(string commandText, IDataParameter[] op)
{
SqlCommand Command = new SqlCommand(commandText, Connection);
Command.CommandType = this._CommandType;
foreach (SqlParameter p in op)
{
Command.Parameters.Add(p);
}
return Command;
}
public SqlDataReader ExecuteReader(string commandText)
{
SqlDataReader reader;
Connection.Open();
SqlCommand Command = BuildInitCommand(commandText);
reader = Command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
return reader;
}
/// <summary>
/// 执行带参数T-Sql语句,返回DataReader
/// </summary>
/// <param name= "commandText "> T-Sql语句 </param>
/// <param name= "op "> DataParameter数组参数 </param>
/// <returns> SqlDataReader数据集 </returns>
public SqlDataReader ExecuteReader(string commandText, IDataParameter[] op)
{
SqlDataReader reader;
Connection.Open();
SqlCommand Command = BuildInitCommand(commandText, op);
reader = Command.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
defaut2.aspx文件
protected void Button1_Click(object sender, EventArgs e)
{
SqlHelper sh = new SqlHelper();
//sh.CommandType = CommandType.StoredProcedure;
SqlDataReader reader = sh.ExecuteReader( "sele ");
GridView1.DataSource = reader;
GridView1.DataBind();
reader.Close();
}
疑问:
1、此段代码能正常执行且读出数据,“sele”为存储过程,我并没有指定commandtype为StoredProcedure(我已经注释掉了),为什么可以正常执行存储过程?莫非.net可以自动识别命令类型?求解
2、我在实例化sqlhelp对象时,如果不指定commandtype属性。那么在bulidinitcommand方法中的Command.CommandType = this._CommandType这句commandtype值应该为空!!为啥还能执行??
技术不够好,请大家多多指教!!!
[解决办法]
1、意思是说如果命令带参数,而且又是存储过程,必须强制指定commandtype是吗?
-----------------------------------------
是的,加入你有个存储过程:sele,当为CommandType.Text,SqlCommnad会直接执行CommandText,也就是直接传 "sele "给SQL去执行,你可以发现在SQL查询分析器中可以直接执行sele。
而为CommandType.StoredProcedure的时候,SqlCommnad会传递 "Execute sele "给SQL去执行,所以也能执行,但如果存储过程有参数的话就必须要有Execute 才能执行
2、设置中断所看到的_CommandType和CommandType值都为0,更是不明白了!!
-------------------------
CommandType是个枚举,枚举里面的值都会对应1个int值,比如Text为0,StoredProcedure为1,TableDirect为2,所以只要你声明1个枚举变量_CommandType,即使你不给这个变量赋值,这个变量自己也会有个默认值,这个默认值就是0,对应Text.