关于DataRow和DataColumn的一点个人简单理解
2024-07-21 02:23:18
供稿:网友
中国最大的web开发资源网站及技术社区,
ps:其实这个放在这里只是当作一个我对于自己不懂的地方所作的一个记录而已。如果有什么错误的或者不当的地方欢迎大家指正。
关于datarow和datacolumn,其实就是datatable的行与列,作为datatable的两个集合元素存在,用类似于坐标系里x与y的方法确定唯一的表值。
本来以为两个都是同等性质的,不过无意中的问题说明了它们不是单纯的差不多。
使用sql语句建立表,但忘记了写进内容:create table testtable(id int primary key,description char(30));然后用datareader当然什么都不会返回。
用vs.net 2003的server explorer查看表,并没提示错误。有列,但没有行内容,也就是说这样的“空表”是可以存在的。那试着换一下sql语句:create table testtable;或者create table testtable();都提示语法错误。由此可见作为表的基础是列。
又由datareader的工作方式来看,是个以行为元素遍历的过程,其中的数据成员是依列进行分组,输出也就是两个嵌套的循环:
foreach (datarow i in dt.rows)
{
foreach (datacolumn j in dt.columns)
{
console.write("/t{0}",i[j]);
}
console.writeline();
}
所有行都以列为结构,其实访问其实是在访问行,列只是制定其数据所在的位置名称,可以抽象成这样:
struct row
{
type column_1;
type column_2;
...
type column_n;
}
由此引出了一个建立在上面的问题:行与列在表里的添加。
1.datarow的添加
比较常规,就是添加元素而已,可以看作是把上面的row[]添加一个元素。
具体方法大概如下:
datarow newrow=dt.newrow(); //调用datatable dt方法newrow()声明建立一个新行,得到一个datarow实例
...
newrow["(column name...)"]="..."; //为datarow写入数据
...
dt.rows.add(newrow); //添加进dt
这样就完了。
2.datacolumn的添加
似乎也简单。事实上却是dt里并没有newcolumn()这个方法。
两种思路:
a.在sql里面内建,这种思路在这里暂时不讨论,有兴趣的可以试一下;
b.在程序里面找到类似的add()方法调用;
这里有必要说明一下datacolumn和datacolumncollection两个类的关系:
实际上表建立框架的是datacolumncollection,是datacolumn的一个集合,包含一组column对象,也就是说,要为表添加一列,需要在表框架的datacolumncollection上调用add()方法而不是在dt上添加作为遍历的元素,因为列独立出来其实也是以行->列的方式遍历的。思路有了,于是具体实现如下:
datacolumncollection dcc=ds.tables["employees"].columns; //dataset ds,返回datacolumncollection对象集合
datacolumn newcolumn=new datacolumn(); //建立一个新列
newcolumn=dcc.add("fullname",system.type.gettype("system.string"),"firstname+' '+lastname"); //向表employees里插入列,在这里用的是datacolumncollection.add(string columnname,type columntype,string expression)方法插入列,这里的expression是指的建立的新列的值建立规则
至此,列插入结束。
作为一个小小的讨论,datarow和datacolumn这样简单介绍一下,希望能对大家有点帮助。