1. 程式人生 > >c# DataSet DataTable DataColumn DataRow資料操作集

c# DataSet DataTable DataColumn DataRow資料操作集

一、資料集基本應用

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());