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

 

posted @ 2016-03-12 10:26  rongyux  阅读(601)  评论(0编辑  收藏  举报