维护基于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 秒。