惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
MongoDB | Blog
MongoDB | Blog
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
aimingoo的专栏
aimingoo的专栏
B
Blog
博客园 - 聂微东
博客园_首页
D
DataBreaches.Net
F
Fortinet All Blogs
小众软件
小众软件
M
MIT News - Artificial intelligence
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
F
Full Disclosure
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
腾讯CDC
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 【当耐特】
Simon Willison's Weblog
Simon Willison's Weblog
云风的 BLOG
云风的 BLOG
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
G
Google Developers Blog
B
Blog RSS Feed
Attack and Defense Labs
Attack and Defense Labs
W
WeLiveSecurity
N
News | PayPal Newsroom
Recent Announcements
Recent Announcements
AI
AI
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V2EX - 技术
V2EX - 技术
TaoSecurity Blog
TaoSecurity Blog
S
Security Affairs
Martin Fowler
Martin Fowler
Webroot Blog
Webroot Blog
P
Palo Alto Networks Blog
S
Schneier on Security
Latest news
Latest news

博客园 - Ewin

微信红包引流量攻略 贴吧论坛引流量案例纪实 新站4个月,新手做网站经验总结 盘点三个网络赚零花钱的小项目,傻瓜式操作 如何运营一个女性社区? 女性社区TOP10 微商怎么做月入过万?新手必看 DataTable对象在内存中的使用(二) CDATA的对特殊字符作用说明 CSS优先级及继承 Tab选项面板(不带图片版) 像素 像素深度 分辨率 三、数据库原理-设计 二、数据库原理-设计理论 一、数据库原理-绪论 如何理解 多个 exists sql(查询选修了全部课程的学生姓名) 内连接、左外连接、右外连接、交叉连接区别 group by 与 order by 软件开发升级指南(转)
DataTable对象在内存中的使用(一)
Ewin · 2010-07-30 · via 博客园 - Ewin

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所示的显示结果。


Ewin:梦想可以到达的地方,网络就可以做到-开放、平等、自由、充满激情......