关于Dataset批量更新数据的实例方法
帮同学做个小东西,某局的案件登记表(Excel表)。我同学是专门负责维护该表的,数据量一大就不好查询,而且查询定位不精确,所以该同学就委
托我给他做个小数据库系统。要求,1:能将现有的Excel数据导入数据(想偷懒),2:方便查询。就这么两个功能,我很爽快地答应了。(主要讲Excel导入)于是该同学
就将登记表发给我,打开一看,靠,这么多字段,如果写Sql语句插入或更新的话那还不把我折腾死啊,而且还容易出错。我想了下不能用硬写SQL语句
这种方法,而且还要判断记录是否存在,很烦人。我想了下之前看过关于DataSet批量更新数据的方法,再回顾回顾。研究了一番用DataSet批量更新
数据是可行的,而且也能节约写SQL的时间。在网上搜了一番,都没有能实际解决问题的现成方法,都是有这样或那样的问题,于是我就一边在网上
求救一边看MSDN帮助文档终于解决啦,现将方法分享出来,希望能有所帮助,我会在方法中写上注释的,有不明白的请给我留言。
注:数据库用的是Access。

/// <summary>
/// 更新DataSet数据至数据库中,注意数据表结构必须与Exel结构相同
/// </summary>
/// <param name="ds">ds盛放从Excel表中读取的数据</param>
/// <param name="sql">用于查询数据库记录的语句</param>
/// <returns></returns>
public static bool UpdataDataSet(DataSet ds, string sql)
{
using (OleDbConnection connection = new OleDbConnection(PubConstant.ConnectionString))
{
connection.Open();
DataTable tempDT = new DataTable();
//创建适配器
OleDbDataAdapter dap = new OleDbDataAdapter(sql, connection);
//创建 用于更改与关联数据库的单表命令
OleDbCommandBuilder cb = new OleDbCommandBuilder(dap);
//以下两处的[ ] 最好加上,否则可能会出现莫名的错误,就相当于给字段名、或表名加[]
cb.QuotePrefix = "[";
cb.QuoteSuffix = "]";
try
{
//装载,根据SQL语句从数据库里读来数据,
dap.Fill(tempDT);
//设置DataTable主键字段
tempDT.PrimaryKey = new DataColumn[] { tempDT.Columns["勘验号"] };
//取DataSet中表1的数据,此处的dsTable是用于盛放从Excel表中读出的数据
DataTable dsTable = ds.Tables[0];
//遍历dsTable中的每一行数据
foreach (DataRow dr in dsTable.Rows)
{
//在tempDT中查找数据库中是否已经存在该条数据
DataRow modyRow = tempDT.Rows.Find(dr["勘验号"]);
//如果数据库已经存在该行,则修改记录,不进行插入
if (modyRow != null)
{
//设置该行记录为“已修改”状态,次操作必须。
tempDT.Rows.Find(dr["勘验号"]).SetModified();
//重新给该记录赋值
tempDT.Rows.Find(dr["勘验号"]).ItemArray = dr.ItemArray;
}
else
{
//新增
tempDT.Rows.Add(dr.ItemArray);
}
}
//执行操作,这样就不用写SQL语句,它自己会操作
dap.Update(tempDT);
return true;
}
catch (Exception ex)
{
Console.Write(ex.Message);
return false;
}
}
}
/// 更新DataSet数据至数据库中,注意数据表结构必须与Exel结构相同
/// </summary>
/// <param name="ds">ds盛放从Excel表中读取的数据</param>
/// <param name="sql">用于查询数据库记录的语句</param>
/// <returns></returns>
public static bool UpdataDataSet(DataSet ds, string sql)
{
using (OleDbConnection connection = new OleDbConnection(PubConstant.ConnectionString))
{
connection.Open();
DataTable tempDT = new DataTable();
//创建适配器
OleDbDataAdapter dap = new OleDbDataAdapter(sql, connection);
//创建 用于更改与关联数据库的单表命令
OleDbCommandBuilder cb = new OleDbCommandBuilder(dap);
//以下两处的[ ] 最好加上,否则可能会出现莫名的错误,就相当于给字段名、或表名加[]
cb.QuotePrefix = "[";
cb.QuoteSuffix = "]";
try
{
//装载,根据SQL语句从数据库里读来数据,
dap.Fill(tempDT);
//设置DataTable主键字段
tempDT.PrimaryKey = new DataColumn[] { tempDT.Columns["勘验号"] };
//取DataSet中表1的数据,此处的dsTable是用于盛放从Excel表中读出的数据
DataTable dsTable = ds.Tables[0];
//遍历dsTable中的每一行数据
foreach (DataRow dr in dsTable.Rows)
{
//在tempDT中查找数据库中是否已经存在该条数据
DataRow modyRow = tempDT.Rows.Find(dr["勘验号"]);
//如果数据库已经存在该行,则修改记录,不进行插入
if (modyRow != null)
{
//设置该行记录为“已修改”状态,次操作必须。
tempDT.Rows.Find(dr["勘验号"]).SetModified();
//重新给该记录赋值
tempDT.Rows.Find(dr["勘验号"]).ItemArray = dr.ItemArray;
}
else
{
//新增
tempDT.Rows.Add(dr.ItemArray);
}
}
//执行操作,这样就不用写SQL语句,它自己会操作
dap.Update(tempDT);
return true;
}
catch (Exception ex)
{
Console.Write(ex.Message);
return false;
}
}
}
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架