DataTable一些使用方法

C#DataTable一些使用方法

  1. 使用Select方法查找没有主键的表
    DataTable的Select方法返回一个DataRow数组,有四个重载的函数。

DataTable的细节

 

1、创建DataSet对象:

DataSet ds = new DataSet("DataSetName");

  1,使用DataTable必须要引用System.Data.

DataView prodView = new DataView(prodDS.Tables["Products"],
                                  "UnitsInStock <= ReorderLevel",
                                  "SupplierID, ProductName",
                                  DataViewRowState.CurrentRows);

DataTable是表格数据块在内存中的表示。虽然可以手动以编程形式构建一个DataTable,但通常使用DataSet和定义在System.Data.OleDb或System.Data.SqlClient命名空间中的类型,以动态获得一个DataTable。表A-7描述了DataTable中的一些核心属性。

 2、查看调用SqlDataAdapter.Fill创建的结构 

     da.Fill(ds,"Orders"); 

     DataTable tbl = ds.Table[0]; 

     foreach(DataColumn col in tbl.Columns) 

         Console.WriteLine(col.ColumnName);

  2,定义一个DataTable

  1. 使用Find方法查找有主键的表

表A-7  DataTable的属性

3、查看SqlDataAdapter返回的数据

DataTable dt=new DataTable();

分两种情况:

DataTable属性

意    义

CaseSensitive

表明表中的字符串比较是否区分大小写。默认的值为false

ChildRelations

返回DataTable的子关系(DataRelationCollection)的集合

Columns

返回属于这个表的列的集合

Constraints

获得表约束的集合(ConstraintCollection)

DataSet

获得包含这个表的DataSet

DefaultView

获得表的自定义视图,它可能包含已过滤的视图或游标位置

MinimumCapacity

获得或设置表中行的初始数目(默认为25)

ParentRelations

获得这个DataTable上的父关系的集合

PrimaryKey

获得或设置作为数据表主键的列数组

Rows

返回属于这个表的行集合

TableName

获得或设置表的名称。这个属性还可以被指定为构造函数的参数

图A-7可以帮助您更加清楚地了解DataTable的关键部分。要知道这并不是一个传统的类层次结构,说明类型之间is-a关系(例如,DataRow不是派生自DataRowCollection)。这个图只是显示了DataTable的核心项之间的has-a逻辑关系(例如,DataRowCollection有一些DataRow类型)。

①、DataRow对象

     DataTable tbl = ds.Table[0]; 

     DataRow row = tbl.Row[0]; 

     Console.WriteLine(ros["OrderID"]);

 3,为DataTable创建列

(1) 主键只有一个字段
DataRow dr = dt.Rows.Find("主键字段的值");

图片 1

图A-7  DataTable的集合

②、检查存储在DataRow中的数据 

     DataTable tbl = row.Table; 

     foreach(DataColumn col in tbl.Columns) 

         Console.WriteLine(row[col]);

//1.创建空列
DataColumn dc = new DataColumn();
dt.Columns.Add(dc);
//2.创建带列名和类型名的列
dt.Columns.Add("column0", typeof(String));
//3.通过列架构添加列
DataColumn dc = new DataColumn("column1", typeof(String));
dt.Columns.Add(dc);

(2) 主键有多个字段
例如,表的主键由一个整型字段ID和一个字符类型自动Name组成,以下代码查找满足ID=10且Name="张三"条件的记录。
Object[] objs = new Object[]{10,"张三"};
dr = dt.Rows.Find(objs);

构建一个完整的DataTable

现在您已经了解到最基础的东西,让我们来看一个完整的创建并操作内存中的数据表的例子。假设您想构建一个显示Cars数据库中当前存货的DataTable。这个Inventory表有4个列:CarID,Make,Color和PetName。同时,CarID列作为这个表的主键(PK)并支持自动递增。PetName列允许null值(很遗憾,并不是每个人都和我们一样喜爱自己的车)。图A-8显示了该表。

图片 2

图A-8  存货DataTable

整个过程将从创建一个新的DataTable类型开始。创建完这个类型后,可以把这个表的名称指定为构造函数的参数。可以用这个名称从所在DataSet引用这个表,如下所示:

// Create a new DataTable.

DataTable inventoryTable = new DataTable("Inventory");

下一步是以编程方式使用DataColumnCollection的Add()方法插入每列(使用DataTable.Columns属性访问)。下面的逻辑将CarID、Make、Color和PetName列添加到当前DataTable中(每列的基本数据类型使用DataType属性设置):

// DataColumn var.

DataColumn myDataColumn;

// Create CarID column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType("System.Int32");

myDataColumn.ColumnName = "CarID";

myDataColumn.ReadOnly = true;

myDataColumn.AllowDBNull = false;

myDataColumn.Unique = true;

// Set the autoincrement behavior.

myDataColumn.AutoIncrement = true;

myDataColumn.AutoIncrementSeed = 1000;

myDataColumn.AutoIncrementStep = 10;

inventoryTable.Columns.Add(myDataColumn);

// Create Make column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType("System.String");

myDataColumn.ColumnName = "Make";

inventoryTable.Columns.Add(myDataColumn);

// Create Color column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType("System.String");

myDataColumn.ColumnName = "Color";

inventoryTable.Columns.Add(myDataColumn);

// Create PetName column and add to table.

myDataColumn = new DataColumn();

myDataColumn.DataType = Type.GetType("System.String");

myDataColumn.ColumnName = "PetName";

myDataColumn.AllowDBNull = true;

inventoryTable.Columns.Add(myDataColumn);

在添加行之前,花点时间来设置一下表的主键。可以对需要设置的列设定DataTable.PrimaryKey属性。由于作为表主键的列可能不止一个,因此要知道PrimaryKey的属性需要一个DataColumn类型的数组。假设CarID列就是Invetory表主键的惟一组成部分,如下所示:

// Make the ID column the primary key column.

DataColumn[] PK = new DataColumn[1];

PK[0] = inventoryTable.Columns["CarID"];

inventoryTable.PrimaryKey = PK;

最后但相当重要的是,您需要往表中添加有效的数据。假设有一个合适的ArrayList保存Car类型,可以用如下的方式把它填充到表中:

// Iterate over the array list to make rows (remember, the ID is

// autoincremented).

foreach(Car c in arTheCars)

{

DataRow newRow;

newRow = inventoryTable.NewRow();

newRow["Make"] = c.make;

newRow["Color"] = c.color;

newRow["PetName"] = c.petName;

inventoryTable.Rows.Add(newRow);

}

为了显示新的本地内存表,假定有一个Windows Forms应用程序,包含一个显示DataGrid的主窗体。如第11章所示,DataSource属性用于把DataTable绑定到GUI上。输出结果如图A-9所示。

图片 3

图A-9  把DataTable绑定到DataGrid上

这儿通过指定要修改的列名称的字符串来添加行。当然还可以指定列的数字索引,在需要迭代每个列时,它特别有用。这样,前面的代码可以更新为如下的代码(得到同样的最终结果):

foreach(Car c in arTheCars)

{

// Specify columns by index.

DataRow newRow;

newRow = inventoryTable.NewRow();

newRow[1] = c.make;

newRow[2] = c.color;

newRow[3] = c.petName;

inventoryTable.Rows.Add(newRow);

}

③、检查DatTable中的DataRow对象 

             foreach(DataRow row in tbl.Rows) 

                 DisplayRow(row);

 4,为DataTable创建行

二、使用DataView筛选数据

1 操作DataTable:删除行

如果您想从数据表中删除一行该怎么做呢?我们可以调用DataRowCollection类型的Delete()方法。只要指定要删除行的索引(或者时DataRow)就可以。假设您已经按照图A-10更新了GUI。

图片 4

图A-10  从一个DataTable中删除行

如果您查看前面的图,就会注意到由于指定了DataTable的第二行,CarID1020就被删除掉了。下面新按钮的单击事件处理逻辑就是删除内存中DataTable表中的指定行。

// Remove this row from the DataRowCollection.

protected void btnRemoveRow_Click (object sender, System.EventArgs e)

{

try

{

inventoryTable.Rows[(int.Parse(txtRemove.Text))].Delete();

inventoryTable.AcceptChanges();

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

或许将这个Delete()方法命名为MarkedAsDeletable()更好一点,因为这一行只有到DataTable.AcceptChanges()方法调用后才会真正被删除。实际上,Delete()只是简单地设定一个标记表示“I am ready to die when my table tells me”。还要明白,如果有一行被标记为删除,那么DataTable可能会在AcceptChanges()调用之前拒绝这些修改,如下所示:

// Mark a row as deleted, but reject the changes.

protected void btnRemoveRow_Click (object sender, System.EventArgs e)

{

inventoryTable.Rows[txtRemove.Text.ToInt32()].Delete();

// Do more work. . .

inventoryTable.RejectChanges(); // Restore RowState.

}

4、校验DataSet中的数据

①、校验DataColumn的属性:ReadOnly,AllowDBNull,MaxLength,Unique 

②、DataTable对象的Constrains集合:UiqueConstraints,Primarykey,ForeignkeyConstraints 

通常不必刻意去创建ForeignkeyConstraints,因为当在DataSet的两个DataTable对象之间创建关系时会创建一个。 

③、用SqlDataAdapter.Fill模式来检索模式信息 

5、编写代码创建DataTable对象 

①、创建DataTable对象:DataTable tbl = new DataTable("TableName"); 

②、将DataTable添加到DataSet对象的Table集合 

     DataSet ds = new DataSet(); 

     DataTable tbl = new DataTable("Customers"); 

     ds.Tables.Add(tbl); 

  

     DataSet ds = new DataSet(); 

     DataTable tbl = ds.Tables.Add("Customers"); 

DataTable对象只能存在于至多一个DataSet对象中。如果希望将DataTable添加到多个DataSet中,就必须使用Copy方法或Clone方法。Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTable;Clone方法创建一个与原DataTable结构相同,但没有包含任何行的新DataTable。 

③、为DataTable添加列 

     DataTable tbl = ds.Tables.Add("Orders"); 

     DataColumn col =tbl.Columns.Add("OrderID",typeof(int)); 

     col.AllowDBNull = false; 

     col.MaxLength = 5; 

     col.Unique = true; 

     tbl.PrimaryKey = new DataColumn[]{tbl.Columns["CustomersID"]}; 

     当设置主键时,AllowDBNull自动设置为False; 

④、处理自动增量列 

     DataSet ds = new DataSet(); 

     DataTable tbl = ds.Tables.Add("Orders"); 

     DataColumn col = tbl.Columns.Add("OrderID",typeof(int)); 

     col.AutoIncrement = true; 

     col.AutoIncrementSeed = -1; 

     col.AutoIncrementStep = -1; 

     col.ReadOnly = true; 

⑤、添加基于表达式的列 

     tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice");

//1.创建空行
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
//2.创建空行
dt.Rows.Add();
//3.通过行框架创建并赋值
dt.Rows.Add("小明",18);//Add里面参数的数据顺序要和dt中的列的顺序对应 
//4.通过复制dt2表的某一行来创建
dt.Rows.Add(dt2.Rows[i].ItemArray);

DataView可以看成DataTable中的记录加上某种条件后得到的数据。DataView依附于DataTable,每个DataTable都至少有一个DataView。数据绑定中控件绑定到的其实不是DataTable,而是DataTable的DefaultView。

2 操作DataTable:应用过滤器和排序顺序

或许您想查看DataTable数据的一个子集,可以用一些过滤条件来指定。例如,如果您只想从这个内存中的Inventory表中看到某个牌子的汽车该怎么做呢?DataTable类上的Select()方法恰好提供了这个功能。再次更新您的GUI,这次允许用户指定一个字符串来表示他们感兴趣查看的车的牌子(图A-11)。

图片 5

图A-11  指定一个过滤器

这个Select()方法已经被重载多次,以提供不同的选择语义。传递给Select()的最基本参数可以是一个包含有某个条件操作的字符串。首先看一下新按钮的单击事件处理逻辑:

protected void btnGetMakes_Click (object sender, System.EventArgs e)

{

// Build a filter based on user input.

string filterStr = "Make='" txtMake.Text "'";

// Find all rows matching the filter.

DataRow[] makes = inventoryTable.Select(filterStr);

// Show what we got!

if(makes.Length = = 0)

MessageBox.Show("Sorry, no cars. . .", "Selection error!");

else

{

string strMake = null;

for(int i = 0; i < makes.Length; i )

{

DataRow temp = makes[i];

strMake = temp["PetName"].ToString() ""n";

}

MessageBox.Show(strMake, txtMake.Text " type(s):");

}

}

这儿,您首先建立一个基于相关的文本框值的过滤器条件。如果您指定BMW,那么过滤器条件就是Make = ‘BMW’。把这个过滤器发送给Select()方法后,就会得到一个DataRow类型的数组,这个数组表示了匹配每个符合过滤条件的行,如图A-12所示。

图片 6

图A-12  过滤后的数据

可以用很多相关的操作符组成一个过滤字符串。例如,如果想查找所有ID大于1030的车怎么做呢?您可以编写如下的代码(见图A-13的输出结果):

// Now show the pet names of all cars with ID greater than 1030.

DataRow[] properIDs;

string newFilterStr = "ID > '1030'";

properIDs = inventoryTable.Select(newFilterStr);

string strIDs = null;

for(int i = 0; i < properIDs.Length; i )

{

DataRow temp = properIDs[i];

strIDs = temp["PetName"].ToString()

" is ID " temp["ID"] ""n";

}

MessageBox.Show(strIDs, "Pet names of cars where ID > 1030");

图片 7

图A-13  指定一个数据范围

模拟标准SQL语法编写过滤逻辑。为了验证这一点,假设想根据pet名称的字母顺序来获得前面Select()命令的结果。在SQL术语中,这会被解释为基于PetName列进行排序。幸运的是,Select()方法已经被重载过,它可以传递一个排序条件,如下所示:

makes = inventoryTable.Select(filterStr, "PetName");

这样会返回图A-14所示的信息。

图片 8

图A-14  已排序的数据

如果您想用降序来对结果排序,调用Select(),如下所示:

// Return results in descending order.

makes = inventoryTable.Select(filterStr, "PetName DESC");

一般来说,排序字符串是列名后跟着“ASC”(升序,默认设置)或“DESC”(降序)。如果需要的话,可以用逗号来把多个列分开排序。

6、修改DataTable内容

①、添加新DataRow 

     DataRow row = ds.Tables["Customers"].NewRow(); 

     row["CustomerID"] = "ALFKI"; 

     ds.Tables["Customers"].Rows.Add(row); 

  

     object[] aValues ={"ALFKI","Alfreds","Anders","030-22222"}; 

     da.Tables["Customers"].LoadDataRow(aValues,false); 

②、修改当前行 

修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改。 

DataRow rowCustomer; 

rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON"); 

if(rowCustomer == null) 

//没有查找客户 

else 

rowCustomer["CompanyName"] ="NewCompanyName"; 

rowCustomer["ContactName"] ="NewContactName"; 

//推荐使用这种方式 

DataRow rowCustomer; 

rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON"); 

if(rowCustomer == null) 

//没有查找客户 

else 

rowCustomer.BeginEdit(); 

rowCustomer["CompanyName"] ="NewCompanyName"; 

rowCustomer["ContactName"] ="NewContactName"; 

rowCustomer.EndEdit(); 

//null表示不修改该列的数据 

obejct[] aCustomer ={null,"NewCompanyName","NewContactName",null} 

DataRow rowCustomer; 

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); 

rowCustomer.ItemArray = aCustomer; 

③、处理DataRow的空值 

//查看是否为空 

DataRow rowCustomer; 

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); 

if(rowCustomer.IsNull("Phone")) 

Console.WriteLine("It's Null"); 

else 

Console.WriteLine("It's not Null"); 

//赋予空值 

rowCustomer["Phone"] = DBNull.Value; 

④、删除DataRow 

DataRow rowCustomer; 

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); 

rowCustomer.Delete(); 

⑤、清除DataRow 

DataRow rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); 

rowCustomer.ItemArray = aCustomer; 

da.Tables["Customers"].Remove(rowCustomer); 

或者 

ds.Tables["Customers"].RemoveAt(intIndex); 

⑥、使用DataRow.RowState属性 :Unchanged,Detached,Added,Modified,Deleted 

private void DemonstrateRowState() 

{ // Run a function to create a DataTable with one column. DataTable myTable = MakeTable();DataRow myRow; 

// Create a new DataRow. myRow = myTable.NewRow();// Detached row. Console.WriteLine("New Row " myRow.RowState); 

myTable.Rows.Add(myRow);// New row. Console.WriteLine("AddRow " myRow.RowState); 

myTable.AcceptChanges();// Unchanged row. Console.WriteLine("AcceptChanges " myRow.RowState); 

myRow["FirstName"] = "Scott";// Modified row. Console.WriteLine("Modified " myRow.RowState); 

myRow.Delete();// Deleted row. Console.WriteLine("Deleted " myRow.RowState);} 

⑦、检查DataRow中的挂起更改 

DataRow rowCustomer; 

rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); 

rowCustomer["CompanyName"] = "NewCompanyName"; 

string strNewCompanyName,strOldCompanyName; 

Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Current]); 

Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Original]);

 5,DataTable的取值和赋值

DataView常用的数据筛选方法有:

3 操作DataTable:更新行

您需要了解的关于DataTable的最后一个方面就是怎样用新值更新已有的行。一个方法就是先用Select()方法获得符合给定过滤条件的行。一旦获得这些DataRow,就对它们作相应的修改。例如,假定有一个新按钮在被单击后,搜索DataTable中所有Make为BMW的行。一旦标识这些项后,就可以把Make从“BMW”改为“Colt”。

// Find the rows you want to edit with a filter.

protected void btnChange_Click (object sender, System.EventArgs e)

{

// Build a filter.

string filterStr = "Make='BMW'";

string strMake = null;

// Find all rows matching the filter.

DataRow[] makes = inventoryTable.Select(filterStr);

// Change all Beemers to Colts!

for(int i = 0; i < makes.Length; i )

{

DataRow temp = makes[i];

strMake = temp["Make"] = "Colt";

makes[i] = temp;

}

}

这个DataRow类也提供了BeginEdit()、EndEdit()和CancelEdit()方法,这些方法可以在任何相关的验证规则被临时挂起时对一个行的内容进行编辑。在前面的逻辑中,每一行都用一个指派作了验证(而且如果从DataRow中捕获事件的话,这些事件会在每次修改时触发)。在对某个DataRow调用BeginEdit()时,这一行就被设置在编辑模式下。这时您可以根据需要来作些改动,并调用EndEdit()提交修改或者CancelEdit()把所作的修改回滚到原先的版本。例如:

// Assume you have obtained a row to edit.

// Now place this row in edit mode'.

rowToUpdate.BeginEdit();

// Send the row to a helper function, which returns a Boolean.

if( ChangeValuesForThisRow( rowToUpdate) )

{

rowToUpdate.EndEdit(); // OK!

}

else

{

rowToUpdate.CancelEdit(); // Forget it.

}

虽然您可以随意地对某一DataRow手动调用这些方法,但如果把一个DataGrid绑定到DataTable,这些成员就可以被自动地调用。例如,如果您想从DataGrid中选择一行进行编辑的话,该行就会自动处于编辑模式下。当把焦点换到另一行时,就会自动调用EndEdit()。为了测试这个行为,假设您已经手动地使用DataGrid把每个车更新为某个Make(图A-15)。

如果现在您想查询所有的BMW,消息对话框会正确地返回所有行,因为关联到这个DataGrid的底层DataTable已经被自动更新了(图A-16)。

图片 9             图片 10

图A-15  在DataGrid中编辑行                   图A-16  Inventory DataTable

 

如果我想限制取前面的50行,该怎么办呢?
DataRow[] properIDs;
string newFilterStr = "ID > '1030'";
properIDs = inventoryTable.Select(newFilterStr);
如果我想限制取前面的50行,该怎么办呢?

可以用SQL语句实现(select top 50 * from tabalName),最方便,
如果要用上面的方法,可以给DataTable中插入一个自增行(index),用它去判断.
也可以这样写.

    private DataTable SelectTop(int top, DataTable dt)
    {
        if (dt.Rows.Count < top) return dt;

        DataTable newTable = new DataTable();
        
        int columns = dt.Columns.Count;
        string[] col = new string[columns];

        //取得要筛选表的所有列名
        for (int c = 0; c < columns; c )
        {
            col[c] = dt.Columns[c].ColumnName;            
        }

        //创建新表的结构
        foreach (string columnName in col)
        {
            newTable.Columns.Add(columnName);
        }

        //选取所有行
        DataRow[] rows = dt.Select("1=1");
        DataRow newRow;
        for (int i = 0; i < top; i )
        {
            newRow = newTable.NewRow();
            foreach (string columnName in col)
            {
                newRow[columnName] = rows[i][columnName].ToString();
            }

            newTable.Rows.Add(newRow);
        }
        dt.Dispose();        
        return newTable;
    }

 

1、DataSet

//新建行的赋值
DataRow dr = dt.NewRow();
dr[0] = "小明";//通过索引赋值
dr["column1"] = DateTime.Now; //通过名称赋值
//对表已有行进行赋值
dt.Rows[0][0] = "小明"; //通过索引赋值
dt.Rows[0]["column1"] = DateTime.Now;//通过名称赋值
//取值
string name=dt.Rows[0][0].ToString();
string time=dt.Rows[0]["column1"].ToString();
  1. 筛选特定状态的行

①、属性

 CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。 

DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet".如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。 
DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False. 

HasErrors:表示DataSet中的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError属性设置为True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。 

NameSpace和Prefix:指定XML命名空间和前缀 

Relations:返回一个DataRelationCollection对象。 

Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。

 6,DataTable的筛选行和删除行

以下代码找出所有新加的行:
dv.RowStateFilter = DataViewRowState.Added;

②、方法

AcceptChanges和RejectChanges:接受或放弃DataSet中所有挂起更改。调用AcceptChanges时,RowState属性值为Added或Modified的所有行的RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。调用RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。 

Clear:清除DataSet中所有DataRow对象。该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快。 

Clone和Copy:使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet.使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。 

GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。 

GetXml和GetXmlSchema:使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串。如果只希望返回架构信息,可以使用GetXmlSchema. 

HasChange:表示DataSet中是否包含挂起更改的DataRow对象。 

Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。 

ReadXml和WriteXml:使用ReadXml方法从文件、TextReader、数据流或者XmlReader中将XML数据载入DataSet中。 

Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好。

//select用法
//筛选姓名列值中有"小"的行的集合(模糊查询),第二句可添加按年龄降序排序
DataRow[] dr = dt.Select("姓名 like '小%'");
DataRow[] drs = dt.Select("姓名 like '小%'", "年龄 DESC");
  1. 使用Sort属性,可以指定单个或多个列进行排序,如:
    dv.Sort = "Name ASC,ID DESC";

  2. 使用RowFilter属性动态筛选记录。
    dv.RowFilter = "Name LIKE '张%'";

  3. 使用Find和FindRows在DataView中查找。

③、事件

MergeFailed:在DataSet的Merge方法发生一个异常时触发。

//Compute用法

使用这两个方法,是按照行的排序关键字值来对行进行搜索的。

 2、DataTable

①、属性 

②、方法 

③、事件 

ColumnChanged:在列的内容被改变之后触发 

ColumnChangding:在列的内容被改变之前触发 

RowChanged,RowChanging,RowDeleted,RowDeleting. 

3、DataColumn 

①、属性 

4、DataRow 

①、属性 

HasError:确定行是否包含错误。 

Item:通过指定行的列数,列的名称或DataColumn对象本身,访问列的内容。 

ItemArray:获取或设置行中所有列的值。 

RowError:返回一个包含行错误信息的字符串。 

RowState:返回DataRowState枚举中的值来表示行的当前状态。 

Table:返回DataRow对象所在的DataTable. 

②、方法 

AcceptChanges和RejectChanges:提交和放弃挂起更改。 

BeginEdit、CancelEdit、EndEdit 

ClearErrors:清除DataRow中所有的错误。 

Delete:Delete方法实际上并不从DataRow表的Row集合中删除该DataRow.当调用DataRow对象的Delete方法时,ADO.NET将该行标记为删除,之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行。 

如果希望彻底删除DataRow,可以调用Delete方法,接着再调用它的AccepteChanges方法,还可以使用DataRowCollection对象的Remove方法完成相同的任务。

   Object result = dt.Compute("sum(成绩)", "年龄>16 and 姓名 like '小*'");

Find方法返回一个整数,表示匹配搜索条件的DataRowView的索引。如果多行匹配,只返回一个匹配行索引,如果未找到匹配项,返回-1。

3 如何遍历DataSet

foreach(DataTable dt in dataSet.Tables) 
foreach(DataRow dr in dt.Rows) 
foreach(DataColumn dc in dr.Table.Columns) 
Console.WriteLine(dr[dc]);

 

浅谈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中的其用法,参照MSDN 

DataRow dr=ds.Tables["Customers"].Rows.Find("aaa"); 
if(dr.IsNull("ContactName"); 
.. 
else 
dr["ContactName"]=DBNull.Value 
//这里判断ContactName列是否为空,如果不是则为其赋空值,呵,很无厘头的做法,这里只为演示为列赋空值的做法。

using System.Data; 
using System; 
using System.Windows.Forms; 
class DataT{ 
static DataTable dt;// = new DataTable(); 
static DataSet ds; 
static void method1(){ 
dt = new DataTable("Name"); 
ds = new DataSet(); 
dt.Columns.Add(new DataColumn("ID", typeof(Int32))); 
dt.Columns.Add(new DataColumn("Name", typeof(string))); 
dt.Columns.Add(new DataColumn("Sex", typeof(string))); 
dt.Columns.Add(new DataColumn("Addr", typeof(string))); 

static void add(int id,string name,string sex,string addr){ 
DataRow dr = dt.NewRow(); 
dr["id"] = id; 
dr["Name"] = name; 
dr["Sex"] = sex; 
dr["Addr"] = addr; 
dt.Rows.Add(dr); 


static void Main(){ 
DataT DT = new DataT(); 
method1(); 
add(100,"Join","Male","北京"); 
add(101,"Lily","feMale","北京"); 
add(102,"JIM","Male","北京"); 
ds.Tables.Add(dt); 
foreach(DataRow dr in dt.Rows){ 
//MessageBox.Show(dr["ID"].ToString() " " dr["Name"].ToString()

  • " " dr["Sex"].ToString() " "  
    // dr["Addr"].ToString(),"Message"); 
    Console.WriteLine(dr["ID"].ToString() " " dr["Name"].ToString()
  • " " dr["Sex"].ToString() " "  
    dr["Addr"].ToString()); 


try{ 
foreach(DataTable dt2 in ds.Tables) 
foreach(DataRow dr in dt2.Rows) 
Console.WriteLine(dr["ID"].ToString() " " dr["Name"].ToString()

  • " " dr["Sex"].ToString() " "  
    dr["Addr"].ToString()); 
    }catch(Exception ex){ 
    Console.WriteLine("dkfjksdjfk"); 


    }

 //result为计算出的结果,compute函数的第一个参数一般为聚合函数,后一个参数为筛选条件

若要返回匹配多个行的搜索结果,可以使用FindRows方法。它返回DataView中的所有匹配行的DataRowView数组。如果未找到匹配项,DataRowView数组为空。

 

若要使用Find或FindRows方法,必须通过将ApplyDefaultSort设置为true或通过使用DataView对象的Sort属性来指定排序顺序,否则将引发异常。这两种方法将一个值数组用做输入,该数组的长度与排序顺序包含的列数相匹配。当对多个列进行排序时,对象数组的值必须匹配在DataView的Sort属性中指定的列的顺序。

//Find用法

对具有单个列排序顺序的DataView调用Find方法。
dv.Sort = "Name";
int rowIndex = dv.Find("张三");
如果Sort属性指定多个列,则必须按照Sort属性指定的顺序为每个列传递包含搜索值的对象数组。
dv.Sort = "Name,ID";
DataRowView[] foundRows = dv.FindRows(new Object[]{"张%","001"});

dt.PrimaryKey = new DataColumn[] { dt.Columns["学号"] };

原文

 DataRow dr1 = dt.Rows.Find("004");

//Find用法要求datatable有主键,是一种按主键搜寻一行数据的方法

 

 

 

//删除行

//使用DataTable.Rows.Remove(DataRow)方法

dt.Rows.Remove(dt.Rows[0]);

//使用DataTable.Rows.RemoveAt(index)方法

dt.Rows.RemoveAt(0);

//使用DataRow.Delete()方法

dt.Row[0].Delete();

dt.AcceptChanges();

 

//-----区别和注意点-----

//Remove()和RemoveAt()方法是直接删除

//Delete()方法只是将该行标记为deleted,但是还存在,还可DataTable.RejectChanges()回滚,使该行取消删除。

//用Rows.Count来获取行数时,还是删除之前的行数,需要使用DataTable.AcceptChanges()方法来提交修改。

//如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows,而且不能用foreach进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。

for (``int i = dt.Rows.Count - 1; i >= 0; i--)

{

dt.Rows.RemoveAt(i);

}

 7,DataTable的复制和排序

 

//复制表,同时复制了表结构和表中的数据
DataTable dtNew = new DataTable();
dtNew = dt.Copy();

//克隆表,只是复制了表结构,不包括数据
DataTable dtNew = new DataTable();
dtNew = dt.Clone();

//排序
DataView dv = dt.DefaultView;//获取表视图
dv.Sort = "ID DESC";//按照ID倒序排序
dv.ToTable();//转为表

 

  

 

 

本文由星彩网app下载发布于计算机编程,转载请注明出处:DataTable一些使用方法

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。