帮同学做个小东西,某局的案件登记表(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;
                }
            }
        }
      

作者: duncannjm 发表于 2011-03-01 12:37 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"