DataSet

DataSet是ADO.NET开发人员为方便数据处理开发出来的,是数据的集合,是为解决DataReader的缺陷设计的,DataReader数据处理速度快,但它是只读的, 而且一旦移到下一行,就不能查看上一行的数据,DataSet则可以自由移动指针。DataSet的数据是与数据库断开的。DataSet还可用于多层应用程序中,如果应用程序运行在中间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应用程序。
  DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。还可以与XML数据互换。DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的Update方法。
  DataSet的操作:
DataSet ds=new DataSet();
DataTable dt=new DataTable("newTable");
ds.Tables.Add(dt);
DataSet ds=new DataSet();
DataTable dt=ds.Tables.Add("newTable");
上述两种方法都可以在DataSet中添加一个DataTable,看需要而进行选择。添加DataTable后,需向其中添加行和列。
DataSet ds=new DataSet();
DataTable dt=ds.Tables.Add("newTables");
DataColumn col=dt.Columns.Add("newColumn",typeof(int));
col.AllowDBNull=false;
col.MaxLength=4;
col.Unique=true;

上述代码向DataSet中的DataTable中添加名为”newColumn”,类型为int且不为空,最大长度为4和唯一性为真的列。
dt.PrimaryKey=new DataColumn[] {dt.Columns["ID"]}
这段代码是继续上面代码的,为一个DataTable中添加一个主键列,主键列是一个数据组,如有多个主键,只需在数组中添加一个列即可。如下:
dt.PrimaryKey=new DataColumns[] {dt.Columns["OrderID"],dt.Columns["ProductID"]}
添加外键:
ForeignKeyConstraint fk;
fk=new ForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
ds.Tables["Orders"].Constraints.Add(fk);
//上述代码假如已经为Cusomers表和Orders创建了主键,此句为添加外键约束。
上述是根据Customers表和Orders表的CustomerID来创建约束。
下面介绍修改DataRow中的内容:
DataRow dr=ds.Tables["Customer"].Rows.Find("ANTON");
if(dr==null)
else
{
dr.BeginEdit();
dr["CompanyName"]="newValue";
dr["ContactName"]="newValue2";
dr.EndEdit();
}
//上面代码通过Row集合的Find方法来在DataTable中的行进行定位,找到"ANTON"行,再修改"ANTON"行中CompanyName列和ContactName列的值。通过BeginEdit和EndEdit来缓存对行的修改,还可调用 CancelEdit为取消修改。
判断某列是否为空值:
DataRow dr=ds.Tables["Customers"].Rows.Find("aaa");
if(dr.IsNull("ContactName");
..
else
dr["ContactName"]=DBNull.Value
//这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。
删除DataRow:
有两种方法可以删除DataRow,Delete方法和Remove方法和RemoveAt方法。其区别是Delete方法实际上不是从DataTable中删除掉一行,而是将其标志为删除,仅仅是做个记号,而Remove方法则是真正的从DataRow中删除一行,RemoveAt方法是根本行的索引来删除。列:
DataRow dr=ds.Tables["table"].Rows.Find("a");
ds.Tables["table"].Remove(dr);

ds.Tables["table"].Remove(index);
//dr 为"a"所在的行,查出后将其删除,index为 "a"所在的索引号。

DataSet 循环: 

DataSet ds = new DataSet();
DataTable dt1 = ds.Tables[0];
string [] st = new string [dt1.Rows.Count];
for ( int i=0;i< dt1.Rows.Count;i++ )
{
st[i] = dt1.Rows[i]["name"].ToString();
}

DataSet
   |
   |____DataTables
   |        |
   |        |____DataTable
   |                |
   |                |____DataRows
   |

DataSet是独立于物理数据库存在于内存中的一个数据集,实现了数据库的表、关系等等,
其中可以存放多个表构成DataTables,
因此用外循环
foreach(DataTable xTable in DataSet.Tables)
访问每个表
用内循环
         foreach(DataRow xRow in xTable.Rows)
访问当前表中每个记录
foreach(DataTable xTable in DataSet.Tables)
{
         foreach(DataRow xRow in xTable.Rows)
        { 
               
      
           }
}

 

DataRow 与DataTable.Select 的结合用法

DataRow 与DataTable.Select 的结合用法
?
受了网上这段代码的启发:
Dim ldr As DataRow()
ldr = mdata. Select("PID<>'" & lstr & "'")
Dim ldata As DataTable = mdata.Clone'复制表结构
For Each r As DataRow In ldr
ldata.ImportRow(r)
Next
我写了我所需要的东东。。。
1. 取出数据库中的数据组成DataTable dt;
2. 用 DataRow? dr接收 dt. Select() 出来的值;
3.声名一个表dt2,dt2=dt.Clone();
4.用foreach( DataRow row in dr),和dt2.ImportRow(row) 来获取查询出来的值;
这样就ok 了! 当然我的 select中的条件也是费了好大的劲才弄出来的! 哈哈!
好了,到这!

使用 DataSet 对象更新数据库中的数据。还可以使用 SqlCommand 对象直接在数据库中插入、更新和删除数据。

加载 DataSet 后,就可以修改数据了。DataSet 将会跟踪这些更改。可将 DataSet 对象视为从数据库检索出并缓存于内存中的数据。首先要为DataAdapter(为数据适配器设置好Connection,以及SelectCommand、InsertCommand、UpdateCommand、DeleteCommand),对DataSet的修改,最终都要转化为这些Command的insert、delete、select和update操作

(1)、select操作

   this.odbcDataAdapter1.SelectCommand.CommandText="select * from userinfo order by id";
   this.odbcDataAdapter1.Fill(this.dataSet1,"userinfo");
   DataColumn[] column=new DataColumn[]{this.dataSet1.Tables["userinfo"].Columns["id"]};
   this.dataSet1.Tables["userinfo"].PrimaryKey =column;//为表设置主键
   this.mydg.DataSource=this.dataSet1.Tables[0].DefaultView;
   this.button1.Enabled=false;
   Console.WriteLine(this.dataSet1.Tables[0].Rows.Count);//统计多少行
   Console.WriteLine(this.dataSet1.Tables[0].Rows[0][0]);//[行][列]

(2)、insert操作

   System.Data.DataRow row=this.dataSet1.Tables["userinfo"].NewRow();//首先内存要有Table["userinfo"]存在
   row["id"]=this.textBox1.Text;
   row["userName"]=this.textBox2.Text;
   row["userPw"]=this.textBox3.Text;
   this.dataSet1.Tables["userinfo"].Rows.Add(row);//增加一行
   this.odbcDataAdapter1.Update(this.dataSet1,"userinfo");//调用odbcDataAdapter1中InsertCommand(InsertCommand在设计时要配置好connection和commandText)

(3)、update操作

   DataRow row=this.dataSet1.Tables["userinfo"].Rows.Find("1");
   row.BeginEdit();
   row["username"]="xmddl";
   row["userpw"]="xmddl";
   row.EndEdit();
   this.odbcDataAdapter1.Update(this.dataSet1,"userinfo");

(4)、delete操作,要完全删除一行,可使用 DataRow 对象的 Delete 方法。请注意,Rows 集合包含 RemoveRemoveAt 两个方法,它们似乎删除了行,但实际上只是将行从集合中移除。只有 Delete 方法才会将删除结果发回源数据库中。

   DataRow row=this.dataSet1.Tables["userinfo"].Rows.Find(cID);
   row.Delete();
   int i=this.odbcDataAdapter1.Update(this.dataSet1,"userinfo");

可以使用 DataView 在基础表中添加、删除或修改数据行。通过设置 DataView 的三个布尔值属性之一,可以控制使用 DataView 修改基础表数据的能力。这些属性为 AllowNewAllowEditAllowDelete。默认情况下,它们设置为 true

如果 AllowNewtrue,则可以使用 DataViewAddNew 方法来创建新的 DataRowView。请注意,在调用 DataRowViewEndEdit 方法之前,新行实际上不会添加到基础 DataTable 中。如果调用 DataRowViewCancelEdit 方法,则将丢弃新行。另请注意,一次只能编辑一个 DataRowView。如果在存在挂起行时调用 DataRowViewAddNewBeginEdit 方法,则会对该挂起行隐式调用 EndEdit。当调用 EndEdit 时,更改将应用于基础 DataTable,并且随后可以使用 DataTableDataSetDataRow 对象的 AcceptChangesRejectChanges 方法来提交或拒绝更改。如果 AllowNewfalse,则当调用 DataRowViewAddNew 方法时,将引发异常。

如果 AllowEdittrue,可以通过 DataRowView 来修改 DataRow 的内容。您可以使用 DataRowView.EndEdit 确认对基础行的更改,或使用 DataRowView.CancelEdit 拒绝更改。请注意,一次只能编辑一行。如果在存在挂起行时调用 DataRowViewAddNewBeginEdit 方法,则将对挂起行隐式调用 EndEdit。当调用 EndEdit 时,建议更改将放置在基础 DataRowCurrent 行版本中,随后可以使用 DataTableDataSetDataRow 对象的 AcceptChangesRejectChanges 方法来提交或拒绝这些更改。如果 AllowEditfalse,则当试图修改 DataView 中的值时,将引发异常。

当编辑现有 DataRowView 时,仍将引发基础 DataTable 的事件,并提供建议更改。请注意,如果对基础 DataRow 调用 EndEditCancelEdit,那么无论是否对 DataRowView 调用 EndEditCancelEdit,都将应用或取消挂起的更改。

如果 AllowDeletetrue,则可以使用 DataViewDataRowView 对象的 Delete 方法删除 DataView 中的行,这些行也将从基础 DataTable 中删除。随后可以分别使用 AcceptChangesRejectChanges 来提交或拒绝删除。如果 AllowDeletefalse,当调用 DataViewDataRowViewDelete 方法时,将引发异常。

以下代码示例禁用通过 DataView 删除行的功能,并使用 DataView 向基础表中添加新行。

[C#]
DataTable custTable = custDS.Tables["Customers"];
DataView custView = custTable.DefaultView;
custView.Sort = "CompanyName";

custView.AllowDelete = false;

DataRowView newDRV = custView.AddNew();
newDRV["CustomerID"] = "ABCDE";
newDRV["CompanyName"] = "ABC Products";
newDRV.EndEdit();

 

DataView 公开可枚举的 DataRowView 对象集合。DataRowView 对象将值公开为 object 数组,这些数组按基础表中列的名称或序号引用来编制索引。可以使用 DataRowViewRow 属性来访问由 DataRowView 公开的 DataRow

当使用 DataRowView 查看值时,DataViewRowStateFilter 属性将确定公开基础 DataRow 的哪一个行版本。
[C#]
  DataView catView = new DataView(catDS.Tables["Categories"]);

  Console.WriteLine("Current Values:");

  WriteView(catView);

  Console.WriteLine("Original Values:");

  catView.RowStateFilter = DataViewRowState.ModifiedOriginal;

  WriteView(catView);

public static void WriteView(DataView myView)
{
  foreach (DataRowView myDRV in myView)
  {
    for (int i = 0; i < myView.Table.Columns.Count; i++)
      Console.Write(myDRV[i] + "/t");
    Console.WriteLine();
  }
}

你可能感兴趣的:(DataSet)