思維導圖
知識點描述
①屬性
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("更新失敗!");
}
}}
}
運行結果: