• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
hambert
哪里有抱怨,哪里就有商机
博客园    首页    新随笔    联系   管理    订阅  订阅

表数据的批量插入

      当一个表要插入数据库时,手动编写sql插入语句是不太现实的,效率也比较低。

      我用的是SqlBulkCopy

View Code
        public void ExecuteTransactionScopeInsertEx(DataTable dt, string tableName)
        {
            using (SqlBulkCopy sbc = new SqlBulkCopy(Common.ConnStr, SqlBulkCopyOptions.UseInternalTransaction))
            {
                //服务器上目标表的名称   
                sbc.DestinationTableName = tableName;
                sbc.BatchSize = dt.Rows.Count;
                sbc.BulkCopyTimeout = 600;

                for (int i = 0, l = dt.Columns.Count; i < l; i++)
                {
                    //列映射定义数据源中的列和目标表中的列之间的关系   
                    sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                }

                sbc.WriteToServer(dt);
            }
        }

      如果表的列名与数据库的列名不能一一对应,则需重载上述方法

View Code
        public void ExecuteTransactionScopeInsertEx(DataTable dt, string tableName, string[] dbComlunName)
        {
            using (SqlBulkCopy sbc = new SqlBulkCopy(Common.ConnStr, SqlBulkCopyOptions.UseInternalTransaction))
            {
                //服务器上目标表的名称   
                sbc.DestinationTableName = tableName;
                sbc.BatchSize = dt.Rows.Count;
                sbc.BulkCopyTimeout = 600;

                for (int i = 0, l = dt.Columns.Count; i < l; i++)
                {
                    //列映射定义数据源中的列和目标表中的列之间的关系   
                    sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dbComlunName[i]);
                }

                sbc.WriteToServer(dt);
            }
        }

      如果需要自己指定控件的哪些列对应数据库的哪些列,则又需要重载

View Code
        public void ExecuteTransactionScopeInsertEx(DataTable dt, string tableName, string[] displayName, string[] dbComlunName)
        {
            using (SqlBulkCopy sbc = new SqlBulkCopy(Common.ConnStr, SqlBulkCopyOptions.UseInternalTransaction))
            {
                //服务器上目标表的名称   
                sbc.DestinationTableName = tableName;
                sbc.BatchSize = dt.Rows.Count;
                sbc.BulkCopyTimeout = 600;

                for (int i = 0, l = dt.Columns.Count; i < l; i++)
                {
                    //列映射定义数据源中的列和目标表中的列之间的关系   
                    sbc.ColumnMappings.Add(displayName[i], dbComlunName[i]);
                }

                sbc.WriteToServer(dt);
            }
        }

      这样子基本可以解决表的批量插入了。不过如果是修改而不是插入呢。我的做法是先将该表原来需要修改的数据全删除,再执行本方法。

      至于有更好的方法,我暂时还没有想到。。。还有这三个重载的方法如果归并为一个方法我也暂时没有想到很好的方法。。。

posted @ 2013-05-07 18:03  hambert  阅读(1171)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3