DataTable表示一个与内存有关的数据表,可以使用工具栏里面的控件拖放来创建和使用,也可以在编写程序过程中根据需要独立创建和使用,最常见的情况是作为DataSet的成员使用,在这种情况下就需要用在编程过程中根据需要动态创建数据表。那么在8.4节中主要讲用编码的方式来建立DataTable数据表以及对它的操作。
8.4.1 代码创建DataTable数据表
如上8.3节里面所讲,通过添加对象的方式直接在DataSet中创建数据表,可以通过使用Add方法将DataTable添加到DataSet中,这种是使用控件的可视化添加DataTable的操作,那么在代码中怎么来创建DataTable数据表呢?
在程序中创建DataTable对象可以使用相应的DataTable构造函数。创建一个表名为TableName的数据表,实现代码如下所示:
DataTable NewTable = new DataTable(TableName);
另外也可以通过以下方法创建DataTable对象:使用DataAdapter对象的Fill方法或FillSchema方法在DataSet中创建,这种方式都用于与数据库相连接操作的情况下。实现代码如下所示:
//数据库联接字符串
string connectionString =
"Data Source=local;Initial Catalog=Northwind;Integrated Security=True;UserID=sa;Password=";
//sql语句查询
string commandString = "Select * from Customers";
// 创建SqlDataAdapter对象,并执行sql命令
SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);
//创建数据集dataSet
DataSet dataSet = new DataSet();
//把数据表添加到数据集中
DataTable dataTable = dataSet.Tables("Customers");
//将数据填充到数据集中
dataAdapter.Fill(dataSet,"Customers");
注意:将一个DataTable作为成员添加到一个DataSet的Tables集合中后,不能再将其添加到任何其他DataSet的表集合中。
使用DataTable构造函数初次创建DataTable时,是没有架构(即结构,没有列)的。没有架构的DataTable数据表示没有办法使用的,因此要在使用这种DataTable数据表之前要定义表的架构,必须创建DataColumn对象并将其添加到表的Columns集合中。如何使用代码创建Columns列,将在本章后面几节中讲到。
创建DataTable时,不需要为TableName属性提供值,可以在其他时间指定该属性,或者将其保留为空,这些都不影响DataTable的使用。应该注意的是在将一个没有TableName值的表添加到DataSet中时,该表会得到一个从“Table”(表示Table0)开始递增的默认名称TableN。
以下示例创建DataTable对象的实例,并为其指定名称“Customers”。 实现代码如下所示:
DataTable workTable = new DataTable("Customers");
以下代码是将创建的DataTable实例Customers表添加到DataSet的Tables集合中。实现代码如下所示:
DataSet customers = new DataSet();
DataTable customersTable = customers.Tables.Add("CustomersTable");
或者
DataSet customers = new DataSet();
DataTable customersTable = new DataTable(“Customers”)
customers.Tables.Add(Customers);
8.4.2 用编程方式添加DataTable列
前面已经学过使用代码创建DataTable,但是使用DataTable构造函数初次创建 DataTable时,是没有架构(即结构,没有列)的。要定义表的架构,必须创建DataColumn 对象并将其添加到表的Columns集合中。也可以为表定义主键列,并且可以创建Constraint约束对象并将其添加到表的Constraints约束集合中。
DataColumn类型表示了DataTable上的一列。总的来说,绑定到某个DataTable的所有DataColumn类型的集合就表示一个表。
DataTable包含了由表的Columns属性引用的DataColumn对象的集合。这个列的集合与任何约束一起定义表的架构(即结构)。
通过使用DataColumn构造函数,或者通过调用表的Columns属性的Add方法,可在表内创建DataColumn对象。Add方法将接受可选的ColumnName、DataType参数,并将创建新的DataColumn作为集合的成员。它还会接受现有的DataColumn对象并会将其添加到集合中,并会根据请求返回对所添加的DataColumn的引用。
以下示例向DataTable中添加了四列。实现代码如下所示:
DataTable workTable = new DataTable("Customers");
DataColumn workCol = workTable.Columns.Add("CustID");
workTable.Columns.Add("CustLName");
workTable.Columns.Add("CustFName");
workTable.Columns.Add("Purchases");
代码说明:
q CustID,CustLName,CustFName,Purchases:数据表Customers中的列名。
8.4.3 设置DataTable数据表的主键
数据库开发的一个通常规则就是表至少得有一个列作为主键。主键约束用于惟一标识给定表中的一条记录(行)。假设现在需要新建一个DataColumn列来表示EmpID字段并且要将这个列将作为表的主键,它必须有AllowDBNull和Unique属性,实现代码如下所示:
DataTable workTable = new DataTable("Customers");
DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));
workCol.AllowDBNull = false;
workCol.Unique = true;
workTable.Columns.Add("CustLName", typeof(String));
workTable.Columns.Add("CustFName", typeof(String)));
workTable.Columns.Add("Purchases", typeof(String)));
代码说明:
示例中用于CustID列的属性设置为不允许DBNull值并将值约束为唯一。但是,如果将CustID列定义为表的主键列,AllowDBNull属性就会自动设置为false,并且Unique属性会自动设置为true。
8.4.4 设置列的数据类型
通过上面
实现代码如下所示:
//创建一个数据表Customers
DataTable CustomersTable = new DataTable("Customers");
//创建一个Int32类型名称是CustID列,把这个列设置成主键,并且不允许为空,
DataColumn CustomersCol = CustomersTable.Columns.Add("CustID", typeof(Int32));
CustomersCol.AllowDBNull = false;
CustomersCol.Unique = true;
//创建三个String类型的列CustLName,CustFName,Purchases
CustomersTable.Columns.Add("CustLName", typeof(String));
CustomersTable.Columns.Add("CustFName", typeof(String)));
CustomersTable.Columns.Add("Purchases", typeof(String)));
代码说明:
示例中用于CustID列定义为表的主键列。CustID列指定的数据类型是Int32,CustLName列、CustFName列、Purchases列指定的数据类型都是String的列,当然也可以不设置列的数据类型,在这个时候DataColumn的DataType属性默认为字符串类型,当然可以根据需要在创建列名时进行列数据类型的设置。
8.4.5 启用Autoincrementing字段
在
下面是创建一个支持自动递增的DataColumn列的例子。种子值用于标记列的起始值,步长值表示递增时增加种子值的数值,代码如下所示:
// 创建一个新列
DataColumn myColumn = new DataColumn();
myColumn.ColumnName = " CustID ";
myColumn.DataType = System.Type.GetType("System.Int32");
// 设置自动递增
myColumn.AutoIncrement = true;
myColumn.AutoIncrementSeed = 0;
myColumn.AutoIncrementStep = 1;
代码说明:
q AutoIncrement:列是否将列的值自动递增,true表示自动递增,false表示不能自动递增。
q AutoIncrementSeed:起始值种子值,AutoIncrement属性设置为true的列的起始值。
q AutoIncrementStep:步长,递增量,AutoIncrement属性设置为true的列的步长。
创建一个数据类型为Int32的CustID列,为了能使这个字段的值实现自动增加的效果,把列AutoIncrement属性设置为true;把列得种子值AutoIncrementSeed定为0,也就是从0开始计数;同时设置自动增加的步长AutoIncrementStep为1,每次增加一个。由于种子值被定为0,前面5个值应该是0、1、2、3和4。
可以往一个DataTable中添加这个DataColumn来测试一下。然后往这个表中添加一些新行,当然会自动转储CustID列中的值,代码如下所示:
//实现列自动增加功能
protected void Button1_Click(object sender, EventArgs e)
{
//创建一个新的数据列,名称:CustID ,数据类型:Int32.
DataColumn myColumn = new DataColumn();
myColumn.ColumnName = " CustID ";
myColumn.DataType = System.Type.GetType("System.Int32");
//把新创建的列设置自动增加,种子为0,增加步长为1.
myColumn.AutoIncrement = true;
myColumn.AutoIncrementSeed = 0;
myColumn.AutoIncrementStep = 1;
//把这个列添加到Customers表中.
DataTable CustomersTable = new DataTable("Customers");
myTable. CustomersTable.Add(myColumn);
//添加20个新行.
DataRow r;
for (int i = 0; i < 20; i++)
{
r = CustomersTable.NewRow();
CustomersTable.Rows.Add(r);
}
//显示每一行的数据值.
string temp = "";
DataRowCollection rows = CustomersTable.Rows;
for (int i = 0; i < CustomersTable.Rows.Count; i++)
{
DataRow currRow = rows[i];
temp += currRow["CustID "] + " ";
}
//在Label1面显示所有值
Label1.Text = Label1.Text+temp;
}
如果把上面代码写在建立的Web程序中,运行后点击“Button”按钮,就会得出初始值为0的步长为1的一系列数,结果如图:
图: