C# DataSet、DataTable、DataRow、DataColumn 數據集應用大全
1.表格新增記錄
//新增記錄,推薦使用,光標位置處於當前新增記錄,且正處理編輯狀態
DataRow thisRow = ((DataRowView)usersBindingSource.AddNew()).Row;
thisRow["OID"] = 5;
thisRow["CNAME"] = "新增用戶";
thisRow["sex"] = "m";
//新增記錄(不建議使用,因爲這種方式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);
//刪除當前記錄,不推薦使用,BindingSource可以更簡潔
DataRow thisRow = getCurrentDataRow(usersBindingSource);
if (thisRow != null)
thisRow.Delete();
3.表格修改記錄
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"]);
}
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.表格的過濾
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.數據集的數據合併
ds.Merge(userDataSet);
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.判斷數據集變更
15獲取數據集表列集合
DataColumnCollection dcc = userDataSet.Tables["users"].Columns;
for (int i = 0; i < dcc.Count; i++)
{
DataColumn dc = dcc[i];
MessageBox.Show(dc.ColumnName);
}
16獲取屬於該表的行的集合
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 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 獲取列名
MessageBox.Show(userDataSet.Tables["users"].Columns[0].ColumnName);
23在創建新行時獲取或設置列的默認值
userDataSet.Tables["users"].Columns["CNAME"].DefaultValue = "yy";
24 獲取設置列的只讀
userDataSet.Tables["users"].Columns["tel"].ReadOnly = true;
//這一句會出錯,程序寫入都不允許
userDataSet.Tables["users"].Rows[0]["tel"] = "111";
25獲取數據集中的數據類型
DataColumnCollection dcc = userDataSet.Tables["users"].Columns;
for (int i = 0; i < dcc.Count; i++)
{
DataColumn dc = dcc[i];
MessageBox.Show(dc.DataType.ToString());
}
26計算列表達式的設置
userDataSet.Tables["users"].Columns["totalMoney"].Expression = " OID * 100 ";
27指示列的每一行中的值是否必須是唯一
userDataSet.Tables["users"].Columns["tel"].Unique = true;
28獲取包含在 DataSet 中的表的集合
DataTableCollection AryTable = userDataSet.Tables;
MessageBox.Show(AryTable[0].TableName + " " + AryTable[1].TableName);
29 獲取 DataSet 所包含的數據的自定義視圖
方式一:利用DataSet的DefaultViewManager
30.表格記錄新增、刪除、修改的控制
方式一:利用BindingSource的AllowEdit、AllowNew、AllowRemove
usersBindingSource.AllowNew = false;
31. 獲取表格的記錄數
MessageBox.Show(usersBindingSource.Count.ToString());
32.獲取表格的當前行
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.獲取表格當前項的索引
MessageBox.Show(usersBindingSource.Position.ToString());
1.其它
1.1 指示DataTable中的字符串比較是否區分大小寫
userDataSet.CaseSensitive = true;
DataRow[] AryDR = userDataSet.Tables["users"].Select("CNAME = 'yy'");
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獲取用於將錶鏈接起來並允許從父表瀏覽到子表的關係的集合
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 表示形式
MessageBox.Show(userDataSet.GetXml());
1.7獲取或設置充當數據表主鍵的列的數組
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 中,保留任何屬性設置以及初始值和當前值
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查找和更新特定行。如果找不到任何匹配行,則使用給定值創建新行
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 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 設置數據集列標題
//注意設置數據表的標題,並不會更新表格的列標題,可以考慮實現一公用方法同步表格標題
userDataSet.Tables["users"].Columns["CNAME"].Caption = "標題";
1.14 獲取數據集的Scheme
MessageBox.Show(userDataSet.GetXmlSchema());
1.15 將xml架構應用於DataSet
1.16 數據集到XML的轉化
方式一:DataSet.ReadXml將 XML 架構和數據讀入 DataSet。
方式二:DataSet.ReadXmlSchema將 XML 架構讀入 DataSet。
方式三:DataSet.WriteXml從 DataSet 寫 XML 數據,還可以選擇寫架構
方式四:DataSet.WriteXmlSchema寫 XML 架構形式的 DataSet 結構
1.17 數據集重置初始狀態
1.18 基於數據表的給定表達式的計算
int result = (int) userDataSet.Tables["users"].Compute("MIN(OID)", "");
MessageBox.Show(result.ToString());