一、创建Dataset和DataTable DataSet ds = new DataSet();//DataSetName默认为"NewDataSet" DataTable tab
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();
新建的行(DataRow对象)处于Detached状态,把它添加到DataTable对象之后,该DataRow对象的状态变为Added状态。如果对该DataRow进行了修改,则该行处于Modified状态。如果使用Remove方法从表中移除该DataRow对象,或则使用Delete方法和AcceptChanged方法移除该行,则该行处于Detached状态。
//将指定的 dataSet、datatable或datarow[] 与当前的 ds 合并,在此过程中,将根据给定的参数保留或放弃在当前 ds 中的更改并处理不兼容的架构。
ds.Merge(DataSet otherDataSet, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);
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);
}
当调用AcceptChanged方法,所有处于deleted状态的行将变为Detached状态,即被移除。其余的行会变为Unchanged状态,并且Original版本中的值会改写为Current行版本的值。
UniqueConstraint unique = new UniqueConstraint(ds.Tables[0].Columns["phone"]);
ds.Tables[0].Constraints.Add(unique);
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约束。
在对附表的列或行执行某种操作时,使用这些规则一确定应对子表行进行的操作规则。
注意:启用约束前提是:
ds.EnforceConstraints = true;//true为默认值
在对DataSet执行AcceptChanges或RejectChanges方法时,才执行AccpetRejectRule。比UpdateRule和DeleteRule要晚执行。
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]);
}
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)
获取DATAROW对象的数组
注意事项:上面的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 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";
}
DataViewManager manager=ds.DefaultViewManager;//或new DataViewManager(ds)
DataView dv=manager.CreateDataView(ds.Tables[0]);//创建DataView
//或者
manager.DataViewSettings["Order"].Sort="orderDate desc"
--结束END--
本文标题: C#中DataSet,DataTable,DataView的区别与用法
本文链接: https://lsjlt.com/news/148552.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0