显然,列的结构是一样的,但列名可以不一样。之所以会出现这个问题,是因为我从数据库中把表调出来显示在dataGridView中时,需要将英文列名改为对用户亲善的中文列名。同时,程序允许用户直接修改表,并可以更新至数据库。这时由于列名已经改过,更新会失败。有两种解决方法,一种是将列名再改回去,另一种是将中文列名表中的内容复制到英文列名表中去。实现上第二种方法相对简便。
假设英文列名表为DtEng,中文列名表为DtChi.则以下几条简单语句即可实现数据的复制。
DtEng.Clear();
foreach (DataRow row in DtChi.Rows)
{
dtEng.ImportRow(row);
}
用DtEng来更新数据库就没有问题了。
那用DataRowCollection.Add()方法可以吗?
DtEng.Clear();
foreach (DataRow row in DtChi.Rows)
{
dtEng.Rows.Add(row);
}
答案是不可以。当用datatable.NewRow()方法初始化的datarow的状态(rowstate)是detached,这种
datarow是
DataRowCollection.Add()唯一能接受的参数。
那用Datatable.Copy()方法可以吗?
DtEng = DtChi.Copy();
答案是不可以。Datatable.Copy()方法会复制结构和数据,这会导致两个表的列名也会相同,而我们这里只要求复制数据。
附上测试代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dt=new DataTable();
dt.Columns.Add("第一行");
dt.Columns.Add("第二行");
DataRow dr = dt.NewRow();
dr["第一行"]=1;
dr["第二行"]=2;
Console.WriteLine(dr.RowState.ToString());
try
{
dt.ImportRow(dr);
Console.WriteLine(dt.Rows[0][0].ToString());
}
catch
{
Console.WriteLine("dt.ImportRow(dr)运行后没有添加任何数据");
Console.WriteLine("DataTable的ImportRow()方法不能添加状态为Detached的行");
}
dt.Rows.Add(dr);
Console.WriteLine(dr.RowState.ToString());
dr["第二行"] = 3;
Console.WriteLine(dr.RowState.ToString());
DataTable dt2 = new DataTable();
dt2.Columns.Add("A");
dt2.Columns.Add("B");
Console.WriteLine(dt2.Columns[0].ColumnName.ToString());
try
{
dt2.Rows.Add(dr);
}
catch
{
Console.WriteLine("fali!");
}
dt2 = dt.Copy();
Console.WriteLine(dt2.Columns[0].ColumnName.ToString());
Console.ReadLine();
}
}
}
欢迎大家访问我的独立技术博客 道合|SameIdeal.com