ADOADO.NET基础
ADO.NET是微软提供的一种数据库访问技术。
ADO.NET为不同类型的数据源提供了不同的数据提供程序对象:
一、使用DataReader读取数据
使用DataReader读取数据属于连接式读取,只能只进的一行一行读取数据,并且不能改变数据,
如需要改变数据,必须重新执行insert,update,delete等sql语句来改变数据。
示例:使用DataReader读取数据在ListView控件显示:
private void Form1_Load(object sender, EventArgs e)
{
// 使用 DataReader 读取数据的步骤包括:
// 1. 连接数据库
// 2. 执行查询
// 3. 读取数据
//编写连接字符串(windows方式) a.udl
// string connStr = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=adoNet;Data Source=.\r\n";
// 1. 编写连接字符串(SQL Server 用户名密码认证方式)
string connStr = "server=.;database=adoNet;uid=sa;password=123456";
// 2. 创建连接对象并打开连接
SqlConnection conn = new SqlConnection(connStr);
conn.Open(); // 打开与数据库的连接
// 3. 编写 SQL 查询语句
string sql = "select * from Member"; // 查询所有会员信息
// 4. 创建命令对象,并设置 SQL 语句和连接对象
SqlCommand cmd = new SqlCommand(sql, conn);
// 5. 执行 SQL 命令并获取 DataReader 对象
SqlDataReader rd = cmd.ExecuteReader();
// 6. 使用 DataReader 逐行读取数据,并将数据添加到 ListView 控件中
while (rd.Read())
{
// 创建一个新的列表项,以会员ID作为主键
ListViewItem item = new ListViewItem(rd["MemberID"].ToString());
// 添加子项,包含会员账号、密码、姓名、电话等信息
item.SubItems.Add(rd["MemberAccount"].ToString());
item.SubItems.Add(rd["MemberPwd"].ToString());
item.SubItems.Add(rd["MemberName"].ToString());
item.SubItems.Add(rd["MemberPhone"].ToString());
// 将新创建的列表项添加到 ListView 控件中
this.lvMember.Items.Add(item);
}
// 关闭 DataReader 对象
rd.Close();
// 显示会员总人数
// 更改 SQL 命令文本为计算会员表中的记录数
cmd.CommandText = "select count(*) from Member";
// 执行标量查询,返回单个值
int count = (int)cmd.ExecuteScalar();
// 设置标签控件显示会员人数
this.labCount.Text = "会员人数:" + count.ToString();
// 最后,关闭数据库连接
conn.Close();
}
二、使用DataAdapter的方式抽取数据
将数据库数据抽取到DataSet容器 ,通过修改容器修改数据库
DataSet是特意为独立于所有数据源的数据访问而设计的,可以理解成内存中的数据库。
在支持ADO.NET的断开式、分布式数据方案中起着重要的作用。
DataSet是数据驻留在内存中的表现形式,无论是什么数据源,它都可以提供一致的编程模型。
DataSet支持改变数据然后回传给数据库。
- DataSet数据集里面可以包含多个DataTable数据表
- 还可以保存表和表之间的关联
示例:使用DataAdapter抽取数据到DataTable中,在DataGridView中进行显示
dataGridView控件 列属性DataPropertyName 值实现对数据库表列名的绑定映射
此示例代码如下.
在编写代码之前需要对DataGridView控件进行编辑列操作。
设置DataGridView控件的AllowUserToAddRows=False实现清楚最后一个空行,SelectionMode=FullRowSelect实现整行选中模式,用户体验更好。
private void bindDate()
{
// 1、编写连接字符串,包括SQL Server的实例名、数据库名、用户名及密码
string connStr = "server=.;database=adoNet;uid=sa;password=123456";
// 2、创建SqlConnection对象并使用连接字符串初始化
SqlConnection conn = new SqlConnection(connStr);
// 打开与数据库的连接
conn.Open();
// 3、编写查询语句,从Member表中选择所有记录
string sql = "select * from Member";
// 创建SqlDataAdapter对象,用于执行SQL命令并填充数据到DataTable
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
// 定义一个DataTable对象作为数据容器
DataTable dt = new DataTable();
// 使用SqlDataAdapter填充DataTable
adapter.Fill(dt);
// 将DataTable设置为DataGridView的数据源,以显示数据
this.dataGridView1.DataSource = dt;
// 修改查询语句,用于获取Member表中的记录总数
adapter.SelectCommand.CommandText = "select count(*) from Member";
// 执行查询并获取结果,即会员数量
int count = (int)adapter.SelectCommand.ExecuteScalar();
// 更新标签显示当前的会员人数
this.lblCount.Text = "会员人数:" + count.ToString();
// 关闭数据库连接
conn.Close();
}
private void Form2_Load(object sender, EventArgs e)
{
// 当窗体加载时,调用bindDate方法绑定数据
bindDate();
}
private void btUpdate_Click(object sender, EventArgs e)
{
// 1、编写连接字符串,包括SQL Server的实例名、数据库名、用户名及密码
string connStr = "server=.;database=adoNet;uid=sa;password=123456";
// 2、创建SqlConnection对象并使用连接字符串初始化
SqlConnection conn = new SqlConnection(connStr);
// 打开与数据库的连接
conn.Open();
// 3、编写查询语句,从Member表中选择所有记录
string sql = "select * from Member";
// 创建SqlDataAdapter对象,用于执行SQL命令并填充数据到DataTable
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
// 定义一个DataTable对象作为数据容器
DataTable dt = new DataTable();
// 使用SqlDataAdapter填充DataTable
adapter.Fill(dt);
// 添加新行到DataTable
DataRow dr = dt.NewRow();
dr["MemberAccount"] = "admin"; // 设置会员账号
dr["MemberPwd"] = "123321"; // 设置会员密码
dr["MemberName"] = "wyx"; // 设置会员姓名
dr["MemberPhone"] = "1839hs3w"; // 设置会员电话
// 将新行添加到DataTable中
dt.Rows.Add(dr);
// 修改DataTable中第二行的会员账号
dt.Rows[1]["MemberAccount"] = "qwqqwqwqwqwwq";
// 从DataTable中删除第四行
dt.Rows[3].Delete();
// 创建SqlCommandBuilder对象,自动构建适当的INSERT、UPDATE或DELETE语句
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
// 将对DataTable所做的更改同步回数据库
adapter.Update(dt);
// 关闭数据库连接
conn.Close();
// 刷新数据显示,确保界面显示最新的数据库状态
bindDate();
// 显示消息框,通知用户数据更新成功
MessageBox.Show("数据更新成功");
}
三、非查询操作
非查询操作分为"添加"“删除""修改“操作,这些操作处理sql语句不同,其他编码是一样的,
所以在此文档中以添加操作为例介绍非查询操作。
示例:添加会员信息
此示例的测试数据与文档第一部分测试数据相同。此示例中通过两种方式添加数据
- (1)使用DataAdapter的command跟新数据
- (2)直接使用SqlCommand对象跟新数据
此示例代码如下:
//使用SqlDataAdapter对象完成添加数据
private void button1_Click(object sender, EventArgs e)
{ //数据库连接
string connStr = "server=.;database=adoNet;uid=sa;pwd=123456";
SqlConnection conn = new SqlConnection(connStr);
conn.Open(); //打开数据库
//编写sql语句
string sql = string.Format("INSERT INTO Member (MemberAccount, MemberPwd, MemberName, MemberPhone)VALUES ('{0}', '{1}', '{2}', '{3}')",
this.textAccount.Text, textPwd.Text, textName.Text, textIphone.Text);
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
int code = adapter.SelectCommand.ExecuteNonQuery();
conn.Close();
if (code == 1)
MessageBox.Show("添加成功");
else
MessageBox.Show("添加失败");
}
//使用SqlCommand对象添加数据
private void button2_Click(object sender, EventArgs e)
{
//数据库连接
string connStr = "server=.;database=adoNet;uid=sa;pwd=123456";
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
//sql语句
string sql = string.Format("INSERT INTO Member (MemberAccount, MemberPwd, MemberName, MemberPhone)VALUES ('{0}', '{1}', '{2}', '{3}')",
this.textAccount.Text, textPwd.Text, textName.Text, textIphone.Text);
SqlCommand cmd = new SqlCommand(sql, conn);
int code = cmd.ExecuteNonQuery();
conn.Close();
if (code == 1)
{
MessageBox.Show("添加成功");
}
else
{
MessageBox.Show("添加失败");
}
}