首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

[50分两问]关于.net中的存储过程有关问题

2012-03-20 
[50分两问]关于.net中的存储过程问题这几天看了下SqlHelper,再加上初学,于是乎手写了一个,有几点疑问:(环

[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.

热点排行