在项目中,我们通常会将数据库操作单独提出来,封装成为一个类,在需要调用的时候,直接使用该类的相关操作函数,这样减少代码的重复量,也便于程序员模块化构建和风格化的阅读。
这里,通过一个登陆对话框的实例来说明数据库操作封装的过程。相关代码可以在项目中直接使用。
首先,创建一个窗口项目,并将控件拖到窗口上创建如下窗口元素:
再添加一个窗口form2,如下:
在SQL2005数据库中建立数据库testDB,在该数据库下创建表TB_Login,相关字段信息如下:
其中ID字段的数据类型下,设置为自动更新项,方法是打开该列属性下的标示规范,选择是,增量选1。如图:
我们实现的目标是,程序运行form1窗口,显示登陆窗口,用户输入用户名和密码,如果与数据库中的对应字段相匹配,那么就显示form2,并在form2中显示相应的用户+“您已经成功登陆!”。
一,首先添加数据库操作类
在右边的解决方案资源管理器中,右键点击项目名称Login ,选择“添加…”,选择添加类,在弹出的对话框中,输入该类的名称:Cls_DataOp.cs。
双击创建的类Cls_DataOp.cs,开始创建代码。
首先加入两个数据库操作支持类库:
using System.Data.SqlClient;
using System.Data;
应为数据库连接字符串我们要在所有函数中都要调用,所以作为全局变量来声明:
string str_conn = @"Data Source=(local)/SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=testDB;";
SqlConnection conn;
首先编写数据库连接函数:
#region
///
/// 打开数据库连接
///
public void SQL_conn()
{
try
{
conn = new SqlConnection(str_conn);
conn.Open();
}
catch
{
throw;
}
}
#endregion
数据库操作一般有三种方式,一种是查询出某一个字段的值,一种是查询出结果是一个数据表,最后就是查询出数据数量。分别根据这三个目的,创建相应的函数。
一,获得查询到数据的第一行第一列数据内容
#region
///
/// 获得查询到数据的第一行第一列数据内容
///
///
public object SQL_GetWord(string str_sql)
{
try
{
SQL_conn();
SqlCommand SQL_comd = new SqlCommand(str_sql, conn);
return SQL_comd.ExecuteScalar();
}
catch
{
throw;
}
finally
{ conn.Close(); }
}
#endregion
二,获得查询到数据的数据表
#region
///
/// 获得查询到数据的数据表
///
///
///
public DataTable SQL_GetTable(string str_sql)
{
try
{
SQL_conn();
SqlCommand SQL_comd = new SqlCommand(str_sql, conn);
SqlDataAdapter SQL_adp = new SqlDataAdapter(SQL_comd);
DataSet ds = new DataSet();
SQL_adp.Fill(ds);
return ds.Tables[0];
}
catch { throw; }
finally { conn.Close(); }
}
#endregion
三,获得查询结果的数量
#region
///
/// 获得查询结果的数量
///
///
///
public int SQL_GetCount(string str_sql)
{
try {
SQL_conn();
SqlCommand SQL_comd = new SqlCommand(str_sql, conn);
return SQL_comd.ExecuteNonQuery();
}
catch { throw; }
finally { conn.Close(); }
}
#endregion
数据库操作类的所有成员创建完了,然后开始给Form1的登陆按钮和取消按钮创建事件。
首先创建“取消”按钮事件。
双击“取消”按钮控件,创建该控件的Click事件,代码如下:
private void button2_Click(object sender, EventArgs e)
{
this.Close();//关闭窗口
}
双击“登陆”按钮,添加Click事件,代码如下:
private void button1_Click(object sender, EventArgs e)
{
//数据库操作
Cls_DataOp Doper = new Cls_DataOp();
object pwd = Doper.SQL_GetWord("select user_pwd from TB_Login");
object name = Doper.SQL_GetWord("select user_name from TB_Login");
//判断用户名是否为空
if (textBox1.Text == "")
{ MessageBox.Show("用户名文本框为空!"); return; }
else
{
//判断数据库中user_name字段是否为空
if (name == null)
{
MessageBox.Show("数据库中user_name字段为空!"); return;
}
else
{
//判断用户名是否与数据库中的user_name字段内容相等
if (textBox1.Text == name.ToString().Trim())
{
MessageBox.Show("用户名确认正确!");
//判断密码框是否为空
if (textBox2.Text == "")
{ MessageBox.Show("密码文本框为空!"); return; }
else
{
//判断数据库中密码字段是否为空
if (pwd == null)
{
MessageBox.Show("数据库中user_pwd字段为空 "); return;
}
else
{
//判断密码框与数据库中密码字段是否相等
if (textBox2.Text == pwd.ToString().Trim())
{
MessageBox.Show("密码已经确认!");
//用户名确认,密码确认相等后,执行下面操作:打开form2窗口,并将用户名赋值给全局变量user_name.
user_name = textBox1.Text.Trim();
Form2 frm2 = new Form2();
frm2.Show();
this.Hide();
return;
}
else
{
MessageBox.Show("密码错误,输入的密码与数据库里user_pwd字段内容不匹配!"); return;
}
}
}
}
else
{
MessageBox.Show("用户名错误,输入的用户名与数据库里user_name字段内容不匹配!"); return;
}
}
}
}
这里定义一个全局变量作为参数传递。
public static string user_name = "";
然后再form2窗口中,双击窗口,添加如下代码:
private void Form2_Load(object sender, EventArgs e)
{
label2.Text = Form1.user_name;
}
此时运行程序如图:
该实例完成。