65.9K
CodeProject 正在变化。 阅读更多。
Home

处理 DataTables

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.29/5 (25投票s)

2006 年 1 月 14 日

CPOL

4分钟阅读

viewsIcon

56726

您想了解的关于如何处理 DataTables 的一切。

必备组件

您必须对数据库中的表有一定的基本了解,例如唯一属性、主键、外键等的含义。

引言

在本文中,我将展示如何创建简单的数据表,如何将数据放入或存储在其中,以及如何根据您的需求逐行或逐列处理这些数据……

表,在其简单形式下,具有数据列和行,如下图所示。此表有 4 列和 3 行。您应该注意到它们是从 0 开始索引的,而不是像在开发环境中那样从 1 开始。

Col0 Col1 Col2 Col3
Row0 xxx xxx xxx
Row1 xxx xxx xxx
Row2 xxx xxx xxx

创建新项目

Sample screenshot

打开 Visual Studio .NET,通过选择 File | New | Project 创建新项目,并将项目类型指定为 Visual C#,模板指定为 Windows Application。

从工具箱中拖放一个 "DataGrid" 并将其调整到您想要的大小。在窗体加载事件处理程序中,我们将编写代码来创建数据表,指定其列及其类型,指定表的唯一键并用数据填充表。之后,我们将检索该表的所有数据行到 datagrid 以在单元格中显示它。

让我们用代码来实现……

private void Form1_Load(object sender, System.EventArgs e)
{
    DataTable test=new DataTable("test1");
    
    test.Columns.Add("id",typeof(int));
    test.Columns.Add("Name",typeof(string));
    test.Columns.Add("tel",typeof(string)); 

    test.Columns["id"].Unique=true;
    test.PrimaryKey=new DataColumn[] {test.Columns["id"]}; 

    for(int j=0;j<=10;j++)
    {
        test.Rows.Add(new object[]{j,string.Format("Name{0}",
            j),string.Format("0{0}",405860313+j)});
    }
    test.AcceptChanges();

    //retrieving the data from table
    DataRow[] all=test.Select();

    DataRow[] rows=test.Select("id<5","Name DESC",
        DataViewRowState.CurrentRows);
    DataTable result=new DataTable();

    result.Columns.Add("id",typeof(int));
    result.Columns.Add("Name",typeof(string));
    result.Columns.Add("tel",typeof(string));

    foreach(DataRow r in rows)
        result.ImportRow(r);
        this.dataGrid1.DataSource=result;
}

分析源代码

现在让我们逐步分析代码;在第一行,我创建了一个 DataTable 类的实例,并将表名传递给构造函数。之后,我们应该构建该表的架构,因此我们添加 3 列:“id”,类型为“int”,“Name”,类型为“string”,以及“tel”,类型为“string”。

我们希望“id”是“唯一的”,即该字段中的所有数据都应该是唯一的,并且不应有冗余。然后在下一行代码中,我们将同一列设置为唯一键。

之后,您可以根据需要填充表中的数据。我使用一个简单的循环填充了表,在填充数据后,您应该提交或接受对表所做的更改(这里是填充表中的数据)。

从表中检索数据很简单。要检索表中的所有数据行,只需调用或调用“Select()”方法,并且不向其传递任何参数,但是如果您想根据特定条件检索表中的数据,您应该将这些条件传递给 Select 方法。

在这两种情况下,“Select”方法的结果都将作为数据行集合(一个或多个行)返回,并将结果检索到 DataRow[] 数组。

要检索表 "test" 中的所有数据行,请调用以下命令

DataRow[] all=test.Select();

要检索 ID 小于 5 且按降序排序的所有数据行,请将这些条件传递给 Select 方法,例如

DataRow[] rows=test.Select("id<5","id DESC",DataViewRowState.CurrentRows);

在将结果返回到 DataRow[] 数组后,您想将其显示在数据网格中,因此您将数据行复制到 DataRow 集合数组中;在这种情况下,您可以使用 foreach 循环将每行从 rows 集合复制并导入到表中。

foreach(DataRow r in rows)
    result.ImportRow(r);

之后,将数据网格的数据源指定为 "result" 表。

要获取特定的行和特定的字段,您可以编写类似这样的代码

Data_table_name[row_index].field_name

示例

string ss="First Student's Name: ";
ss+= this.dataSet11.Students[0].Name;
MessageBox.Show(ss);

上面的代码列表将字段 "name"(即学生的姓名)返回到第零行(即第一行)…… "name" 列的第一行。

要搜索主键行中的特定数据,您可以调用 Find() 方法。我尝试了以下代码来在 "Students" 表的主键 "id" 中搜索 id=212 ……

注意:我曾尝试将 "Name" 列作为 "Students" 表的主键,并尝试搜索特定名称,但出现了一个我无法解决的异常。如果有人有解决方案,请在此文章下方发帖……

int d="212";
if(dataSet11.Tables["Students"].Rows.Find(d)!= null)
    MessageBox.Show("Yes, Found 212 in id primary key field");
else
   MessageBox.Show("No, Not Found the value 212 in the id primary key field");

如果您将 ("id" + "Name") 作为数据库的主键,并尝试搜索 id=22 且 Name="Mohammad" 的数据行,即使记录确实存在且符合特定条件,您也不会得到正确的结果。

尝试以下方法,如果您能找到任何解决方案,请发布。

DataRow foundRow;
object[]Values = new object[2];
// Set the values of the keys to find.
Values[0] = "22";
Values[1] = "Mohammad";
foundRow=this.dataSet11.Students.Rows.Find(Values);
if(foundRow != null)
    MessageBox.Show("Yes");
else
    MessageBox.Show("No");

(将存储在 dataset 中的表中的数据复制到数据表中并显示。)

DataTable tt=new DataTable();

for(int t=0;t<dataSet11.Students.Columns.Count;t++)
tt.Columns.Add(dataSet11.Students.Columns[t].ColumnName);

DataRow[] rr=dataSet11.Students.Select();

foreach(DataRow r in rr)
{
    tt.ImportRow(r);
}
dataGrid1.DataSource=tt;

非常感谢您的阅读,希望您喜欢这篇文章……

但阅读后,请不要忘记评价我的文章;这很重要……再次感谢……

© . All rights reserved.