中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中的DataSet,DataTable,DataView怎么用

發布時間:2022-05-12 10:38:57 來源:億速云 閱讀:211 作者:zzz 欄目:開發技術

本篇內容主要講解“C#中的DataSet,DataTable,DataView怎么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C#中的DataSet,DataTable,DataView怎么用”吧!

一、創建Dataset和DataTable

DataSet ds = new DataSet();//DataSetName默認為"NewDataSet"
DataTable table = ds.Tables.Add("Customers");
//或者
//DataTable table1 = new DataTable("Customers");
//ds.Tables.Add(table1);

//添加列 
DataColumn col=table.Columns.Add("OrderID",typeof(int)) ;//Type.GetType("System.Int32")
 col.AllowDBNull=false;
 col.MaxLength=5;
 col.Unique = true;//為此列自動添加一個UniqueConstraint約束
table.PrimaryKey = new System.Data.DataColumn[] {table.Columns["CustomerID"]};//設置主鍵,AllowDBNull自動設成false,自動應用UniqueConstraint約束

//自動增長列
DataColumn col1=table.Columns.Add("OrderID",typeof(int));
 col.AutoIncrement=true;
 col.AutoIncrementSeed=1;
 col.AutoIncrementStep=1;
 col.ReadOnly=true;

//計算列
table.Columns.Add("ItemTotal",typeof(decimal),"Quantity*Unique");

二、添加行

//使用DataRowCollection對象的Add()方法
DataRow row = ds.Tables[0].NewRow();
row["CustomerID"] = "ALFKI";
row["CustomerName"] = "XX";
ds.Tables[0].Rows.Add(row);

//使用Table對象的LoadDataRow方法
object[] rowData = { "ALFKI", "XX", "x", "" };
ds.Tables[0].LoadDataRow(rowData, false);

三、修改行

//使用DataRow對象的BeginEdit、EndEdit方法。
DataRow row = ds.Tables[0].Rows.Find("ANTON");//在主鍵列查找,可以用索引訪問行ds.Tables[0].Rows[3]
if (row != null)
{
    row.BeginEdit();
    row["CompanyName"] = "New Company";
    row["ContactName"] = "New Contact";
    row.EndEdit();
}
//使用DataRow對象ItemArray屬性進行賦值。
objec[] rowData = { null, "New Company", "New Contact", null };//null表示不修改該列數據
DataRow row = ds.Tables[0].Rows.Find("ALFKI");
row.ItemArray = rowData;

//單個字段修改
if (row.IsNull("phone"))
{
    row["phone"] = DBNull.Value;
}//判斷字段值是否為空,是則賦予空值。

四、刪除行

//Delete方法實際上不是從DataTable中刪除掉一行,而是將其標志為刪除.
//循環刪除的時候最好用Delete方法,這樣先做刪除標記,然后用table.AcceptChanges()方法統一提交,或者RejectChanges()  方法實現行狀態的回滾
DataRow[] rows = ds.Tables[0].Select("Compane like 'a%'");
foreach (DataRow row in rows)
{
    row.Delete();
}
ds.Tables[0].AcceptChanges();
//如果該行的 RowState 為 Added,則在調用 Delete后, RowState 將變為 Detached。  在調用 AcceptChanges 之后,將從表中移除該行。
//如果該行的 RowState 為 Unchanged,則在調用 Delete后,RowState 將變為 Deleted。  在調用 AcceptChanges 之后,將從表中移除該行。


//Remove和RemoveAt方法則是真正的從DataRow中刪除一行,等同于先調用 DataRow.Delete() 方法再調用 AcceptChanges()方法。DataRowState狀態改變兩次。
DataRow row = ds.Tables[0].Rows.Find("ALFKI");
ds.Tables[0].Rows.Remove(row);//ds.Tables[0].RemoveAt(index)

//Clear方法
ds.Tables[0].Clear();
ds.Clear();

數據行狀態 (RowState)

  • UnChanged狀態:指表中的行自創建之后沒有做過任何改動的狀態,或則是行在上次接受修改之后,至今未做過任何改動的狀態。

  • Added狀態:該狀態是指已經將行添加到表中,但是尚未調用表對象的AcceptChanged方法。調用AcceptChanged方法時,所有處在Added狀態的行都變為Unchanged狀態。

  • Modified狀態:該狀態表示該行已經被修改。調用AcceptChanged方法時,所有處在Modified狀態的行都變為Unchanged狀態

  • Deleted狀態:該狀態表示該行已經從表中刪除,但是尚未調用表對象的AcceptChanged方法

  • Detached狀態:該狀態表示該行不屬于任何表,或則已經從表中分離出去了,不再屬于任何表的DataRow對象。

新建的行(DataRow對象)處于Detached狀態,把它添加到DataTable對象之后,該DataRow對象的狀態變為Added狀態。如果對該DataRow進行了修改,則該行處于Modified狀態。如果使用Remove方法從表中移除該DataRow對象,或則使用Delete方法和AcceptChanged方法移除該行,則該行處于Detached狀態。

五、合并兩個DataSet

//將指定的 dataSet、datatable或datarow[] 與當前的 ds 合并,在此過程中,將根據給定的參數保留或放棄在當前 ds 中的更改并處理不兼容的架構。
ds.Merge(DataSet otherDataSet, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);

preserveChanges:當兩個數據集包含相同主鍵值的記錄時,是否保留當前ds的更改,默認為false。

  • false:用otherDataSet的記錄來更新當前ds記錄。ds存在而otherDataSet不存在的主鍵行結果將被刪除。

  • true:保留ds的記錄,并加入新記錄。

MissingSchemaAction:當兩個數據集包含不同的列時(兩個具有不同模式的DataSet)的處理方法。

  • Add:添加otherDataSet的新列到ds.

  • AddWithKey:添加otherDataSet的新列和主鍵信息到ds.

  • Error:如果缺少指定的列映射,則生成 InvalidOperationException。

  • Ignore:忽略任何新列。

ds.Tables[0].Merge(dataSet.Tables[0], false, MissingSchemaAction.Add);

六 、添加關系

ds.Relations.Add("CustomerToOrders",//關系名:默認關系名為DataRelation
    ds.Tables["Customer"].Columns["CustomerID"],//父列,可為數組
    ds.Tables["Orders"].Columns["CustomerID"]//子列,可為數組
);

注意:默認會創建UniqueConstraint到父表,ForeignKeyConstraint約束到子表。
可以使用DataRelation的一個構造函數的參數倆避免自動創建約束。

//從父行獲取子行:GetChildRows
 DataRow[] rows = ds.Tables["Customer"].Rows[0].GetChildRows("CustomerToOrders");//CustomerToOrders為關系名。
//從子行獲取行行:GetChildRows    或或者GetParentRow                                                                    
 DataRow[] rows = ds.Tables["Orders"].Rows[0].GetParentRows("CustomerToOrders");//
 //獲取不同的行版本:
if (rows[0].HasVersion(DataRowVersion.Proposed)
 {
     rows = rows[0].GetChildRows("CustomerToOrders", DataRowVersion.Proposed);
 }

數據行版本(DataRowVersion)


    • Current:表示行的當前值。處于deleted狀態的行不存在該行版本。

    • Original:表示行的原始值。處于Added狀態的行不存在該行版本

    • Proposed:表示行的建議值。不屬于表的行,即處于Detached狀態的行存在該行版本;對于正在進行編輯的行,也存在該行版本。

    • Default:表示行的默認版本。處于Added,Modified或則Unchanged狀態的行的默認行版本是Current;處于deleted狀態的行的默認行版本是Original。處于Detached狀態的行的默認版本是proposed。

當調用AcceptChanged方法,所有處于deleted狀態的行將變為Detached狀態,即被移除。其余的行會變為Unchanged狀態,并且Original版本中的值會改寫為Current行版本的值。

七、數據約束。

1、主鍵約束,使用UniqueConstraint

UniqueConstraint unique = new UniqueConstraint(ds.Tables[0].Columns["phone"]);
ds.Tables[0].Constraints.Add(unique);

2、外鍵約束:ForeignKeyConstraint

ForeignKeyConstraint fk = new ForeignKeyConstraint("CustomerOrder",
        ds.Tables["Customer"].Columns["CustomerID"],//父列,可為數組
        ds.Tables["Orders"].Columns["CustomerID"]//子列,可為數組
);
fk.UpdateRule = Rule.Cascade;
fk.DeleteRule = Rule.SetNull;
fk.AcceptRejectRule = Rule.None;
ds.Tables["Orders"].Constraints.Add(fk);//在字表中添加約束,且目標自動添加Unique約束。

在對附表的列或行執行某種操作時,使用這些規則一確定應對子表行進行的操作規則。

  • Rule.Cascade:級聯(默認);

  • Rule.None(無動作);

  • Rule.SetDefault;

  • Rule.SetNull四種。

注意:啟用約束前提是:

ds.EnforceConstraints = true;//true為默認值

在對DataSet執行AcceptChanges或RejectChanges方法時,才執行AccpetRejectRule。比UpdateRule和DeleteRule要晚執行。

八、DataTable事件

  • dt.ColumnChanging

  • dt.ColumnChanged 

  • dt.RowChanging

  • dt.RowChanged

  • dt.RowDeleting

  • dt.RowDeleted

  • dt.TableClearing

  • dt.TableCleared

  • dt.TableNewRow

custTable.ColumnChanged += new  DataColumnChangeEventHandler(Column_Changed );
private static void Column_Changed(object sender, DataColumnChangeEventArgs e )
{
    Console.WriteLine("Column_Changed Event: name={0}; Column={1}; original name={2}", 
        e.Row["name"], e.Column.ColumnName, e.Row["name", DataRowVersion.Original]);
}

九、DataSet其他方法

ds.Clone();//只克隆一個相同結構的Dataset
ds.Copy();//復制一個相同結構和相同內容的Dataset

ds.ReadXml("D:\1.xml");
ds.ReadXmlSchema("D:\1.xml");
ds.WriteXml("D:\1.xml",XmlWriteMode.WriteSchema);
ds.WriteXmlSchema("D:\1.xml");

ds.GetXml()://返回模式和內容的XML
ds.GetXmlSchema://只返回模式信息
 
DataTable dt;
dt.Compute(expression,filter); //計算
dt.Select(filter,sort,DataViewRowState)

十、DataTable的Select()方法

獲取DATAROW對象的數組

  • Select()

  • Select(string filterExpression)

  • Select(string filterExpression, string sort)

  • Select(string filterExpression, string sort, DataViewRowState recordStates)

注意事項:上面的Select操作是大小寫不敏感的(記錄的字段不敏感),如果需要區分大小寫,需要將DataTable的caseSensitive屬性設為true。

DataRow[] arrRows = table.Select("pubdate>='#1/1/2000#'");//下面這條語句選擇Pubdate字段日期在2000年1月1日當天或之后的DataRow 

DataRow[] arrRows = table.Select("state in('ca','tn','wa')");//支持in, 返回"state"等于CA、TN或WA的所有行

DataRow[] arrRows = table.Select("state like 'ca*'");//支持like   

DataRow[] arrRows = table.Select("isnull(state,0)=0");//還可以使用一些Sql函數,在DataTable中選擇State字段為空的記錄

DataRow[] arrRows = table.Select("state='tn' and zip like '37*'");//還可以使用And、Or和Not

DataRow[] arrRows = table.Select("id>5", "id desc");
//帶過濾、排序和行狀態的完整方法:
DataRow[] arrRows = table.Select("id>5", "id desc", DataViewRowState.Added);

十一、DataView數據視圖

//創建數據視圖DataView 
DataView dv = ds.Tables["Author"].DefaultView;//或者DataView dv = new DataView(ds.Tables["Author"]);

//行過濾
dv.RowFilter = "state='CA' and City=aa";//行過濾,日期需要用#號包圍。或者dv.RowFilter = "Sum(child.unitPrice>100)"//可用的函數Convert,Len,IsNull,IIF,SubString
dv.RowStateFilter = DataViewRowState.Added | DataViewRowState.OriginalRows;

//主鍵查找
int rowIndex = dv.Find("wison");//注意查找獲取行索引。
DataRowView[] rowviews = dv.FindRows("Raing");

//字段排序
dv.Sort = "state desc,firstName asc"; 

//添加行
dv.AllowNew = true;
DataRowView newRow = dv.AddNew();
newRow["customername"] = "aa";

//修改行
dv.AllowEdit = true;
dv[0]["customername"] = "aa";

//刪除行
dv.AllowDelete = true;
dv.Delete(1);

//遍歷
foreach (DataRowView rowview in dv)
{
    rowview["customername"] = "aa";
}

DataView的行狀態(DataViewRowState):

  • Added:新行。

  • CurrentRows:當前行包括未更改的行、新行和已修改的行。 (默認情況下,DataViewRowState 設置為 CurrentRows。)

  • Deleted:已刪除的行。

  • ModifiedCurrent:已修改的原始數據的當前版本

  • ModifiedOriginal:已修改數據的原始版本。

  • None:無。

  • OriginalRows:原始行包括未更改的行和已刪除的行。

  • Unchanged:未更改的行。

十二、DataViewManager

DataViewManager manager=ds.DefaultViewManager;//或new DataViewManager(ds)
DataView dv=manager.CreateDataView(ds.Tables[0]);//創建DataView
//或者
manager.DataViewSettings["Order"].Sort="orderDate desc"

到此,相信大家對“C#中的DataSet,DataTable,DataView怎么用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德惠市| 瓮安县| 太仓市| 星子县| 金堂县| 疏勒县| 泽普县| 巧家县| 仁化县| 德兴市| 岢岚县| 永宁县| 长沙县| 科技| 宜州市| 宿迁市| 安新县| 田林县| 海林市| 修武县| 天峻县| 建阳市| 汨罗市| 瑞丽市| 连山| 漳州市| 漳平市| 夏津县| 郧西县| 蒲江县| 北海市| 博罗县| 大渡口区| 宝坻区| 射洪县| 钟山县| 台州市| 犍为县| 噶尔县| 阿尔山市| 安西县|