心得体会——数据库命令的应用
数据库命令的应用
根据上一次做的学习心得,我们已经了解如何完成成功的登录与注册的过程,以及当用户登录或注册时不恰当的操作,后台管理可以给予相关的提示。
这一次我们主要学习的是命令——存储(将命令文本中的内容改为存储过程的名称,简化相关操作,减少错误。)。以及面向对象——类(使用“类”这一功能,将相关操作分类,使得更为明晰,容易修改。)
2.5 命令——存储
在注册控件下的代码:
if (this.txb_UserNo.Text.Trim() == "") //若用户号文本框为空;
{
MessageBox.Show("用户号不能为空!"); //给出错误提示;
this.txb_UserNo.Focus(); //用户号文本框获得焦点;
return; //返回;
}
if (this.txb_Password.Text.Trim() == "") //若密码文本框为空;
{
MessageBox.Show("密码不能为空!"); //给出错误提示;
this.txb_Password.Focus(); //密码文本框获得焦点;
return; //返回;
}
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=EduBaseDemo;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = sqlConnection.CreateCommand(); //调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;
sqlCommand.CommandText = "usp_insertUser"; //指定SQL命令的命令文本;命令文本为存储过程名称;
sqlCommand.CommandType = CommandType.StoredProcedure; //SQL命令的类型设为存储过程;
sqlCommand.Parameters.AddWithValue("@No", this.txb_UserNo.Text.Trim()); //向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("@Password", this.txb_Password.Text.Trim());
sqlConnection.Open(); //打开SQL连接;
int rowAffected = 0; //声明整型变量,用于保存受影响行数;
try //尝试;
{
rowAffected = sqlCommand.ExecuteNonQuery(); //调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
}
catch (SqlException sqlEx) //捕捉SQL异常;
{
if (sqlEx.Number == 2627) //若SQL异常编号为2627,则违反主键/唯一约束,即插入重复值;
{
MessageBox.Show("您注册的用户号已存在,请重新输入!\n"); //给出错误提示;
}
}
sqlConnection.Close(); //关闭SQL连接;
if (rowAffected == 1) //若成功写入1行记录;
{
MessageBox.Show("注册成功。"); //显示正确提示;
}
else //否则;
{
MessageBox.Show("注册失败!"); //显示错误提示;
}
以上为注册的代码,但是我们根据上一次的代码做了一些修改(以上红色加粗部分)。
sqlCommand.CommandText = "usp_insertUser"; //指定SQL命令的命令文本;命令文本为存储过程名称;
此书写更为简洁,容易修改。
但我们要在数据库中编写相关代码:
--创建存储过程;
----插入用户;
GO
CREATE PROCEDURE usp_insertUser
(@No VARCHAR(10)
,@Password VARCHAR(20))
AS
BEGIN
INSERT tb_User
(No,Password)
VALUES
(@No
,HASHBYTES('MD5',@Password));
END
相较于上次的代码:
sqlCommand.CommandText =
"INSERT tb_User (No,Password) VALUES(@No,HASHBYTES('MD5',@Password));";
新的改进的改进方法更加不易出错。
3.1 面向对象——类
此次例子主要是使登录的代码分类,使得更容易理解。
在登录控件下的代码:
this.User.No = this.txb_UserNo.Text.Trim();
//将文本框的文本清除首尾的空格后,赋予用户的相应属性;
this.User.Password = this.txb_Password.Text.Trim();
this.User.LogIn(); //调用用户的方法登录,并将各文本框的文本作为参数;
MessageBox.Show(this.User.Message); //在消息框中显示登录消息;
if (!this.User.HasLoggedIn) //若用户未完成登录,即登录失败;
{
this.txb_Password.Focus(); //密码文本框获得焦点;
this.txb_Password.SelectAll(); //密码文本框内所有文本被选中;
}
我们仅需用这简短的代码就可以完成登录的过程,但是我们还需要编写相关类的代码。
因为引用SQL数据库操作类,一般在进行数据库操作的时候会引入命名空间。所以在编写类的时候,我们需要在页面上方写下如下代码:
using System.Data; //包含各类数据对象;
using System.Data.SqlClient; //包含访问SQL Server所需的各类对象;
using System.Configuration; //包含访问配置文件所需的配置管理器;需事先在本项目的“引用”中添加对System.Configuration的引用;
这个时候我们可以编写相关类:
public class User
{
/// 公有属性:用户号;
public string No
{
get;
set;
}
/// 公有属性:密码;
public string Password
{
get;
set;
}
/// 公有属性:是否完成登录;
public bool HasLoggedIn
{
get;
set;
}
/// 公有属性:消息;
/// (用于返回验证结果)
public string Message
{
get;
set;
}
/// 公有方法:登录;
public void LogIn()
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["Sql"].ToString(); //配置管理器从App.config读取连接字符串;
SqlCommand sqlCommand = sqlConnection.CreateCommand(); //调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;
sqlCommand.CommandText = "usp_selectUserCount"; //指定SQL命令的命令文本;命令文本为存储过程名称;(运用到了2.5的知识。)
sqlCommand.CommandType = CommandType.StoredProcedure; //SQL命令的类型设为存储过程;
sqlCommand.Parameters.AddWithValue("@No", this.No); //向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("@Password", this.Password);
sqlConnection.Open(); //打开SQL连接;
int rowCount = (int)sqlCommand.ExecuteScalar(); //调用SQL命令的方法ExecuteScalar来执行命令,并接受单个结果(即标量);
sqlConnection.Close(); //关闭SQL连接;
if (rowCount == 1) //若查得所输用户号相应的1行记录;
{
this.HasLoggedIn = true; //完成登录;
this.Message = "登录成功。"; //给出正确提示;
}
else //否则;
{
this.HasLoggedIn = false; //未完成登录;
this.Message = "用户号/密码有误,请重新输入!"; //给出错误提示;
}
}
}
这样编写,我们更容易修改,在控件下的代码也更为简洁。

浙公网安备 33010602011771号