笔者目前在维护学校科技处的一个网站,目前学期初,教师申报项目操作多,出现了一些问题。前几天维护了一个验证码图片不显示的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 秒。