神刀安全网

维护基于ASP.NET的网站的学习-SqlCommand类介绍及存储过程

笔者目前在维护学校科技处的一个网站,目前学期初,教师申报项目操作多,出现了一些问题。前几天维护了一个验证码图片不显示的bug,今天想记录下这个解决了一整天的bug-老师项目结题需要手动修改数据库老师项目的结题状态为1,否则该老师无法继续申报项目。(以解决过程为主线介绍,最后附加SqlCommand类的介绍)

针对这个问题,我首先定位了页面,在源码中分析了一下逻辑,aspx.cs页面代码如下

cmd = new SqlCommand("[sp_review_is_shenbao]", Con);             cmd.CommandType = CommandType.StoredProcedure;             SqlParameter paroutput = cmd.Parameters.Add("@i_num", SqlDbType.Int);             paroutput.Direction = ParameterDirection.Output;             cmd.Parameters.AddWithValue("@type", "is_shenbao");             cmd.Parameters.AddWithValue("@work_card", str_card);             cmd.Parameters.AddWithValue("@other", "");             cmd.Parameters.AddWithValue("@other2", "");             row = cmd.ExecuteNonQuery();             Con.Close();             int i_num = int.Parse(paroutput.Value.ToString());             if (i_num == 0)             {                 this.lb_exist.Visible = false;                 this.lb_exist.Text = "";                 this.LinkButton4.Enabled = true;             }             else             {                 this.lb_exist.Visible = true;                 this.lb_exist.Text = "对不起,您不符合申报条件,不可以进行申报。";                 this.LinkButton4.Enabled = false;             }

其中的第一行代码我没有接触过,SqlCommand的第一个参数是一个存储过程,以前接触的都是sql语句,sql语句中有对数据库表格的定位和操作,而存储过程在数据库中封装,首先需要打开sqlserver数据库的可编程性>存储过程>系统存储过程>找到自己需要的存储过程名称>右键修改就可以查看了,如图

  cmd = new SqlCommand("[sp_review_is_shenbao]", Con); 

打开存储过程为

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go             ALTER PROCEDURE [dbo].[sp_review_is_shenbao]   //创建名称为sp_review_is_shenbao的存储过程      @i_num int output,       //一些参数创建 @type char(20),        @work_card char(20),        @other varchar(50),        @other2 varchar(200)        AS BEGIN                            //具体逻辑处理 if(@type='is_shenbao')       //如果年龄大于四十岁不可以申报项目 begin        declare @age int    declare @year datetime    set @year=(select dateadd(ms,-3,dateadd(yy,datediff(yy,0,getdate())+1,0)))   set @age=(select datediff(yyyy,birthday,@year) from table_person where work_card=@work_card )       if(@age>40)       begin       set @i_num=1       end       else       begin       set @i_num=0       end              declare @jieti int      //如果以前是项目不是结题状态,不可以继续申报项目 set @jieti=(SELECT count(project_id) as num FROM review_project_info  where work_card=@work_card and is_jieti=0      and state_manage='1' )        if(@jieti=0)       begin       set @i_num=@i_num+0       end       else       begin       set @i_num=@i_num+1       end              end         END

具体的逻辑就是,老师的年龄必须大于四十岁并且以前的所有项目均结题,才可以继续申报项目。需求是,手动改动数据库,将所有教师的所有项目改为结题状态,目的是让他们可以继续申报项目。通过存储过程,确定了是表review_project_info中存储了项目的结题状态,新建查询,输入update review_project_info set is_jieti=1;改动。

测试满足需求,结束。

最后,介绍下SqlCommand类

1.SqlCommand类的构造函数有四种重载形式:

SqlCommand();

SqlCommand(String);

SqlCommand(String,SqlConnection); //主意String可以为存储过程和sql语句,例如,cmd = new SqlCommand( " [sp_review_is_shenbao] ", Con);

SqlCommand(String,SqlConnection,SqlTransaction);

2.SqlCommand类的三个方法:

1.ExecuteNonQuery();它的返回值类型为int型。多用于执行增加,删除,修改数据。返回受影响的行数。

2.ExecuteReader();它的返回类型为SqlDataReader。此方法用于用户进行的查询操作。使用SqlDataReader对象的Read();方法进行逐行读取。

例如:

SqlCommand comm =new SqlCommand("select * from CGSZ where cid="+id,conn); SqlDataReader reder=comm.ExecuteReader(); while(reder.Read()) { //读出内容列 string str=reder["cname"].ToString(); //读取分类列 string str1=reder["ckind"].ToString(); //分别为文本框加载数据 this.txtContent.Text = str; this.txtClass.Text = str1; }

3.ExecuteScalar();它的返回值类型多为int类型。它返回的多为执行select查询。得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函 数求和等。

3.SqlCommand类的四个属性:

1.CommandText,获取或设置要对数据源执行的Transact— SQL语句存储过程

2.CommandType,获取或设置一个值,该值指示如何解释CommandText属性。

3.Connection,获取或设置SqlCommand的实例使用的 SqlConnection

4.CommandTimeOut,获取或设置在终止执行命令的尝试并生成错误之前的等待时间。等待命令执行的时时间(以秒为单位)。预设值为 30 秒。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 维护基于ASP.NET的网站的学习-SqlCommand类介绍及存储过程

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮