C# DataSet、DataTable、DataRow、DataColumn 數據集應用大全

C# DataSet、DataTable、DataRow、DataColumn 數據集應用大全

 

一、數據集基本應用

1.表格新增記錄

方式一:利用BindingSource的AddNew

//新增記錄,推薦使用,光標位置處於當前新增記錄,且正處理編輯狀態
DataRow thisRow = ((DataRowView)usersBindingSource.AddNew()).Row;
thisRow["OID"] = 5;
thisRow["CNAME"] = "新增用戶";
thisRow["sex"] = "m";

方式二:利用DataTable的NewRow

//新增記錄(不建議使用,因爲這種方式Rows.Add時並不處於編輯狀態時會受約束影響,且新增時光標不會自動移動該條記錄) 
DataRow thisRow = userDataSet.Tables["Users"].NewRow();
thisRow["OID"] = 5;
thisRow["CNAME"] = "新增用戶";
thisRow["sex"] = "m";
userDataSet.Tables["Users"].Rows.Add(thisRow);

2.表格刪除記錄

方式一:利用BindingSource的RemoveCurrent

if (usersBindingSource.Current != null)
//刪除當前記錄,推薦使用
usersBindingSource.RemoveCurrent();

方式二:利用DataRowCollection的Remove

//刪除當前記錄,不推薦使用,這種方式不會記錄到RowState中,保存時不會更新
DataRow thisRow = getCurrentDataRow(usersBindingSource);
if (thisRow != null)
userDataSet.Tables["Users"].Rows.Remove(thisRow);

方式三:利用DataRow的Delete

//刪除當前記錄,不推薦使用,BindingSource可以更簡潔
DataRow thisRow = getCurrentDataRow(usersBindingSource);
if (thisRow != null)
thisRow.Delete();

3.表格修改記錄

方式一:利用DataRowObject[列名]直接修改

複製代碼

DataRow thisRow = getCurrentDataRow(usersBindingSource);

if (thisRow != null)
{
thisRow.BeginEdit();
thisRow["CNAME"] = "修改的名稱";
thisRow.EndEdit();
}
複製代碼

4.表格查找和篩選記錄

方式一:利用DataRowCollection.find查找

複製代碼

DataColumn[] keys = new DataColumn[1];
keys[0] = userDataSet.Tables["Users"].Columns["OID"];
userDataSet.Tables["Users"].PrimaryKey = keys;
DataRow findRow = userDataSet.Tables["Users"].Rows.Find("1");
if (findRow == null)
{
MessageBox.Show("沒有找到");
}
else
{
MessageBox.Show("成功找到,CNAME = " + findRow["CNAME"]);
}
複製代碼

方式二:利用BindingSource.find查找

int i = usersBindingSource.Find("OID", "1");

if (i >= 0)
MessageBox.Show("成功找到,CNAME = " +
userDataSet.Tables["users"].Rows[i]["CNAME"]);

方式三:利用DataTable.Select獲得DataRow數組


DataRow[] AryDr = userDataSet.Tables["users"].Select("OID > 1");

for (int i = 0; i < AryDr.Length; i++)
{
DataRow dr = AryDr[i];
MessageBox.Show(Convert.ToString((int)dr["OID"]));
}

5.表格記錄的移動

方式一:採用BindingSource的方法或position屬性實現。

複製代碼
//指定定位到哪一行,Position不會隨表格列排序而變化,0不一定就是表格的第一行

usersBindingSource.Position = 0;

//移動到上一條,對於表格列排序後,上一條不定是界面顯示錶格的上一條

usersBindingSource.MovePrevious();

usersBindingSource.MoveNext();//移動到下一條

usersBindingSource.MoveFirst();

usersBindingSource.MoveLast();
複製代碼

6.表格的過濾

方式一:利用BindingSource的Filter來實現


usersBindingSource.Filter = "OID > 1";

7.數據集清空

方式一:利用DataTable.Clear(),注意這種不會保留刪除狀態,保存時不會真正刪除


userDataSet.Tables["users"].Clear();

方式二:利用DataTable.Rows.Clear刪除,注意這種不會保留刪除狀態,保存時不會真正刪除


userDataSet.Tables["users"].Rows.Clear();

方式三:利用BindingSource.RemoveCurrent循環刪除全部記錄,這種就會保留刪除狀態。

while (usersBindingSource.Current != null)
usersBindingSource.RemoveCurrent();

8.數據集數據和結構的複製

方式一:整個數據集的複製


DataSet copyDS = userDataSet.Copy();

方式二:只複製單個表


DataSet copyDS = new DataSet();
copyDS.Tables.Add(userDataSet.Tables["users"].Copy());

方式三:只複製數據集的結構


copyDS = userDataSet.Clone();
MessageBox.Show(copyDS.Tables["users"].Rows.Count.ToString());

9.獲取髒數據

方式一:整個數據集的髒數據


copyDS = userDataSet.GetChanges();

方式二:獲取單個表的髒數據


DataTable dt = userDataSet.Tables["users"].GetChanges();

10.數據集的數據合併

方式一:整個數據集的DataSet.Merge合併


ds.Merge(userDataSet);

方式二:單個表的DataTable.Merge合併


ds.Merge(userDataSet.Tables["users"]);

11.數據集的數據回滾

方式一:數據集的數據回滾


userDataSet.RejectChanges();

方式二:數據表的數據回滾


userDataSet.Tables["users"].RejectChanges();

方式三:數據行的數據回滾


DataRow dr = getCurrentDataRow(usersBindingSource);

if (dr != null)
dr.RejectChanges();

12.數據集從數據庫取數

方式一:利用SqlDataAdapter.Fill來填充數據表

this.usersTableAdapter.Fill(this.userDataSet.Users);

13.數據集更新到數據庫

方式一:利用SqlDataAdapter.Update來更新到數據庫

複製代碼
this.Validate();
this.usersBindingSource.EndEdit();

if (this.userDataSet.HasChanges())
{
this.usersTableAdapter.Update(this.userDataSet.Users);
MessageBox.Show("保存成功!");
}
複製代碼

14.判斷數據集變更

方式一:利用DataSet.HasChanges()

15獲取數據集表列集合

方式一:利用DataTable.Columns


DataColumnCollection dcc = userDataSet.Tables["users"].Columns;

for (int i = 0; i < dcc.Count; i++)
{
DataColumn dc = dcc[i];
MessageBox.Show(dc.ColumnName);
}

16獲取屬於該表的行的集合

方式一:利用DataTable.Rows


DataRowCollection drc = userDataSet.Tables["users"].Rows;

for (int i = 0; i < drc.Count; i++)
{
DataRow dr = drc[i];
MessageBox.Show((string)dr["CNAME"]);
}

17 獲取或設置存儲在指定列中的數據

方式一:利用DataRowObject[列名]來訪問或設置。


DataRow dr = getCurrentDataRow(usersBindingSource);
MessageBox.Show((string)dr["CNAME"]);

18獲取記錄行的狀態。

方式一:利用DataRow.RowState獲取

複製代碼

DataRow dr = getCurrentDataRow(usersBindingSource);

switch (dr.RowState)
{
case DataRowState.Added:
MessageBox.Show("新增的記錄");
break;
case DataRowState.Deleted:

     MessageBox.Show("刪除的記錄");
break;
case DataRowState.Detached:
MessageBox.Show("不屬於任何DataRowCollection的狀態");
break;
case DataRowState.Modified:
MessageBox.Show("修改的記錄");
break;
case DataRowState.Unchanged:
MessageBox.Show("未變化的記錄");
break;
default:
break;
};
複製代碼

19 對記錄行開始編輯操作、取消對該行的當前編輯、終止發生在該行的編輯

方式一:利用DataRow的BeginEdit、CancelEdit、EndEdit

複製代碼

DataRow dr = getCurrentDataRow(usersBindingSource);
dr.BeginEdit();
dr["CNAME"] = "yy";

if (((string)dr["CNAME",DataRowVersion.Original]).Equals("YY"))
dr.CancelEdit();
else
dr.EndEdit();
複製代碼

20 獲取或設置列中是否允許空值

方式一:利用DataColumn的AllowDBNull,注意這樣可以允許空字符串


userDataSet.Tables["users"].Columns["tel"].AllowDBNull = false;

21指示列自動遞增

方式一:利用DataColumn的AutoIncrement指

複製代碼

DataColumn column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.AutoIncrement = true;
column.AutoIncrementSeed = 1000;
column.AutoIncrementStep = 10;

// Add the column to a new DataTable.
DataTable table = new DataTable("table");
table.Columns.Add(column);
DataRow dr = table.NewRow();
MessageBox.Show(Convert.ToString((int)dr[0]));
DataRow dr1 = table.NewRow();
MessageBox.Show(Convert.ToString((int)dr1[0]));
複製代碼

22 獲取列名

方式一:利用DataColumn.ColumnName


MessageBox.Show(userDataSet.Tables["users"].Columns[0].ColumnName);

23在創建新行時獲取或設置列的默認值

方式一:利用DataColumn.DefaultValue


userDataSet.Tables["users"].Columns["CNAME"].DefaultValue = "yy";

24 獲取設置列的只讀

方式一:DataColumn.Readonly


userDataSet.Tables["users"].Columns["tel"].ReadOnly = true;
//這一句會出錯,程序寫入都不允許
userDataSet.Tables["users"].Rows[0]["tel"] = "111";

25獲取數據集中的數據類型

方式一:利用DataColumn.DataType


DataColumnCollection dcc = userDataSet.Tables["users"].Columns;

for (int i = 0; i < dcc.Count; i++)
{
DataColumn dc = dcc[i];
MessageBox.Show(dc.DataType.ToString());
}

26計算列表達式的設置

方式一:利用DataColumn.Expression


userDataSet.Tables["users"].Columns["totalMoney"].Expression = " OID * 100 ";

27指示列的每一行中的值是否必須是唯一

方式一:利用DataColumn.Unique


userDataSet.Tables["users"].Columns["tel"].Unique = true;

28獲取包含在 DataSet 中的表的集合

方式一:利用DataSet的Tables


            DataTableCollection AryTable = userDataSet.Tables;

MessageBox.Show(AryTable[0].TableName + " " + AryTable[1].TableName);

29 獲取 DataSet 所包含的數據的自定義視圖

方式一:利用DataSet的DefaultViewManager

方式二:利用DataTable的DefaultView

30.表格記錄新增、刪除、修改的控制

方式一:利用BindingSource的AllowEdit、AllowNew、AllowRemove

 


usersBindingSource.AllowNew = false;

 

31. 獲取表格的記錄數

 

方式一:利用BindingSource.Count

 


MessageBox.Show(usersBindingSource.Count.ToString());

 

 

方式二:利用DataTable.Rows.Count

 

 

 

32.獲取表格的當前行

 

方式一:利用bindingSource.Current

 

複製代碼
public static DataRow getCurrentDataRow(BindingSource bindSource)
{
if (!typeof(DataRowView).IsInstanceOfType(bindSource.Current))
return null;
DataRowView drv = (DataRowView)bindSource.Current;

if (drv == null)
return null;
else
return drv.Row;
}
複製代碼

 

 

33.獲取表格當前項的索引

 

方式一:利用BindingSource.Position

 


MessageBox.Show(usersBindingSource.Position.ToString());

 

 

 

 

 

 

二、數據集其它應用

 

1.其它

 

1.1 指示DataTable中的字符串比較是否區分大小寫

 

方式一:指示DataSet的CaseSensitive

 


userDataSet.CaseSensitive = true;



DataRow[] AryDR = userDataSet.Tables["users"].Select("CNAME = 'yy'");

 

 

方式二:指示DataTable的CaseSensitive

 


userDataSet.Tables["users"].CaseSensitive = true;



DataRow[] AryDR = userDataSet.Tables["users"].Select("CNAME = 'yy'");

 

 

1.2指示在嘗試執行任何更新操作時是否遵循約束規則

 

方式一:指示DataSet的EnforceConstraints

 

複製代碼

userDataSet.EnforceConstraints = false;



DataRow thisRow = userDataSet.Tables["Users"].NewRow();



thisRow["OID"] = 5;



thisRow["sex"] = "m";



userDataSet.Tables["Users"].Rows.Add(thisRow); //如果沒有置EnforceConstraints,則會添加失敗。
複製代碼

 

 

1.3 獲取與 DataSet 相關的自定義用戶信息的集合

 

方式一:利用DataSet的ExtendedProperties

 

複製代碼

PropertyCollection properties = userDataSet.ExtendedProperties;



//Add a timestamp value to the PropertyCollection.



if (!properties.ContainsKey("TimeStamp"))



properties.Add("TimeStamp", DateTime.Now);



PropertyCollection properties1 = userDataSet.ExtendedProperties;



MessageBox.Show(((DateTime)properties1["TimeStamp"]).ToString());
複製代碼

 

 

方式二:利用DataTable的ExtendedProperties

 

複製代碼

PropertyCollection properties = userDataSet.Tables["users"].ExtendedProperties;



//Add a timestamp value to the PropertyCollection.



if (!properties.ContainsKey("TimeStamp"))



properties.Add("TimeStamp", DateTime.Now);



PropertyCollection properties1 = userDataSet.Tables["users"].ExtendedProperties;



MessageBox.Show(((DateTime)properties1["TimeStamp"]).ToString());
複製代碼

 

 

1.4獲取用於將錶鏈接起來並允許從父表瀏覽到子表的關係的集合

 

方式一:利用DataSet的Relations

 


DataColumn[] aryChildColumn = userDataSet.Relations[0].ChildColumns;



DataColumn[] aryParentColumn = userDataSet.Relations[0].ParentColumns;



MessageBox.Show(aryChildColumn[0].ColumnName + " " + aryParentColumn[0].ColumnName);

 

 

1.5爲每個 DataTable 返回帶有一個結果集的DataTableReader

 

方式一:利用DataSet.CreateDataReader()

 

複製代碼
using (DataTableReader reader = userDataSet.CreateDataReader())



{



do



{



if (!reader.HasRows)



{



Console.WriteLine("Empty DataTableReader");



}



else



{



while (reader.Read()) //下一個數據行



{



for (int i = 0; i < reader.FieldCount; i++)



{



Console.Write(reader[i] + " ");



}



Console.WriteLine();



}



}



Console.WriteLine("========================");



} while (reader.NextResult());//下一個數據表



}
複製代碼

 

 

方式二:利用DataTable.CreateDataReader()

 

1.6返回存儲在 DataSet 中的數據的 XML 表示形式

 

方式一:利用DataSet.GetXml();

 


MessageBox.Show(userDataSet.GetXml());

 

 

1.7獲取或設置充當數據表主鍵的列的數組

 

方式一:設置DataTable.PrimaryKey

 


DataColumn[] keys = new DataColumn[1];



keys[0] = userDataSet.Tables["Users"].Columns["OID"];



userDataSet.Tables["Users"].PrimaryKey = keys;

 

 

1.8在加載數據時關閉通知、索引維護和約束

 

方式一:DataTable.BeginLoadData()和 EndLoadData()。

 

1.9將 DataRow 複製到 DataTable 中,保留任何屬性設置以及初始值和當前值

 

方式一:利用DataTable.ImportRow

 

複製代碼

DataSet copyDS = new UserDataSet();



copyDS.Tables["users"].ImportRow(userDataSet.Tables["users"].Rows[0]);



MessageBox.Show(



copyDS.Tables["users"].Rows[0]["cname", DataRowVersion.Original]



+ " " +



  copyDS.Tables["users"].Rows[0]["cname", DataRowVersion.Current]);
複製代碼

 

 

1.10查找和更新特定行。如果找不到任何匹配行,則使用給定值創建新行

 

方式一:利用DataTable.LoadDataRow

 

複製代碼

DataRow newRow = userDataSet.Tables["users"].NewRow();



newRow["OID"] = 1;



newRow["CNAME"] = "rename yy";



newRow["SEX"] = "f";



userDataSet.Tables["users"].BeginLoadData();



//LoadDataRow,以主鍵查找記錄,當記錄存在時只更新,不存在時新增記錄



DataRow row = userDataSet.Tables["users"].LoadDataRow(newRow.ItemArray, true);



userDataSet.Tables["users"].EndLoadData();
複製代碼

 

 

1.11獲取一個值,該值指示指定的列是否包含空值

 

方式一:利用DataRow.IsNull判斷


DataRow dr = getCurrentDataRow(usersBindingSource);

if (dr.IsNull("tel"))

MessageBox.Show("爲空");

else

MessageBox.Show("不空");

1.12獲取 DataRow 的父行.

方式一:對於數據集兩個表存在主從關係的,可以通過DataRow.GetParentRow得到父記錄

 


DataRow dr = getCurrentDataRow(usersChildBindingSource);

DataRow pdr = dr.GetParentRow(userDataSet.Relations[0]);

MessageBox.Show((string)pdr["cname"]);

1.13 設置數據集列標題

方式一:利用DataColumn.Caption

 

//注意設置數據表的標題,並不會更新表格的列標題,可以考慮實現一公用方法同步表格標題

userDataSet.Tables["users"].Columns["CNAME"].Caption = "標題";

 

1.14 獲取數據集的Scheme

 

方式一:利用DataSet.GetXmlSchema

 


MessageBox.Show(userDataSet.GetXmlSchema());

 

1.15 將xml架構應用於DataSet

 

方式一:利用DataSet. InferXmlSchema

 

1.16 數據集到XML的轉化

 

方式一:DataSet.ReadXml將 XML 架構和數據讀入 DataSet。

 

方式二:DataSet.ReadXmlSchema將 XML 架構讀入 DataSet。

 

方式三:DataSet.WriteXml從 DataSet 寫 XML 數據,還可以選擇寫架構

 

方式四:DataSet.WriteXmlSchema寫 XML 架構形式的 DataSet 結構

 

1.17 數據集重置初始狀態

 

方式一:DataSet.Reset

 

1.18 基於數據表的給定表達式的計算

 

方式一:利用DataTable的Compute

 

int result = (int) userDataSet.Tables["users"].Compute("MIN(OID)", "");

MessageBox.Show(result.ToString());

 

 

 

 



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章