处理 DataTables






2.29/5 (25投票s)
您想了解的关于如何处理 DataTables 的一切。
必备组件
您必须对数据库中的表有一定的基本了解,例如唯一属性、主键、外键等的含义。
引言
在本文中,我将展示如何创建简单的数据表,如何将数据放入或存储在其中,以及如何根据您的需求逐行或逐列处理这些数据……
表,在其简单形式下,具有数据列和行,如下图所示。此表有 4 列和 3 行。您应该注意到它们是从 0 开始索引的,而不是像在开发环境中那样从 1 开始。
Col0 | Col1 | Col2 | Col3 |
Row0 | xxx | xxx | xxx |
Row1 | xxx | xxx | xxx |
Row2 | xxx | xxx | xxx |
创建新项目
打开 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;
非常感谢您的阅读,希望您喜欢这篇文章……
但阅读后,请不要忘记评价我的文章;这很重要……再次感谢……