C#数据集应用大全
 
 
一、数据集基本应用
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++)
            {
               
              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(BindingSourcebindSource)
      {
          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());


二、数据集其它应用
1.其它
1.1指示DataTable中的字符串比较是否区分大小写
方式一:指示DataSet的CaseSensitive
          userDataSet.CaseSensitive = true;
          DataRow[] AryDR = userDataSet.Tables["users"].Select("CNAME ='yy'");
方式二:指示DataTable的CaseSensitive
          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;
          //Adda 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获取用于将表链接起来并允许从父表浏览到子表的关系的集合
方式一:利用DataSet的Relations
          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 表示形式
方式一:利用DataSet.GetXml();
MessageBox.Show(userDataSet.GetXml());
1.7获取或设置充当数据表主键的列的数组
方式一:设置DataTable.PrimaryKey
          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中,保留任何属性设置以及初始值和当前值
方式一:利用DataTable.ImportRow
          DataSet copyDS = new UserDataSet();
          copyDS.Tables["users"].ImportRow(userDataSet.Tables["users"].Rows[0]);
          MessageBox.Show(
copyDS.Tables["users"].Rows[0]["cname",DataRowVersion.Original]
+ " " +
         
1.10查找和更新特定行。如果找不到任何匹配行,则使用给定值创建新行
方式一:利用DataTable.LoadDataRow
          DataRow newRow = userDataSet.Tables["users"].NewRow();
          newRow["OID"] = 1;
          newRow["CNAME"] = "rename yy";
          newRow["SEX"] = "f";
          userDataSet.Tables["users"].BeginLoadData();
        
          DataRow row =userDataSet.Tables["users"].LoadDataRow(newRow.ItemArray,true);
          userDataSet.Tables["users"].EndLoadData();
1.11获取一个值,该值指示指定的列是否包含空值
方式一:利用DataRow.IsNull判断
          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
方式一:利用DataColumn.Caption
          //注意设置数据表的标题,并不会更新表格的列标题,可以考虑实现一公用方法同步表格标题
          userDataSet.Tables["users"].Columns["CNAME"].Caption = "标题";
1.14
方式一:利用DataSet.GetXmlSchema
MessageBox.Show(userDataSet.GetXmlSchema());
1.15
方式一:利用DataSet.InferXmlSchema
1.16
方式一:DataSet.ReadXml将 XML 架构和数据读入 DataSet。
方式二:DataSet.ReadXmlSchema将 XML 架构读入DataSet。
方式三:DataSet.WriteXml从 DataSet 写 XML数据,还可以选择写架构
方式四:DataSet.WriteXmlSchema写 XML 架构形式的 DataSet结构
1.17
方式一:DataSet.Reset
1.18
方式一:利用DataTable的Compute
         int result = (int) userDataSet.Tables["users"].Compute("MIN(OID)","");
         MessageBox.Show(result.ToString());