ADO.Net中DataSet的应用
思维导图
知识点描述
①属性
CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。
DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet"。如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。
DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False。
HasErrors:表示DataSet中 的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError属性设置为 True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。
NameSpace和Prefix:指定XML命名空间和前缀
Relations:返回一个DataRelationCollection对象。
Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。
②方法
AcceptChanges和RejectChanges: 接受或放弃DataSet中所有挂起更改。调用AcceptChanges时,RowState属性值为Added或Modified的所有行的 RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。调用 RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。
Clear:清除DataSet中所有DataRow对象。该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快。
Clone和Copy:使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet。使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。
GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。
GetXml和GetXmlSchema:使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串。如果只希望返回架构信息,可以使用GetXmlSchema。
HasChange:表示DataSet中是否包含挂起更改的DataRow对象。
Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。
ReadXml和WriteXml:使用ReadXml方法从文件、TextReader、数据流或者XmlReader中将XML数据载入DataSet中。
Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好。
③事件
MergeFailed:在DataSet的Merge方法发生一个异常时触发。
示例代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace 药品工作站
{
public partial class 制造商管理 : Form
{
public 制造商管理()
{
InitializeComponent();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (this.trv1.SelectedNode.Level == 2)
{
int 编号 = (int)this.trv1.SelectedNode.Tag;
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString =
"Server=(local);Database=药品工作站管理系统;Integrated Security=sspi";
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = "SELECT * FROM 制造商信息 WHERE 编号=@编号;";
sqlCommand.Parameters.AddWithValue("@编号", 编号);
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.SelectCommand = sqlCommand;
DataTable Table1 = new DataTable();
sqlConnection.Open();
sqlDataAdapter.Fill(Table1);
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
if (sqlDataReader.Read())
{
this.no.Text = sqlDataReader["编号"].ToString();
this.name.Text = sqlDataReader["名称"].ToString();
this.phone.Text = sqlDataReader["联系电话"].ToString();
this.address.Text = sqlDataReader["详细地址"].ToString();
}
sqlDataReader.Close();
}
}
private void button3_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString =
"Server=(local);Database=药品工作站管理系统;Integrated Security=sspi";
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText =
"SELECT * FROM 国家;"
+ "SELECT * FROM 省份;"
+"SELECT * FROM 制造商信息";
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.SelectCommand = sqlCommand;
DataSet dataSet = new DataSet();
sqlConnection.Open();
sqlDataAdapter.Fill(dataSet);
sqlConnection.Close();
DataTable 国家 = dataSet.Tables[0];
DataTable 省份 = dataSet.Tables[1];
DataTable 制造商信息 = dataSet.Tables[2];
DataRelation[] dataRelations =
{
new DataRelation
("国家-省份"
, 国家.Columns["国家编号"]
, 省份.Columns["国家编号"]
, false)
, new DataRelation //实例化数据关系,实现专业表、班级表之间的层次关系;
("省份-制造商" //数据关系名称;
, 省份.Columns["省份编号"] //父表的被参照列为专业表的编号列;
, 制造商信息.Columns["省份编号"] //子表的参照列为班级表的专业编号列;
, false)
};
dataSet.Relations.AddRange(dataRelations);
this.trv1.Nodes.Clear();
foreach (DataRow nationRow in 国家.Rows)
{
TreeNode nationNode = new TreeNode();
nationNode.Text = nationRow["名称"].ToString();
this.trv1.Nodes.Add(nationNode);
foreach (DataRow provinceRow in nationRow.GetChildRows("国家-省份"))
{
TreeNode provinceNode = new TreeNode();
provinceNode.Text = provinceRow["名称"].ToString();
nationNode.Nodes.Add(provinceNode);
foreach (DataRow sellerRow in provinceRow.GetChildRows("省份-制造商")) //借助先前定义的数据关系,遍历当前专业所在数据行的子行,即下属所有班级;
{
TreeNode sellerNode = new TreeNode(); //声明并实例化班级节点,该节点对应当前某个班级;
sellerNode.Text = sellerRow["名称"].ToString(); //班级节点的文本设为当前班级的名称;
sellerNode.Tag = sellerRow["编号"]; //班级节点的标签设为当前班级的编号;
provinceNode.Nodes.Add(sellerNode); //班级节点加入当前专业节点的节点集合,成为第2级节点之一;
}
}
}}
private void button2_Click(object sender, EventArgs e)
{
if (this.no.Text.Trim() == "") //若用户号文本框为空;
{
MessageBox.Show("编号不能为空!"); //给出错误提示;
this.name.Focus(); //用户号文本框获得焦点;
return; //返回;
}
if (this.name.Text.Trim() == "") //若用户号文本框为空;
{
MessageBox.Show("名称不能为空!"); //给出错误提示;
this.name.Focus(); //用户号文本框获得焦点;
return; //返回;
}
if (this.phone.Text.Trim() == "") //若用户号文本框为空;
{
MessageBox.Show("手机号不能为空!"); //给出错误提示;
this.phone.Focus(); //用户号文本框获得焦点;
return; //返回;
}
if (this.address.Text.Trim() == "") //若用户号文本框为空;
{
MessageBox.Show("详细地址不能为空!"); //给出错误提示;
this.phone.Focus(); //用户号文本框获得焦点;
return; //返回;
}
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=药品工作站管理系统;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = sqlConnection.CreateCommand(); //调用SQL连接的方法CreateCommand来创建SQL命令;该命令将绑定SQL连接;
sqlCommand.CommandText =
"UPDATE 制造商信息"
+ " SET 编号=@编号,名称=@名称,联系电话=@联系电话,详细地址=@详细地址"
+ " WHERE 编号=@编号;";
sqlCommand.Parameters.AddWithValue("@编号", this.no.Text.Trim());
sqlCommand.Parameters.AddWithValue("@名称", this.name.Text.Trim());
sqlCommand.Parameters.AddWithValue("@联系电话", this.phone.Text.Trim());
sqlCommand.Parameters.AddWithValue("@详细地址", this.address.Text.Trim());
sqlConnection.Open();
int rowAffected = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
if (rowAffected == 1)
{
MessageBox.Show("更新成功。");
}
else
{
MessageBox.Show("更新失败!");
}
}}
}
运行结果: