ADO.NET的特色在于:不仅可以实时在线操作数据库,并且支持对数据源的离线访问。后者应用更为广泛,尤其是在并发用户数很多且无法保证连续连接的网络环境下。
1.数据适配
数据库离线访问工作原理图:
DataAdapter对象:数据适配器,也就是利用连接对象连接数据源,使用命令对象(Command)规定的操作,从数据源中检索出数据送往数据集,或者将数据集中编辑后的数据送回数据源。
DataAdapter对象作为DataSet和数据源之间的桥接器,通过Fill()方法向DataSet填充数据 ,Updata更新数据。
SelectCommand |
InsertCommand |
UpdataCommand |
DeleteCommand |
语法形式:
SqlDataAdapter myda;
SqlCommand command = new Command(sql,sqlcon);
myda = new SqlDataAdapter(command);
还有一个重要的Fill()方法:
myda.Fill(myst,"XSB");
myst表示数据集名,XSB表示数据表名。
2.数据集机制
相当于一个暂存的数据库。创建数据集的语句如下:
DataSet myst = new DataSet();
语句中myst代表数据集对象。
3.数据库离线访问实例
利用数据集机制,使用DataAdapter对象填充DataSet方法,离线访问XSCJDB1数据库。与上篇功能一样。界面与之也几乎一样,区别在于:将呈现的数据的文本框txtAllStu替换,使用数据网格(DataGridView)控件。
窗体标题改为“离线访问数据源”,图标是这样的
将其Name属性改为dgvAllStu;
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace _9_5
{
public partial class Form1 : Form
{
string strcon = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=XSCJDB1;Integrated Security=True";
DataSet myst = new DataSet();
SqlDataAdapter myda;
public Form1()
{
InitializeComponent();
btnSearch_Click(null, null);
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnInsert_Click(object sender, EventArgs e)
{
SqlConnection sqlcon = new SqlConnection(strcon);
try
{
string stuID = txtStuID.Text.Trim();
string stuName = txtName.Text.Trim();
string stuXB;
if (RbtnMale.Checked)
{
stuXB = "男";
}
else
{
stuXB = "女";
}
string stuBirthday = dateTimePicker1.Value.ToShortDateString().Split(' ')[0];
string stuMajor = txtMajor.Text.Trim();
string stuCredit = txtCredit.Text.Trim();
SqlCommand command = new SqlCommand();
command.CommandText = "INSERT INTO XSB(Xnum,XM,XB,CSRQ,ZY,ZXF) VALUES('" + stuID + "','" + stuName + "','" + stuXB + "','" + stuBirthday + "','" + stuMajor + "','" + stuCredit + "')";
command.CommandType = CommandType.Text;
command.Connection = sqlcon;
sqlcon.Open();
myda = new SqlDataAdapter(command);
myda.Fill(myst, "XSB");
MessageBox.Show("插入成功!", "消息", MessageBoxButtons.OK);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sqlcon.Close();
}
}
private void btnSearch_Click(object sender, EventArgs e)
{
using (SqlConnection sqlcon = new SqlConnection(strcon))
{
sqlcon.Open();
string sql = "SELECT * FROM XSB";
SqlCommand command = new SqlCommand(sql, sqlcon);
myda = new SqlDataAdapter(command);
myst.Tables.Clear();
myda.Fill(myst, "XSB");
dgvAllStu.DataSource = myst.Tables["XSB"];
}
}
}
}
但是记录值没有任何变化,这是因为DataGridView控件显示的是已经离线的存储在数据集中的数据,虽然数据库记录增加了一条,但是数据集并没有立即更新。
想要看到刚刚的记录,需要连接数据库,并且通过适配器重新载入数据:
sqlcon.Open();
string sql = "SELECT * FROM XSB";
SqlCommand command = new SqlCommand(sql, sqlcon);
myda = new SqlDataAdapter(command);
myst.Tables.Clear();
myda.Fill(myst, "XSB");
单击刷新,在事件中执行上段代码,执行完毕后,可以看到新纪录。
今日份实验叮咚!