.NET中DataTable的用法

DataTable 是 ADO.NET 库中的核心对象。其他使用 DataTable 的对象包括 DataSetDataView

当访问 DataTable 对象时,注意它们是按条件区分大小写的。例如,如果一个 DataTable 被命名为"mydatatable",另一个被命名为"Mydatatable",则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果"mydatatable"存在而"Mydatatable"不存在,则认为该搜索字符串不区分大小写。有关使用 DataTable 对象的更多信息,请参见创建数据表。

如果正在以编程方式创建 DataTable,则必须先通过将 DataColumn 对象添加到 DataColumnCollection(通过 Columns 属性访问)中来定义其架构。有关添加 DataColumn 对象的更多信息,请参见在表中添加列。

若要向 DataTable 中添加行,必须先使用 NewRow 方法返回新的 DataRow 对象。NewRow 方法返回具有 DataTable 的架构的行,就像由该表的 DataColumnCollection 定义的那样。DataTable 可存储的最大行数是 16,777,216。有关更多信息,请参见将数据添至表中。

表的架构由 DataColumn 对象的集合 DataColumnCollection 定义。通过 Columns 属性访问 DataColumnCollection。有关定义表的架构的更多信息,请参见 DataColumnDataColumnCollection

DataTable 包含可用于确保数据完整性的 Constraint 对象的集合。有关更多信息,请参见将约束添加到表。

若要确定何时对表进行更改,请使用以下某个事件:RowChangedRowChangingRowDeletingRowDeleted。有关更多信息,请参见使用 DataTable 事件。

当创建 DataTable 的实例时,某些读/写属性将被设置为初始值。有关这些值的列表,请参见 DataTable 构造函数。

注意    DataSetDataTable 对象从 MarshalByValueComponent 继承而来,并支持用于远程处理的 ISerializable 接口。这些是仅有的可以远程处理的 ADO.NET 对象。
示例

[C#] 以下示例创建两个 DataTable 对象和一个 DataRelation 对象,并将这些新对象添加到 DataSet 中。然后通过调用 DataGrid.SetDataBinding 方法在 DataGrid 控件中显示这些表。

 

[C#]
// Put the next line into the Declarations section.
private System.Data.DataSet myDataSet;

private void MakeDataTables(){
    // Run all of the functions.
    MakeParentTable();
    MakeChildTable();
    MakeDataRelation();
    BindToDataGrid();
}

private void MakeParentTable(){
    // Create a new DataTable.
    System.Data.DataTable myDataTable = new DataTable("ParentTable");
    // Declare variables for DataColumn and DataRow objects.
    DataColumn myDataColumn;
    DataRow myDataRow;

    // Create new DataColumn, set DataType, ColumnName and add to DataTable.   
    myDataColumn = new DataColumn();
    myDataColumn.DataType = System.Type.GetType("System.Int32");
    myDataColumn.ColumnName = "id";
    myDataColumn.ReadOnly = true;
    myDataColumn.Unique = true;
    // Add the Column to the DataColumnCollection.
    myDataTable.Columns.Add(myDataColumn);

    // Create second column.
    myDataColumn = new DataColumn();
    myDataColumn.DataType = System.Type.GetType("System.String");
    myDataColumn.ColumnName = "ParentItem";
    myDataColumn.AutoIncrement = false;
    myDataColumn.Caption = "ParentItem";
    myDataColumn.ReadOnly = false;
    myDataColumn.Unique = false;
    // Add the column to the table.
    myDataTable.Columns.Add(myDataColumn);

    // Make the ID column the primary key column.
    DataColumn[] PrimaryKeyColumns = new DataColumn[1];
    PrimaryKeyColumns[0] = myDataTable.Columns["id"];
    myDataTable.PrimaryKey = PrimaryKeyColumns;

    // Instantiate the DataSet variable.
    myDataSet = new DataSet();
    // Add the new DataTable to the DataSet.
    myDataSet.Tables.Add(myDataTable);

    // Create three new DataRow objects and add them to the DataTable
    for (int i = 0; i<= 2; i++){
       myDataRow = myDataTable.NewRow();
       myDataRow["id"] = i;
       myDataRow["ParentItem"] = "ParentItem " + i;
       myDataTable.Rows.Add(myDataRow);
    }
}

private void MakeChildTable(){
    // Create a new DataTable.
    DataTable myDataTable = new DataTable("childTable");
    DataColumn myDataColumn;
    DataRow myDataRow;

    // Create first column and add to the DataTable.
    myDataColumn = new DataColumn();
    myDataColumn.DataType= System.Type.GetType("System.Int32");
    myDataColumn.ColumnName = "ChildID";
    myDataColumn.AutoIncrement = true;
    myDataColumn.Caption = "ID";
    myDataColumn.ReadOnly = true;
    myDataColumn.Unique = true;
    // Add the column to the DataColumnCollection.
    myDataTable.Columns.Add(myDataColumn);

    // Create second column.
    myDataColumn = new DataColumn();
    myDataColumn.DataType= System.Type.GetType("System.String");
    myDataColumn.ColumnName = "ChildItem";
    myDataColumn.AutoIncrement = false;
    myDataColumn.Caption = "ChildItem";
    myDataColumn.ReadOnly = false;
    myDataColumn.Unique = false;
    myDataTable.Columns.Add(myDataColumn);

    // Create third column.
    myDataColumn = new DataColumn();
    myDataColumn.DataType= System.Type.GetType("System.Int32");
    myDataColumn.ColumnName = "ParentID";
    myDataColumn.AutoIncrement = false;
    myDataColumn.Caption = "ParentID";
    myDataColumn.ReadOnly = false;
    myDataColumn.Unique = false;
    myDataTable.Columns.Add(myDataColumn);

    myDataSet.Tables.Add(myDataTable);
    // Create three sets of DataRow objects, five rows each, and add to DataTable.
    for(int i = 0; i <= 4; i ++){
       myDataRow = myDataTable.NewRow();
       myDataRow["childID"] = i;
       myDataRow["ChildItem"] = "Item " + i;
       myDataRow["ParentID"] = 0 ;
       myDataTable.Rows.Add(myDataRow);
    }
    for(int i = 0; i <= 4; i ++){
       myDataRow = myDataTable.NewRow();
       myDataRow["childID"] = i + 5;
       myDataRow["ChildItem"] = "Item " + i;
       myDataRow["ParentID"] = 1 ;
       myDataTable.Rows.Add(myDataRow);
    }
    for(int i = 0; i <= 4; i ++){
       myDataRow = myDataTable.NewRow();
       myDataRow["childID"] = i + 10;
       myDataRow["ChildItem"] = "Item " + i;
       myDataRow["ParentID"] = 2 ;
       myDataTable.Rows.Add(myDataRow);
    }
}

private void MakeDataRelation(){
    // DataRelation requires two DataColumn (parent and child) and a name.
    DataRelation myDataRelation;
    DataColumn parentColumn;
    DataColumn childColumn;
    parentColumn = myDataSet.Tables["ParentTable"].Columns["id"];
    childColumn = myDataSet.Tables["ChildTable"].Columns["ParentID"];
    myDataRelation = new DataRelation("parent2Child", parentColumn, childColumn);
    myDataSet.Tables["ChildTable"].ParentRelations.Add(myDataRelation);
}

private void BindToDataGrid(){
    // Instruct the DataGrid to bind to the DataSet, with the
    // ParentTable as the topmost DataTable.
    dataGrid1.SetDataBinding(myDataSet,"ParentTable");
}

关于DataTable的某些用法

/// <summary>
   /// 从DataTable里面复制数据到DataGrid、DataList,第一个参数是DataTalbe变量名,第二个参数是要复制的行数
   /// </summary>
   /// <param name="p_dtIn"></param>
   /// <param name="p_iRows"></param>
   /// <returns></returns>
   public static DataTable CopyRows(DataTable p_dtIn,int p_iRows)
   {
    DataTable dtOut;
    dtOut = p_dtIn.Clone();

    int iCount = p_dtIn.Rows.Count;
    int iCopy;
    if (iCount > p_iRows)
     iCopy = p_iRows;
    else
     iCopy = iCount;

    for(int i=0;i<iCopy;i++)
    {
     DataRow dr = p_dtIn.NewRow();
     dr = p_dtIn.Rows[i];

     DataRow drr = dtOut.NewRow();

     drr.ItemArray = dr.ItemArray;
     dtOut.Rows.Add(drr);
    }

    return dtOut;
   }
  
   /// <summary>
   /// 在DataTable里面添加一个新列并填充数据。
   /// </summary>
   /// <param name="p_dtIn"></param>
   /// <returns></returns>
   public static DataTable AddIndex(DataTable p_dtIn)
   {
    DataColumn myColumn = new DataColumn();
    myColumn.DataType = System.Type.GetType("System.Int16");
    myColumn.AllowDBNull = false;
    myColumn.Caption = "Idx";
    myColumn.ColumnName = "Idx";
    myColumn.DefaultValue = 0;
    p_dtIn.Columns.Add(myColumn);

    int iCount = p_dtIn.Rows.Count;
  
    for(int i=0;i<iCount;i++)
    {
     p_dtIn.Rows[i]["Idx"] = i + 1;
    }

    return p_dtIn;
   }

   /// <summary>
   /// 在DataTalbe里面添加一个新列并填充数据,并可以控制某一列数据的长度。
   /// </summary>
   /// <param name="p_dtIn"></param>
   /// <param name="p_strColunmName"></param>
   /// <param name="p_iLen"></param>
   /// <param name="bIf"></param>
   /// <returns></returns>
   public static DataTable AddIdxAndSetColumnLen(DataTable p_dtIn,string p_strColunmName,int p_iLen,bool bIf)
   {
    DataColumn myColumn = new DataColumn();
    myColumn.DataType = System.Type.GetType("System.Int16");
    myColumn.AllowDBNull = false;
    myColumn.Caption = "Idx";
    myColumn.ColumnName = "Idx";
    myColumn.DefaultValue = 0;
    p_dtIn.Columns.Add(myColumn);

    string strLoop;
    int iLen = p_iLen;
    string strLName;
    for(int i=0;i< p_dtIn.Rows.Count;i++)
    {
     p_dtIn.Rows[i]["Idx"] = i + 1;
     strLName = p_dtIn.Rows[i][p_strColunmName].ToString();
     if(strLName.Length > iLen)
     {
      strLoop = strLName.Substring(0,iLen);
      if(bIf != false)
       strLoop += "...";
      p_dtIn.Rows[i][p_strColunmName] = strLoop;
     }
    }

    return p_dtIn;
   }

   /// <summary>
   /// 在DATATABLE里面控制一列string数据的长度
   /// </summary>
   /// <param name="p_dtIn"></param>
   /// <param name="p_strColunmName">要控制的列名</param>
   /// <param name="p_iLen"></param>
   /// <param name="bIf"></param>
   /// <returns></returns>
   public static DataTable SetColumnLen(DataTable p_dtIn,string p_strColunmName,int p_iLen,bool bIf)
   {
    string strLoop;
    int iLen = p_iLen;
    string strLName;
    for(int i=0;i< p_dtIn.Rows.Count;i++)
    {
     strLName = p_dtIn.Rows[i][p_strColunmName].ToString();
     if(strLName.Length > iLen)
     {
      strLoop = strLName.Substring(0,iLen);
      if(bIf != false)
       strLoop += "...";
      p_dtIn.Rows[i][p_strColunmName] = strLoop;
     }
    }

    return p_dtIn;
   }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值