单字段精确查询的实现
在开发网站过程中经常遇到单字段精确查询。单字段精确查询是指根据浏览者输入或选择的条件进行精确查询,经常应用在对于查询结果要求比较精确的页面。在设计单字段精确查询时,一般通过文本框、下拉列表框或单选按钮组获取查询条件。无论查询条件是由文本框提供,下拉列表框提供,还是由单选按钮组提供,其实现的方法都是类似的。下面将以单文本框精确查询为例介绍单字段精确查询的实现。
1.方案分析
单字段精确查询就是指在一个查询中,只有一个用于输入查询条件的文本框。浏览者只能查找与输入的查询关键字完全匹配的数据。单文本框精确查询经常应用于查询某一固定信息的情况下。例如查询手机号码、车牌号码归属地或根据会员名称查询会员的订单信息等。
在实现单文本框精确查询时,首先需要确定检索词并设置查询条件,然后编写检索式,最后输出查询结果。为了使读者更好的理解单文本框精确查询,下面给出单文本框精确查询的流程图,如图所示。
图 单文本框精确查询的示意图
2.实施过程
在开发酒店管理系统时,在房间信息维护模块中,有查询房间的功能。由于房间的号码是惟一的,所以这里的查询功能就用到了单字段的精确查询。根据输入的房间号码,用户可以很快的检索出对应的信息,如图所示。
图 根据查询条件查询的结果
程序实现具体步骤:
(1)新建一个网站命名为01,默认主页为Default.aspx。
(2)在Default.aspx页中添加两个TextBox控件,分别用于输入登录的用户名和密码,然后再添加一个Button控件用于登录。
(3)新建一个名为RoomManage.aspx的页,在页面中添加一个TextBox控件,用于输入查询的关键字,添加一个Button控件用于提交查询关键字,添加一个GridView控件用于显示数据。
(4)新建一个名为RoomModify.aspx的页,在页面上添加两个TextBox控件,分别用于显示房间位置和房间描述,再添加一个DropDownList控件用于显示房间类型。
(5)程序主要代码如下。
首先在Web.config文件中进行数据库连接配置,具体代码如下。
<appSettings>/*应用程序设置*/
<add key="dsn" value="server=.;database=db_04;uid=sa;pwd="/>
</appSettings>
在Default.aspx页中实现了用户的登录,通过输入的用户名和密码进行查询,如果数据库中存在此用户名和密码,就会允许进入系统,否则将会提示重新登录,具体代码如下。
protected void ImageButton2_Click(object sender, ImageClickEventArgs e)
{
//从文件Web.config中读取连接字符串/*config 配置*/
string strconn = ConfigurationSettings.AppSettings["dsn"];/*string 串 Configuration组态*/
//连接本地计算机的HMS数据库
SqlConnection cn = new SqlConnection(strconn);
cn.Open();
//构造SQL语句,该语句在Users表中检查用户名和密码是否正确
string mysql = "select * from Users where Uid='" + tbx_uid.Text + "'and UPassword='" + tbx_upassword.Text + "'";
//创建Command对象
SqlCommand cm = new SqlCommand(mysql, cn);
//执行ExecuteReader ()方法
SqlDataReader dr = cm.ExecuteReader();
if (dr.Read())
{
lbl_message.Text = "";
//保存当前用户名及用户权限
Session["uid"] = dr["uid"].ToString();
Session["upower"] = dr["upower"].ToString();
lbl_message.Text = "欢迎您!" + Session["uid"];
if (Session["upower"].ToString() == "1")
{ //进入酒店总管界面
Response.Redirect("roommanage.aspx");
}
else if (Session["upower"].ToString() == "2")
{ //进入酒店前台界面
Response.Redirect("roomlist.aspx");
}
}
else
{
lbl_message.Text = "对不起,您的用户名/密码不正确,请重新输入";
}
//关闭连接
cn.Close();
}
在RoomManage.aspx页中,当页面加载的时候会调用自定义的BindGrid方法显示所有的房间信息,具体代码如下。
protected void Page_Load(object sender, System.EventArgs e)
{
if (Session["uid"]!="")
{
if (!IsPostBack) BindGrid();
}
else
{
Page.RegisterStartupScript("", "<script>alert('请登录')</script>");
}
}
//自定义一个BindGrid方法用于显示所有的房间信息
public void BindGrid()
{ //从文件Web.config中读取连接字符串
string strconn= ConfigurationSettings.AppSettings["dsn"];
//连接本地计算机的HMS数据库
SqlConnection cn= new SqlConnection (strconn);
//创建SqlDataAdapter对象,调用存储过程
SqlDataAdapter da=new SqlDataAdapter ("guestroomlist",cn);
//创建并填充DataSet
DataSet ds=new DataSet ();
da.Fill (ds);
GridView1.DataSource = ds;
GridView1.DataKeyNames = new string[] { "RID"};
GridView1.DataBind();
cn.Close ();
}
在ID属性为tbx_rid的文本框中输入要查询的关键字,然后单击“开始”按钮进行查询。程序将文本框中输入的值赋值给varrid,然后再通过Response.Redirect ("roommodify.aspx?rid="+varrid)将文本框的值传递给查询结果显示页面roommodify.aspx,代码如下。
protected void btn_search_Click(object sender, System.EventArgs e)
{
int varrid=0;
try
{
varrid=Convert.ToInt32 (tbx_rid.Text .ToString ());
}
catch
{
Response.Write("输入房号有误,请返回!");
Response.End();
}
Response.Redirect ("roommodify.aspx?rid="+varrid);
}
如果数据很多需要分页,会通过下面的代码对分页进行数据绑定。
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
BindGrid();
}
单击“删除”按钮,程序会根据每条信息的编号进行删除,具体代码如下。
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//对GuestRoom表进行删除
//从文件Web.config中读取连接字符串
string strconn = ConfigurationSettings.AppSettings["dsn"];
//连接本地计算机的HMS数据库
SqlConnection cn = new SqlConnection(strconn);
cn.Open();
SqlCommand cm = new SqlCommand("guestroomdelete", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add("@RID", SqlDbType.VarChar);
//从GridView中取得更新内容
cm.Parameters["@RID"].Value = GridView1.DataKeys[e.RowIndex].Value;
cm.ExecuteNonQuery();
cn.Close();
GridView1.EditIndex = -1;
BindGrid();
}
在roommodify.aspx中, 通过接收传递过来的值在数据库中进行查询,之后将查询的结果依次绑定到不同的控件上显示出来,代码如下。
protected void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{ //绑定房间类型信息下拉列表框
string strconn= ConfigurationSettings.AppSettings["dsn"];
//连接本地计算机的数据库
SqlConnection cn0= new SqlConnection (strconn);
cn0.Open ();
string mysql="select * from RoomType ";
SqlCommand cm0=new SqlCommand (mysql,cn0);
SqlDataReader dr0=cm0.ExecuteReader ();
while(dr0.Read ())
{
ddl_rtype.Items .Add (new ListItem(dr0["tname"].ToString(),dr0["tid"].ToString()) );
}
cn0.Close ();
//绑定各TextBox数据
//连接本地计算机的数据库
SqlConnection cn= new SqlConnection (strconn);
cn.Open ();
string key = Request.QueryString["rid"].ToString();
string sqlstr = "Select TID,Tname,Tprice,RID,Rtype,Rposition,Rdescribe from RoomType,GuestRoom where GuestRoom.RType=RoomType.TID AND GuestRoom.RID="+key;
SqlCommand cm=new SqlCommand (sqlstr,cn);
SqlDataReader dr=cm.ExecuteReader ();
if(dr.Read ())//存在对应项
{
lbl_rid.Text =dr["rid"].ToString ();
tbx_rposition.Text =dr["rposition"].ToString ();
tbx_rdescribe.Text =dr["rdescribe"].ToString ();
ddl_rtype.Items.FindByValue(dr["rtype"].ToString ()).Selected =true;
}
else
{
Response.Write ("对不起,没有该房间信息");
Response.End ();
}
}
}
——摘自《C#编程词典》