let it be
行到水穷处 坐看云起时

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作为成员添加到一个DataSetTables集合中后,不能再将其添加到任何其他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添加到DataSetTables集合中。实现代码如下所示:

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方法将接受可选的ColumnNameDataType参数,并将创建新的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       CustIDCustLNameCustFNamePurchases:数据表Customers中的列名。

8.4.3  设置DataTable数据表的主键

数据库开发的一个通常规则就是表至少得有一个列作为主键。主键约束用于惟一标识给定表中的一条记录()。假设现在需要新建一个DataColumn列来表示EmpID字段并且要将这个列将作为表的主键,它必须有AllowDBNullUnique属性,实现代码如下所示:

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  设置列的数据类型

通过上面8.4.2节的学习已经知道怎么向新建的数据表中添加列了,那么下面来看一看,怎么为添加的列设置列的数据类型。数据类型是标明一列数据的数据类型属性,根据不同的需要可以在DataTable数据表中建立不同的列,并可以为不同的列设置不同的数据类型,来满足需要。继续上面Customers表的例子,为创建的列添加数据类型:

实现代码如下所示:

//创建一个数据表Customers

DataTable CustomersTable = new DataTable("Customers");

//创建一个Int32类型名称是CustID列,把这个列设置成主键,并且不允许为空,

DataColumn CustomersCol = CustomersTable.Columns.Add("CustID", typeof(Int32));

CustomersCol.AllowDBNull = false;

CustomersCol.Unique = true;

//创建三个String类型的列CustLNameCustFNamePurchases

CustomersTable.Columns.Add("CustLName", typeof(String));

CustomersTable.Columns.Add("CustFName", typeof(String)));

CustomersTable.Columns.Add("Purchases", typeof(String)));

代码说明:

示例中用于CustID列定义为表的主键列。CustID列指定的数据类型是Int32CustLName列、CustFName列、Purchases列指定的数据类型都是String的列,当然也可以不设置列的数据类型,在这个时候DataColumnDataType属性默认为字符串类型,当然可以根据需要在创建列名时进行列数据类型的设置。

8.4.5  启用Autoincrementing字段

8.4.4节中学会了如何设置DataColumn列的数据类型,在设置完DataColumn列的数据类型以后,也可以像SQL-Server数据库表一样把某一列设置成自动递增的。简单地说,自动增加列可以确保当一个新行被添加到给定表时,可以基于当前的递增步长值自动指定这个列的值。特别是某一列作为没有重复值得主键的时候,这个功能就特别有用。在DataTable这个功能可以用AutoIncrement(列是否将列的值自动递增)AutoIncrementSeed(起始值,种子)AutoIncrementStep(步长)属性来控制。

下面是创建一个支持自动递增的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的列的步长

创建一个数据类型为Int32CustID列,为了能使这个字段的值实现自动增加的效果,把列AutoIncrement属性设置为true;把列得种子值AutoIncrementSeed定为0,也就是从0开始计数;同时设置自动增加的步长AutoIncrementStep1,每次增加一个。由于种子值被定为0,前面5个值应该是01234

可以往一个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的一系列数,结果如图:8.4.1所示的显示结果。

图:8.4.1

posted on 2007-06-27 10:02  流浪浪  阅读(1974)  评论(3编辑  收藏  举报