资源描述
数据访问技术
目的:
1. 了解如何创建和删除数据库
2. 了解如何创建和删除数据表
3. 掌握连接数据库对象(Connection)
4. 掌握执行sql语句对象(Command)
5. 掌握读取数据对象(DataReader)
6. 掌握数据适配器对象(DataAdapter)
7. 掌握数据集对象(DataSet)
重点:技术
难点:综合编程
项目1 创建一个windows应用程序,用来显示数据库连接状况。
项目2 创建一个windows应用程序,分别用close和dispose方法关闭数据库连接。
项目4 创建一个windows应用程序,用sqlcommand的ExecuteNonQuery方法返回受影响的行数
项目5 创建一个windows应用程序,用sqlcommand的ExeuterReader方法返回一个包含数据的sqldatareader对象实例
项目6 创建一个windows应用程序,向窗体中添加一个textbox和button控件,分别用于输入要查询的表名以及执行查询操作,通过sqldatareader对象的hasrows属性进行判断sqldatareader是否包含一行或者多行,即判断查询结果是否有值。
项目7 创建一个windows应用程序,向窗体中添加一个button控件和一个datagridview控件,分别用于执行数据绑定以及显示数据表中的数据。当单击button后,先连接数据库,然后创建一个sqldataadapter对象,使用该对象的fill方法填充dataSet数据集,最后设置DataGridView控件的数据源,显示查询的数据。
项目8 创建一个windows应用程序,查询tb_command表中所有数据并显示在datagridview控件中,单击某条数据,会显示详细信息。当对某条数据进行修改后,单击“修改”按钮,使用DataAdapter对象的Updata方法更新数据库。
项目9 创建一个windows应用程序,向窗体添加一个datagridview控件,首先获取tb_test中的数据,并存储在dataset对象ds中,然后再获取数据表tb_main中的数据,存储在另一个dataset对象ds1中,最后调用dataset对象的merge方法,将ds与ds1合并。
项目10 创建一个windows应用程序,向窗体添加二个DataGridView控件和一个Button控件,第一个DataGridView控件用于数据表tb_test中的数据,当单击Button控件后,通过dataset对象的copy方法复制第一个DataGridView控件的dataset,并作为第二个DataGridView控件的数据源。
背景知识:
数据库
1数据库是按照数据结构来组织、存储和管理数据的仓库。是存储在一起的相关数据的集合。
2关系型数据库是由许多数据表组成,数据表由是由许多条记录组成,而记录又是由许多字段组成,每个字段又对应一个对象。
Sql语言简介
Sql是一种数据库查询和程序设计语言,是关系型数据库事实上的标准语言。
1数据库的创建与删除
(1) 创建数据库
选择“开始/程序/microsoft sql server/企业管理器”命令,打开企业管理器。
在企业管理器左侧栏目中的“数据库”项目上点右键,选择新建数据库命令。
,
在“数据库属性”窗口的“名称”文本框中输入新建数据库的名称,如下图
输入数据库名称!!!
(2) 删除数据库
在新建数据库上点鼠标右键,在弹出快捷菜单中选择“删除”命令
2.数据表的创建及删除,方法同上。
ADO.NET简介
A 是一组可以公开数据访问服务的类,有丰富的组件和方法,用于支持对sql server 和xml等数据源进行访问。
A对象模型由二个部分组成:数据提供程序(data provider,也称为托管提供程序)和数据集(dataset),前者负责与物理数据源的连接,数据集代表实际的数据。
A支持二种访问数据的模型:
无连接模型-将数据下载到客户端机器上并将数据封装到内存中,然后可以像访问本地关系数据库一样访问内存中的数据(如dataset)
连接模型依赖于逐记录的访问,这种访问要求打开并保持与数据源的连接。
一. 连接数据库对象:connection对象
功能:与特定数据源建立联系
1. connection对象概述:
首先,根据使用对象的不同,需引入不同的命名空间:
System.data.sqlclient命名空间
System.data.odbc命名空间;
System.data.oledb命名空间;
System.data.oracle命名空间;
然后,可根据引入命名空间的不同,调用相应的命名空间中的connection对象进行数据库连接。
例如,要连接sql server数据库,首先要通过using System.data.sqlclient命今引用sql server数据提供程序,然后调用空间下的sqlconnection类连接数据库.
2. 连接数据库:
先引入System.data.sqlclient命名空间,命名空间里有sqlconnection类,通过sqlconnection类的对象的open方法打开数据库。然后,用sqlconnection对象的state属性判断数据库的连接状态。
项目1 创建一个windows应用程序,用来显示数据库连接状况。
效果图如下:
关键步骤如下:
在窗体中添加一个textbox控件、一个button控件和二个label控件,分别用于输入要连接的数据库名称、执行连接数据库的操作以及数据库的连接状态,然后引入system.data.sqlclient命名空间,使用sqlconnection类连接数据库。
关键代码如下:
if (textBox1.Text == "")
{
MessageBox.Show("请输入要连接的数据库名称");
}
else
{
try
{
//string ConStr = "server=.;database=" + textBox1.Text.Trim() + ";uid=sa;pwd=123456";
string ConStr = "server=hmpc;database=" + textBox1.Text.Trim() + ";uid=sa;pwd=123456";
SqlConnection conn = new SqlConnection(ConStr);
conn.Open();
if (conn.State == ConnectionState.Open)
{
label2.Text = "数据库【" + textBox1.Text.Trim() + "】已经连接并打开";
}
}
catch
{
MessageBox.Show("连接数据库失败");
}
}
3. 关闭连接:
方法一:调用sqlconection对象的close方法关闭一个连接(但可用open方法再打开)。
方法二:用dispose方法关闭,并且清理连接所占用的资源(此时不可再用open打开,必须再次重新初始化连接再打开)。
项目2 创建一个windows应用程序,分别用close和dispose方法关闭数据库连接。
效果图如下:
主要步骤:
新建一个窗体,在窗体中添加一个textbox控件和一个richtextbox控件,分别用于输入连接的数据库名和显示连接信息及错误提示。再设置3个button控件,分别用于连接数据库、调用close方法关闭连接,再用open方法打开连接以及调用dispose方法关闭并释放连接,然后调用open方法打开连接。
关键代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace 用close和dispose方法关闭数据库连接
{
public partial class Form1 : Form
{
SqlConnection conn;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
MessageBox.Show("请输入数据库名称");
}
else
{
try
{
string str = "server=.;database=" + textBox1.Text.Trim() + ";uid=sa;pwd=123456";
conn = new SqlConnection(str);
conn.Open();
if (conn.State == ConnectionState.Open)
{
MessageBox.Show("连接成功");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
textBox1.Text = "";
}
}
}
private void button2_Click(object sender, EventArgs e)
{
try
{
string str = "";
conn.Close();
if (conn.State == ConnectionState.Closed)
{
str = "使用Close方法关闭数据库已经成功关闭\n";
}
conn.Open();
if (conn.State == ConnectionState.Open)
{
str += "使用Close方法关闭连接并重新调用Open方法连接数据库数据库已经成功打开\n";
}
richTextBox1.Text = str;
}
catch (Exception ex)
{
richTextBox1.Text = ex.Message;
}
}
private void button3_Click(object sender, EventArgs e)
{
try
{
conn.Dispose();
conn.Open();
}
catch (Exception ex)
{
richTextBox1.Text = ex.Message;
richTextBox1.Text += "\n使用dispose方法关闭连接并立即调用Open方法连接数据库数据库不成功!!\n";
}
}
}
}
二.执行sql语句对象:command对象
功能:用于对数据源执行命令
1 .command对象概述:
首先,根据使用对象的不同,需引入不同的命名空间:
System.data.sqlclient命名空间
System.data.odbc命名空间;
System.data.oledb命名空间;
System.data.oracle命名空间;
然后,可根据引入命名空间的不同,调用相应的命名空间中的connection对象进行数据库连接。
Command对象是一个数据命令对象,主要功能是向数据库发送查询、更新、删除、修改操作的sql语句。它主要有四种方式:
(1) Sqlcommand:用于向sql server数据库发送sql语句,位于system.data.sqlclient命名空间下;
(2) Oledbcommand:用于向oledb的数据库发送sql语句,如access和mysql数据库等都是oledb公开的数据库;
(3) Odbccommand: 用于向odbc数据库发送sql语句
(4) Oraclecommand: 用于向oracle数据库发送sql语句
2.设置数据源类型:
详见 “3 设置数据源类型”项目
3. command有多种方法来执行sql语句,通过sqlcommand向数据库发送增、删、改等命令。常用的方法有
(1) ExecuteNonQuery //返回受影响的行数
(2) ExecuteReader //返回一个SqldataReader对象
(3) Executescalar //返回结果集中第一行的第一列或空引用
项目4 创建一个windows应用程序,用sqlcommand的ExecuteNonQuery方法返回受影响的行数
效果图如下:
关键代码如下:
using System;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Test04
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SqlConnection conn;
private void button1_Click(object sender, EventArgs e)
{
conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123456");
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;//指定使用conn连接数据库
cmd.CommandText = "update tb_command set 奖金=奖金+1 where 性别='男'";
cmd.CommandType = CommandType.Text;
int i = Convert.ToInt32(cmd.ExecuteNonQuery());
label2.Text = "共有" + i.ToString() + "名男员工获得奖金";
cmd.CommandText = "update tb_command set 奖金=奖金+2 where 性别='女'";
cmd.CommandType = CommandType.Text;
int j = Convert.ToInt32(cmd.ExecuteNonQuery());
label3.Text = "共有" + j.ToString() + "名女员工获得奖金";
}
}
}
项目5 创建一个windows应用程序,用sqlcommand的ExeuterReader方法返回一个包含数据的sqldatareader对象实例
效果图如下:
代码如下:
using System;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Test05
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SqlConnection conn;
private void button1_Click(object sender, EventArgs e)
{
conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123456");
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from tb_command";
cmd.CommandType = CommandType.Text;//只执行sql语句的文本形式
SqlDataReader sdr = cmd.ExecuteReader();//定义数据读取器对象,并不修改数据
while (sdr.Read())
{
listView1.Items.Add(sdr[1].ToString());
}
conn.Dispose();
//button1.Enabled = false;
}
}
}
二. 读取数据对象:datareader对象
功能:从数据源中读取数据流,相较DataSet数据集而言,是一个简易的数据集。
项目6 创建一个windows应用程序,向窗体中添加一个textbox和button控件,分别用于输入要查询的表名以及执行查询操作,通过sqldatareader对象的hasrows属性进行判断sqldatareader是否包含一行或者多行,即判断查询结果是否有值。
效果图如下:
关键代码如下:
using System;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Test06
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
//连接数据库
//SqlConnection conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123456");
SqlConnection conn = new SqlConnection("server=.;database=temp;uid=sa;pwd=123456");
//打开数据库
conn.Open();
//创建sqlcommand对象,以便使用sql语句,并指定用conn对象连接
SqlCommand cmd = new SqlCommand("select * from "+textBox1.Text.Trim(), conn);
//使用ExecuteReader()方法创建SqlDataReader sdr以便快速读数据
SqlDataReader sdr = cmd.ExecuteReader();
//调用read方法读取SqlDataReader
sdr.Read();
//通过SqlDataReader对象的hasrows方法判断查询结果
if (sdr.HasRows)
{
MessageBox.Show("数据表中有值");
}
else
{
MessageBox.Show("数据表中没有任何数据");
}
sdr.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
四.数据适配器对象:Dataadapter对象
虽然,可以使用Command对象和DataReader对象完成所乎所有的数据库功能,但需要手工编写大量代码,因此,提供了更方便的方法来支持可视化的开发,这就是dataadapter和dataset对象提供的重要功能,其中dataset可以认为是内存中的数据库,而dataadapter可以看成是数据源与dataset之间的桥梁。
1. 通过dataadapter对象的fill方法填充数据集dataset.
项目7 创建一个windows应用程序,向窗体中添加一个button控件和一个datagridview控件,分别用于执行数据绑定以及显示数据表中的数据。当单击button后,先连接数据库,然后创建一个sqldataadapter对象,使用该对象的fill方法填充dataSet数据集,最后设置DataGridView控件的数据源,显示查询的数据。
效果图如下:
关键代码如下:
using System;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Test07
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SqlConnection conn;
private void button1_Click(object sender, EventArgs e)
{
conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123456");
SqlCommand cmd = new SqlCommand("select * from tb_command", conn);
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = cmd;//SelectCommand 获取或设置用于在数据源中选择记录的命令。
DataSet ds = new DataSet();//设置数据集对象
//sda.Fill(ds, "cs");
//通过dataadapter对象的fill方法填充数据集dataset
sda.Fill(ds);
//设置数据控件dataGridView1中的数据源
dataGridView1.DataSource = ds.Tables[0];
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
}
}
2. 通过dataadapter对象的Updata方法更新数据源
项目8 创建一个windows应用程序,查询tb_command表中所有数据并显示在datagridview控件中,单击某条数据,会显示详细信息。当对某条数据进行修改后,单击“修改”按钮,使用DataAdapter对象的Updata方法更新数据库。
设计界面如下:
效果图如下:
关键代码如下:
using System;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Test08
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SqlConnection conn;
DataSet ds;
SqlDataAdapter sda;
private void Form1_Load(object sender, EventArgs e)
{
//实例化SqlConnection对象conn,连接数据库
conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123456");
//创建SqlCommand对象cmd,以便使用数据库
SqlCommand cmd = new SqlCommand("select * from tb_command", conn);
//实例化数据适配器SqlDataAdapter对象sda,以建立数据源与setdata间的联系
sda = new SqlDataAdapter();
//设置数据适配器SqlDataAdapter对象sda的属性
sda.SelectCommand = cmd;
//创建数据集对象ds并向内存中的数据集填充数据
ds = new DataSet();
sda.Fill(ds, "cs");
//设置datagridview1控件的数据源,以便在控件中显示数据表
dataGridView1.DataSource = ds.Tables[0];
}
private void button1_Click(object sender, EventArgs e)
{
//DataTable dt = ds.Tables["cs"];//创建一个数据表eables
DataTable dt = ds.Tables[0];//创建一个数据表eables
//利用数据适配器对象sda的方法FillSchema,把表结构加载到tb_command中
sda.FillSchema(dt, SchemaType.Mapped);
//创建一个datarow行数据对象,
DataRow dr = dt.Rows.Find(txtNo.Text);
//设置datarow中的值
dr["姓名"] = txtName.Text.Trim();
dr["性别"] = this.txtSex.Text.Trim();
dr["年龄"] = this.txtAge.Text.Trim();
dr["奖金"] = this.txtJJ.Text.Trim();
//自动生成一个表单
SqlCommandBuilder cmdbuider = new SqlCommandBuilder(sda);
//调用updata方法将datatable更新到数据库中
sda.Update(dt);
}
//在ataGridView控件的CellClick(单击单元格)事件中所要执行的代码
//可以实现某条记录的详细信息显示
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
txtNo.Text = dataGridView1.SelectedCells[0].Value.ToString();//编号后面的第一个textbox,已改名为txtNo
txtName.Text = dataGridView1.SelectedCells[1].Value.ToString();
txtSex.Text = dataGridView1.SelectedCells[2].Value.ToString();
txtAge.Text = dataGridView1.SelectedCells[3].Value.ToString();
txtJJ.Text = dataGridView1.SelectedCells[4].Value.ToString();
}
}
}
四.数据集对象:dataset对象
Dataset对象,就像存入于内在中的一个小型数据库。它
展开阅读全文