dataset 对象是支持 ado.net的断开式、分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个datatable的数据或者复制另一个datatabe中的数据或者是datarow的数据,但是只有dataset和datatable的复制是支持深层复制的,就是说不仅能复制元素的结构,而且能复制元素的数据,而datatdatarow没有相关的复制的方法,下面将简单介绍下这些数据元素的复制问题。
datatable sourcetable;
datatable objecttable;
datatdatarow sourcerow;
datatdatarow objectrow;
datarow temprow;
dataset soucedataset = new dataset();
复制dataset
dataset object = soucedataset.copy();//深复制
dataset object = soucedataset.clone();//浅复制,只复制架构
复制datatable
objecttable = sourcetable .copy();//深复制
objecttable = sourcetable .clone();//浅复制,只复制架构
复制datarow
项目开发中经常遇到这种错误-“此行已属于另一个表” 。导致这个错误的语句如下:
objecttable .rows.add(sourcedatarow);
分析了一下原因,因为datarow datatable 都是传引用调用的。所以一个行在一个表中了,就不能再增加到另外一个表。
具体方法:
1 importrow方法:public void importrow( datarow datarow);
objecttable = sourcetable.clone();//必须先复制表的架构,使具有相同的的列或关系!
foreach (datarow orow in sourcetable)
{
objecttable.importrow(orow);//在objecttable中添加一个新行,并将sourcerow的值复制进去,要求表的结构一样!
}
_____________________________________________________________________________________________________
2. 循环datatable的每个列
datarow adatarow = objecttable.newrow();
foreach(datacolumn adatacolumn in sourcetable.columns)
{
adatarow [adatacolumn.columnname] = sourcetable[i][adatacolumn.columnname];
}
objecttable.rows.add(adatarow);
3. 自定义复制
objecttable.columns.add ("id");//不需要有一样的架构,只复制自己需要的列!
object [] myarry = new object [1];
foreach (datarow orow in sourcetable)
{
temprow = objecttable.newrow();//此方法必须调用!
myarry[0] = orow["id"];//如果myarry中没有源表中的id列的话就会报错!
temprow.itemarray = myarry;//itemarray属性为object类型数组,根据程序的需要需要可自行复制多个列的数据!
objecttable.rows.add(temprow); //此方法必须调用,否则datarow中的数据将不能显示!
}
_____________________________________________________________________________________________________
4. loaddatarow方法:public datarow loaddatarow(object[] values,bool facceptchanges);
object[] newrow = new object[3];
// 设置对象数组的值
newrow[0] = "hello";
newrow[1] = "world";
newrow[2] = "two";
datarow myrow;
objecttable.beginloaddata();
// 将新行添加到表中
myrow = objecttable.loaddatarow(newrow, true);//标志要设置为true,表示添加新行
objecttable.endloaddata();
该方法比较复杂,如果只是简单的复制现有行的数据来添加新行的话建议不要采用,具体用法请参看sdk文挡。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号