配色: 字号:
《C#语言程序设计项目教程》第9章 ADO.NET数据库访问技术写字字帖
2023-05-24 | 阅:  转:  |  分享 
  
第9章 ADO.NET数据库访问技术本章导读:本章的主要内容是学习ADO.NET数据库访问技术。然后通过项目“MyQQ的登录和注册管理”为
导向,三个任务(完善用户注册窗体、完善用户登录窗体、用户信息后台管理窗体)为驱动,学习有关ADO.NET数据库访问技术,包括数据库
连接对象Connection、 SQL语句执行对象Command、数据读取对象DataReader等,本项目的完成将使得学习者学会
数据库的访问技术,使得窗体应用程序能够与后台数据库得到交互。第9章 ADO.NET数据库访问技术 ——任务一 完善用户注册窗体
一、任务描述:使用SQL Server数据库,创建一个名为QQMessage的数据库,在QQMessage数据库下创建一个名为tb
_UserMsg的表。在第8章任务二基础上,首先完成第8章的实训四,如左图所示(添加DateTimePicker控件来选择出生日期
),然后修改程序,当单击【注册】按钮的时候能够向QQMessage数据库中表tb_UserMsg中保存用户注册信息(如右下图),如
左图所示,并弹出如右上图所示消息框。二、知识准备:二、知识准备:1、Connection对象Connection对象的主要功能是创
建应用程序与数据库之间的连接,主要包括4种类型访问数据库的对象,不同类型所对应的数据提供程序不同,下表中分别列出了这4种不同的数据
提供程序以及相对应的命名空间。(1)什么是Connection对象不同类型的Connection对象其中Access和MySQL数
据库都是OLEDB公开的数据库。常用方式二、知识准备:1、Connection对象(2)连接数据库(以SQL Server数据库为
例)1)首先通过using System.Data.SqlClient引入命名空间;2)声明数据库连接字符串。例如要连接一个名为Q
QMessage的数据库: string connString = "Data Source=.;Initial Catalog=
QQMessage;User ID=sa; pwd=123456";对连接字符串的说明如下:Data Source:服务器名称,“
.”或者“loacalhost”表示本地服务器。Initial Catalo:数据库的名称。User ID,pwd:表示数据库的登
录名和密码,需要在数据库安装时进行配置。二、知识准备:1、Connection对象(2)连接数据库4)最后通过Open( )方法打
开数据库:connection.Open( );State属性是ConnectionState类型的枚举值之一,其说明如表所示:C
onnectionState枚举值3)然后创建 Connection 对象:SqlConnection connection =
new SqlConnection(connString);连接字符串二、知识准备:1、Connection对象(3)关闭数据库连
接对数据库的操作完毕时,应该关闭与数据库的连接,释放被占用的资源。关闭数据库连接有两种方法:Close和Dispose方法。这两种
关闭数据库连接方法的区别在于:Close()方法只是关闭连接,而Dispose()方法还同时清理连接所占用资源。关闭上面打开的数据
库连接:connection.Close();数据库连接有打开,在后面一定有关闭。二、知识准备:2、Command对象(1)什么是
Command对象Command对象是是一个数据命令对象,主要功能是向指定的数据库发送查询、修改和删除的SQL命令。根据所使用的数
据库的不同,Command对象有不同的形式,主要有如下表所示的几种方式,这几种方式跟前表中不同类型的Connection对象对应使
用。不同类型的Connection对象二、知识准备:2、Command对象(1)什么是Command对象在使用OracleComm
and时,要引入System.Data.OracleClient命名空间,但是默认情况下没有此命名空间,所有需要将程序集Syste
m.Data.OracleClient.dll引入到项目中。定义一个Command对象:SqlCommand command =
new SqlCommand();二、知识准备:2、Command对象(2)设置Command对象的属性Command对象有以下3
个重要属性:Connection:用于设置sqlCommand的对象。CommandText:用于设置要执行的SQL语句或存储过程
。CommandType:用于设置CommandText的类型。类型有StroedProcedure(存储过程名称)、TableD
irect(表的名称),Text(SQL文本命名)。对上面定义的Command对象command设置属性: command.Co
nnection = connection; command.CommandText = sql; command.Comma
ndType = CommandType.Text;SqlCommand command = new SqlCommand(sql
, connection);两种方式都可二、知识准备:2、Command对象(3)执行SQL语句要执行Command对象中设置的S
QL语句,有以下几种常见的方法: Public override int ExecuteNonQuery()该方法返回受影响的行
数。在做插入功能的SQL语句时,可以用此方法来判断是否插入成功。1)ExecuteNonQuery方法。语法:二、知识准备:2、C
ommand对象(3)执行SQL语句要执行Command对象中设置的SQL语句,有以下几种常见的方法: Public SqlDa
taReader ExecuteRead ()该方法返回SqlDataReader对象。2)ExecuteRead方法。语法:
Public override Object ExecuteScalar ()该方法返回值为结果集中第一行的第一列,当结果集为空
时返回空引用。3)ExecuteScalar方法。语法:三、任务分析:1、打开SQL Server数据库,新建数据库QQMessa
ge,新建表tb_UserMsg,表结构如下表所示:表tb_UserMsg三、任务分析:2、要执行的SQL语句如下:string
sql = String.Format("insert into tb_UserMsg values (''{0}'',''{1}'',''
{2}'',''{3}'',''{4}'',''{5}'',''{6}'',''{7}'',''{8}'')",name,birthday,password
,age,sex,province,interesting,description,photopath);在对表进行插入操作时,要
注意表的列结构,插入值的前后顺序应该跟表中列的前后顺序一致。3、SqlCommand对象采用ExecuteNonQuery()方法
执行SQL语句,目的是为了根据返回受影响的行数判断注册是否成功。四、任务实施:1、打开SQL Server,新建一个名为QQMes
sage的数据库,名为 tb_UserMsg的数据表。四、任务实施:2、修改【注册】按钮的Click事件处理程序,在后面添加如下代
码://把注册信息存入数据库string connString = "Data Source=.;Initial Catalog=
QQMessage;User ID=sa; pwd=123456";SqlConnection connection = new
SqlConnection(connString);string sql = String.Format("insert into
tb_UserMsg values(''{0}'',''{1}'',''{2}'',''{3}'',''{4}'',''{5}'',''{6}'',''{7}
'',''{8}'')",name,birthday,password,age,sex,province,interesting,des
cription,photopath); connection.Open(); SqlCommand command = new
SqlCommand(); command.Connection = connection; command.CommandTex
t = sql; command.CommandType = CommandType.Text;数据库连接字符串创建 Connec
tion 对象执行的SQL语句打开连接command对象设置四、任务实施:2、修改【注册】按钮的Click事件处理程序,在后面添加
如下代码://返回受影响的行数,如果num>0表示插入信息成功 int num=command.ExecuteNonQuery()
; if (num > 0) { MessageBox.Show("用户注册成功!"); string msg
= name + "\r\n" + birthday + "\r\n" + age + "\r\n" + sex + "\r\n
" + province + "\r\n" + interesting + "\r\n" + description + "\r\
n" + photopath + "\r\n"; msg message = new msg(msg); m
essage.Show(); message.Owner = this; } else {
MessageBox.Show("用户注册失败!"); } // 关闭数据库连接 connection.Close
();实例化注册信息显示窗体,利用构造函数参数传递数据五、任务小结:SqlCommand command = new SqlCom
mand();command.Connection = connection;command.CommandText = sql;
command.CommandType = CommandType.Text;SqlCommand command = new S
qlCommand(sql, connection);1、设置Command对象的两种方法:(1)通过属性设置(2)在定义Comm
and对象的时候直接设置,通常采用这种方式:2、当对数据库表执行插入操作时,如果需要验证插入是否成功,采用ExecuteNonQu
ery()方法执行SQL语句。第9章 ADO.NET数据库访问技术 ——任务二 完善用户登录窗体 一、任务描述:对第8章任务
二中的用户登录窗体进行修改。如下所示:用户名:admin密码: 123456用户名和密码存在表tb_UserMsg中,弹出消息框“
,欢迎登录!”一、任务描述:如果是用户名错误,则弹出消息框“用户名不存在!”,如左图所示,如果是密码错误,则弹出消息框“用户
密码错误!”,如右图所示。二、知识准备:二、知识准备:1、DataReader对象DataReader对象是数据读取对象,它提供向
前只读的游标,如果应用程序只需要快速读取数据,可以使用DataReader进行读取。下表中列出了不同类型的DataReader。(
1)什么是DataReader对象不同类型的DataReader对象二、知识准备:1、DataReader对象 public ov
erride bool HasRows{get;}(2)HasRows属性HasRows属性用于判断sqlDataReader中是
否包含了值。语法如下:如果有值属性值为true,没有值属性值为false。(3)Read方法Read方法的功能是使sqlDataR
eader前进到下一条记录。语法如下: public override bool Read()如果存在记录则返回值为true,否则
为false。三、任务分析:1、查看输入的用户名是否存在的SQL语句: select Name from tb_UserMsg w
here Name=''" + tb_name.Text.Trim() + "''";当查询的结果集里面有行时,表明用户名存在。2、首
先保存结果集中的Name,然后比较密码是否正确。四、任务实施:1、打开第8章任务二中建立的窗体应用程序,修改【登录】按钮的Clic
k事件处理程序。private void btn_login_Click(object sender, EventArgs e)
//用户登录 { // 数据库连接字符串string connString = "Data S
ource=.;Initial Catalog=QQMessage;User ID=sa; pwd=123456";
// 创建 Connection 对象 SqlConnection connection = ne
w SqlConnection(connString); string sql = "select fr
om tb_UserMsg where Name=''" + tb_name.Text.Trim() + "''and Passwor
d=''" + tb_psd.Text.Trim() + "''"; connection.Open();//
打开数据库连接 SqlCommand command = new SqlCommand(sql, conne
ction);黑色部分保持以前不变四、任务实施:1、打开第8章任务二中建立的窗体应用程序,修改【登录】按钮的Click事件处理程序
。 //使用ExecuteReader方法创建 SqlDataReader 对象 SqlDataReader
sdr = command.ExecuteReader(); if (sdr.HasRows)
{ MessageBox.Show(tb_name.Text + ",欢迎登录!");
} else { MessageB
ox.Show("登录失败!"); } // 关闭数据库连接 c
onnection.Close(); }此部分做修改判断用户名和密码是否存在数据表橙色部分在后面继续修改四、任务实施
:2、修改登录失败提示,明确是到底用户名不存在还是密码错误。当用户名不存在时,出现如图所示消息框。四、任务实施:2、修改登录失败提
示,明确是用户名不存在还是密码错误。修改(1)中else中的代码(橙色部分)如下: SqlConne
ction connection2 = new SqlConnection(connString);
connection2.Open();sql = "select Name from tb_UserMsg where Name
=''" + tb_name.Text.Trim() + "''"; SqlCommand comman
d2 = new SqlCommand(sql,connection2); command2.Com
mandText = sql; string findname = "";
findname=Convert.ToString(command2.ExecuteScalar());
if (findname == tb_name.Text) {
MessageBox.Show("用户密码错误!"); }
else { MessageBox.Show("用户名不存
在!"); } connection2.Close();获得用户名用户
名存在用户名不存在五、任务小结:1、利用SqlDataReader sdr = command.ExecuteReader()得到
结果集,然后利用dr .HasRows判断结果集里是否包含行来确定登录成功与否。2、重新查询需要重新创建连接。第9章 ADO.N
ET数据库访问技术 ——任务三 用户信息后台管理窗体 一、任务描述:在任务二基础上新增一个窗体,如图所示。在此窗体中包含1个Da
taRowView控件和2个Button控件。在DataRowView控件中显示数据库QQMessage中表tb_UserMsg的
全部信息。单击【删除】按钮可以在表中删除被选中行,单击【提交更改】按钮向数据库中表tb_UserMsg提交修改或删除后的用户信息。
二、任务准备:1、DataAdapter对象DataAdapter对象叫做数据适配器对象,是DataSet与数据源之间的桥梁。该对
象提供了4个重要的属性,实现与数据库之间的互通,如表所示。DataAdapter对象常用属性二、任务准备:1、DataAdapte
r对象在对数据库进行操作时,该对象还提供了几个主要的方法,如表所示:DataAdapter对象常用方法二、任务准备:2、DataS
et对象public void Merge(DataSet database,bool preserveChanges,Missi
ngSchemaAction missingSchemaAction)DataSet对象叫做数据集对象,是ADO.NET的核心成员
。DataSet对象相当于内存中的一个数据库,包含数据表、数据列、数据行、视图、约束和关系。使用DataSet的Merge方法,可
以进行数据的合并。语法如下:二、任务准备:3、DataGridView控件DataGridView控件叫做数据浏览器,在开发数据库
应用程序时,通常用来显示数据的视图。如果需要在Windows窗体应用程序中显示表格数据,应该首要考虑使用DataGridView控
件。目前通用的方法中,也可以采取使用ListView控件。二、任务准备:(1)设置DataGridView控件显示数据DataGr
idView控件的DataSource属性用于获取或设置所显示数据的数据源,语法如下:public Object DataSour
ces{get;set};3、DataGridView控件例如:dgV_UserMsg.DataSource = ds.Table
s["um"];表示名为dgV_UserMsg的DataGridView控件的数据源为DataSet数据集对象中名为“um”的表。
二、任务准备:(2)常用属性和方法DataGridView数据视图常用的属性如表所示:3、DataGridView控件DataGr
idView控件常用属性二、任务准备:(2)常用属性和方法DataGridView数据视图常用的方法如表所示:3、DataGrid
View控件DataGridView数据视图常用方法二、任务准备:4、SqlCommandBuilder对象SqlCommandB
uilder对象的主要作用是用来批量更新数据库,一般和adapter结合使用。利用该对象能够自动生成对数据库的反向Sql命令,如:
INSERT 、UPDATE 和DELETE命令。具体使用方法见【任务实施】步骤(5)。三、任务分析:1、制作如图所示的窗体应用界
面,窗体上各控件的属性及功能如表所示:控件属性功能说明表三、任务分析:2、获得DataGridView控件中的选中行使用dgV_U
serMsg.CurrentRow.Index。四、任务实施:1、新建一个窗体应用程序,或者直接在任务9.2基础上新增一个窗体),
绘制如图所示界面。按照表设置控件属性。控件属性功能说明表四、任务实施: DataSet ds;//数据集 SqlConn
ection sqlconn;2、在窗体内定义如下对象,因为数据集对象和SQL数据库连接对象在按钮的Click事件中要使用,所有需
要定义在Load事件外。四、任务实施: private void Form1_Load(object sender, Even
tArgs e) {sqlconn=new SqlConnection ( "Data Source=.;Initi
al Catalog=QQMessage; User ID=sa; pwd=123456"); //创建连接
sqlconn.Open(); string sql = "select from tb_UserMs
g"; //要执行的SQL语句 SqlDataAdapter sda = new SqlDataAdapter(sql,sql
conn); //数据适配器 ds = new DataSet(); //创建DataSet对象 sda.
Fill(ds,"um"); //使用SqlDataAdapter对象的Fill方法填充DataSet对象 dgV_Us
erMsg.DataSource = ds.Tables["um"]; //设置 DataRowView控件的数据源为数据表
”um” }3、双击Form1窗体,为窗体添加Load事件:四、任务实施: private void btn
_del_Click(object sender, EventArgs e) {ds.Tables["um"].Ro
ws[dgV_UserMsg.CurrentRow.Index].Delete(); }4、
双击【删除】按钮,为【删除】按钮添加btn_del_Click事件:表示删除数据集ds中名为“um”数据表中的行,被删除的行为名为
dgV_UserMsg的DataRowView控件当前被选中的行,Delete方法实现了行的删除。四、任务实施: private
void btn_save_Click(object sender, EventArgs e) { SqlDataAdapte
r da = new SqlDataAdapter("SELECT from tb_UserMsg",sqlconn); SqlCommandBuilder builder =new SqlCommandBuilder (da); da.Update (ds,"um"); }5、双击【提交更改】按钮,为【提交更改】按钮添加btn_save_Click事件:da.Update (ds,"um")表示更新数据表“um”。单击按钮后窗体重新导入,则更新DataRowView控件的数据源。五、任务小结:1、在ADO.NET的DataAdapter其实是由很多个Command组成的。如SelectCommand,DeleteCommand,InsertCommand,UpdateCommand。 每一个Command都是一个独立的Command对象。也就是都有自己的Connection和CommandText。2、DataGridView 取得或者修改当前单元格的内容: 当前单元格指的是 DataGridView 焦点所在的单元格,它可以通过 DataGridView 对象的 CurrentCell 属性取得。如果当前单元格不存在的时候,返回Nothing(C#是null)。1)当前单元格内容 DataGridView1.CurrentCell.Value; 2)当前单元格的列 Index DataGridView1.CurrentCell.ColumnIndex; 3)得当前单元格的行 Index DataGridView1.CurrentCell.RowIndex;谢谢观看
献花(0)
+1
(本文系小磊老师首藏)