一、数据关系:树形视图效果
1、
sqlCommand.CommandText =
"SELECT * FROM tb_keshi;"
+ "SELECT * FROM tb_class;";
注释;1、此处技巧是只创建一个CommandText,实现一次性查询,减少后台运作的负担。
2、DataSet dataSet = new DataSet(); 注释:1、声明并实例化数据集,用于保存查得的多张表;此处DateSet是数据集,其功能可以一次性装很多表。
3、DataTable keshiTable = dataSet.Tables[0];
DataTable classTable = dataSet.Tables[1];
注释:1、声明科室数据表,对应数据集的表集合中的第1张数据表;声明分类数据表,对应数据集的表集合中的第2张数据表;
4、
DataRelation[] dataRelations =
{
new DataRelation
, keshiTable.Columns["No"]
,classTable.Columns["keshitNo"]
, false)
};
dataSet.Relations.AddRange(dataRelations);
注释:1、此处声明数据关系数组,并且实例化数据关系,实现科室表、分类表之间的层次关系
2、AddRange实现批量添加。
二、ADO.NET组件
2.1利用ADO.NET可以直接操纵数据库。
2.2简介ADO.NET
ADO.NET包括五个核心组件:
- Connection 建立与特定数据库的连接。
- Command对数据源执行命令。
- DataReader从数据源中读取只进且只读的数据流。
- DataAdapter用数据填充Dataset并进行解析更新。
- DataSet ADO.NET的核心组件,用于断开的数据操作,包含数据表、约束、关系等对象,相当于存储于内存中的小的数据库。
2.3应用举例:注册
原代码:
private void btn_Login_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString =
"Server=(local);Database=EduBaseDemo;Integrated Security=sspi";
SqlCommand sqlCommand = sqlConnection.CreateCommand();
sqlCommand.CommandText =
"SELECT COUNT(1) FROM tb_User WHERE No=@No AND Password=HASHBYTES('MD5',@Password);"; #region SQL参数用法1
SqlParameter sqlParameter =
sqlCommand.Parameters.AddWithValue("@No", this.txb_UserNo.Text.Trim()); sqlParameter.SqlDbType = SqlDbType.Char;
sqlParameter.Size = 10;
#endregion
#region SQL参数用法2
sqlCommand.Parameters.AddWithValue("@Password", this.txb_Password.Text.Trim());
sqlCommand.Parameters["@Password"].SqlDbType = SqlDbType.VarChar;
#endregion
sqlConnection.Open(); int rowCount = (int)sqlCommand.ExecuteScalar();
sqlConnection.Close();
if (rowCount == 1) {
MessageBox.Show("登录成功。"); }
else {
MessageBox.Show("用户号/密码有误,请重新输入!"); this.txb_Password.Focus(); //密
this.txb_Password.SelectAll();
改进方法:
- 需先选定项目à添加à新建项à选择ADO.NETà设置好相关内容
注释:即不需再用适配器和Connection 建立与特定数据库的连接,因为ADO.NET的五个核心组件就包括了这些功能。
2.改进后的代码
private void btn_Login_Click(object sender, EventArgs e)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] passwordBytes = Encoding.Default.GetBytes(txb_Password .Text .Trim ());
byte[] passwordHashed = md5.ComputeHash(passwordBytes );
EduBaseDemo edubase=new EduBaseDemo ();
var user=(from us in edubase.User
where us.No ==this.txb_UserNo .Text .Trim () && us.Password ==passwordHashed
select us).FirstOrDefault ();
if (user!=null)
{
MessageBox.Show("登录成功。");
}
else
{
MessageBox.Show("用户号/密码有误,请重新输入!");
this.txb_Password.Focus();
this.txb_Password.SelectAll();
}
}