// Make a DataTable using the function below.
DataTable dt = MakeTableWithAutoIncrement();
DataRow relation;
// Declare the array variable.
object [] rowArray = new object[2];
// Create 10 new rows and add to DataRowCollection.
for(int i = 0; i <10; i++)
rowArray[0]=null;
rowArray[1]= "item " + i;
relation = dt.NewRow();
relation.ItemArray = rowArray;
dt.Rows.Add(relation);
PrintTable(dt);
private DataTable MakeTableWithAutoIncrement()
// Make a table with one AutoIncrement column.
DataTable table = new DataTable("table");
DataColumn idColumn = new DataColumn("id",
Type.GetType("System.Int32"));
idColumn.AutoIncrement = true;
idColumn.AutoIncrementSeed = 10;
table.Columns.Add(idColumn);
DataColumn firstNameColumn = new DataColumn("Item",
Type.GetType("System.String"));
table.Columns.Add(firstNameColumn);
return table;
private void PrintTable(DataTable table)
foreach(DataRow row in table.Rows)
foreach(DataColumn column in table.Columns)
Console.WriteLine(row[column]);
}异常:
DataRow.ItemArray 属性源代码实现:
public object[] ItemArray
int defaultRecord = this.GetDefaultRecord();
object[] array = new object[this._columns.Count];
for (int i = 0; i < array.Length; i++)
DataColumn dataColumn = this._columns[i];
array[i] = dataColumn[defaultRecord];
return array;
if (value == null)
throw ExceptionBuilder.ArgumentNull("ItemArray");
if (this._columns.Count < value.Length)
throw ExceptionBuilder.ValueArrayLength();
DataColumnChangeEventArgs dataColumnChangeEventArgs = null;
if (this._table.NeedColumnChangeEvents)
dataColumnChangeEventArgs = new DataColumnChangeEventArgs(this);
bool flag = this.BeginEditInternal();
for (int i = 0; i < value.Length; i++)
if (value[i] != null)
DataColumn dataColumn = this._columns[i];
if (-1L != this.rowID && dataColumn.ReadOnly)
throw ExceptionBuilder.ReadOnly(dataColumn.ColumnName);
if (dataColumnChangeEventArgs != null)
dataColumnChangeEventArgs.InitializeColumnChangeEvent(dataColumn, value[i]);
this._table.OnColumnChanging(dataColumnChangeEventArgs);
if (dataColumn.Table != this._table)
throw ExceptionBuilder.ColumnNotInTheTable(dataColumn.ColumnName, this._table.TableName);
if (-1L != this.rowID && dataColumn.ReadOnly)
throw ExceptionBuilder.ReadOnly(dataColumn.ColumnName);
if (this.tempRecord == -1)
this.BeginEditInternal();
object obj = (dataColumnChangeEventArgs != null) ? dataColumnChangeEventArgs.ProposedValue : value[i];
if (obj == null)
if (dataColumn.IsValueType)
throw ExceptionBuilder.CannotSetToNull(dataColumn);
obj = DBNull.Value;
int proposedRecordNo = this.GetProposedRecordNo();
dataColumn[proposedRecordNo] = obj;
catch (Exception e)
if (ADP.IsCatchableOrSecurityExceptionType(e) && flag)
this.CancelEdit();
throw;
this.LastChangedColumn = dataColumn;
if (dataColumnChangeEventArgs != null)
this._table.OnColumnChanged(dataColumnChangeEventArgs);
this.EndEdit();
DataRow对象有两个比较重要的属性,分别是行状态(RowState)和行版本(DataRowVersion),通过这两个属性能够有效的管理表中的行。下面简要的介绍一下行状态和行版本的特点和关系。ü 行状态(RowState):l UnChanged状态:指表中的行自创建之后没有做过任何改动的状态,或则是行在上次接受修改之后,至今未做过任何改动的状态。l
现在我们有一个简单的需求,一个DataRow里面1万列(创建它的DataTable有1万列),我们要把它增加一列并为这个Cell更新一个数据。
DataRow根本没有添加Column的的方法,我们自然而然会想到复制DataRow的方法。其实也可以一个cell一个cell地复制,但是我们发现可以通过DataRow的ItemArray一次性导入到新的DataRow。
请参看下面代码,我们定义了一个10列的DataTable,然后在添加一行数据时,动态把DataTable扩展到10000列,由于我们一开始的D
在操作DataRow的数据时,往往要给其中一列赋值。编程的时候发现用ItemArray直接赋值,或者用setValue,对应的DataRow中相应的列的值都没有变化。
DataRow dr;//省略了给dr赋值或者引用等的步骤
dr.ItemArray[4] = value;//该值为int型(虽然与问题无关)
dr.I...
下面两个方法是DataRow复制一行到另一个DataTable的,直接Add会出错“此行已属于另一个表”
每次要用到的时候还是犯糊涂,这次把它们记下来。
1.用DataRow.ItemArray
DataTable t=new DataTable();
DataRow r=t.NewRow();
r.ItemArray=oldRow.ItemArray;
t.Rows.Add(r);
我在开发一个C#项目中,有个需求就是将一个表中的一行数据,整条赋值到另一个表中,这时,会报一个System.ArgumentException:“该行已经属于另一个表。从其他地方找到了个方法,就是在赋值的那条数据后,加上个方法:ItemArray。ItemArray:通过数组获取或设置此行的所有值;
在对DataRow的所有字段赋值时,使用字段名进行逐列赋值效率较低。这时应尽量使用批量字段赋值。可以使用ItemArray或rows.Add方法:/ ds是数据集(DataSet)对象
DataTable dt = ds.Tables[0];
DataRow row = d...
来源:kroll在.net里,DataRow类型的对象是不支持序列化的,那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢?呵呵,幸好Datatable是支持序列化的。因此,我们可以自定义序列化的行为,并在序列化和反序列化的时候用Datatable来对DataRow进行包装和解包。为了自定义序列化行为,必须实现ISerializable接口。实现这个接口要实现 GetObjec...
这个需求的关键是:所要获取的DataRow对象的结构要和真实的数据库结构相同总体上分为俩个大方法:1———使用DataSet或者是DataTable自身的Load方法 和 DataAdapter的fill方法来获得在内存中创建完整的数据库模型,可以使用DataAdapter对象来创建。首先建立一个临时的空数据库,然后使用数据适配器对象中的fill方法进行数据填充,这样就获得了数据库的完整的...
在C#中的Datatable数据变量的操作过程中,有时候我们需要知道DataTable中是否含有数据行或者DataTable的数据总行数,此时我们就可以先拿到DataTable中的Rows属性对象,通过Rows属性对象的Count属性即可获取总行数。
例如我们我们有个DataTable变量为dt,需要通过C#获取该DataTable的总行数可使用下列语句:
introwCount = dt.Rows.Count;
一、C#获取该DataTable的总行数源程序