c#中往mysql里批量插入上万条数据,有比较高效的方法吗?谢谢

时间:2023-01-15 23:24:43
小弟之前都没遇到过一下子插入几万条数据的问题。刚遇到这个问题在往上查到一篇文章,其中说到“IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了。....”
还给出了一段代码,如下
public interface IBatcherProvider : IProviderService
    {
        /// <summary>
        /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。
        /// </summary>
        /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
        /// <param name="batchSize">每批次写入的数据量。</param>
        void Insert(DataTable dataTable, int batchSize = 10000);
    }


我复制到vs2010下,直接提示找不到IProviderService 这个东西缺少命名空间,上网查了很久都不知道IProviderService是什么东西。是需要引入什么库吗?我项目中已经引入了MySql.Data.dll

一次性插入上万条,我估计循环插入10000次会很慢吧?有点想全部写成一条mysql语句,那这个语句异常的长,这样效率高吗?
比如
INSERT INTO TABLES (LABLE1,LABLE2,LABLE3,...) 
VALUES(NUM11,NUM12,NUM13,...), 
(NUM21,NUM22,NUM23,...),
....
(NUMn1,NUMn2,NUMn3,..);
谢谢!!

13 个解决方案

#1


对于mysql用事务操作,一次性插入,效率明显提升。
cmd.CommandText="sql语句";
cmd.ExeucteNonQuery();
反复执行上面2句,连接不要关。

#2


我觉得LINQ插入可能会高效一点
如果不考虑并发,倒是可以多线程LNGQ
最后检测完整性,遗漏通过自设自增字段就能检查到,补上就好

#3


BULK INSERT (Transact-SQL) :http://technet.microsoft.com/zh-cn/library/ms188365(v=sql.90).aspx

#4


一楼说的对!

#5


mysql效率好像大数据量咋都不行,你写进去了……读也是很慢的……上万条

#6


谢谢,我现在用了事务以及批量语句,刚才一次性插入10000多数据感觉挺快的,但是小弟又遇到个问题,c#中有什么函数或者什么办法知道数据插入的耗了多长时间吗?
我现在form程序执行插入后,我立即进入mysql就看到数据插入成功了。如果我不手动进入mysql,怎么样才知道插入已经完成?
最好能有个插入成功后的通知事件?

谢谢!!!!

#7


引用 6 楼 wwwww112233 的回复:
谢谢,我现在用了事务以及批量语句,刚才一次性插入10000多数据感觉挺快的,但是小弟又遇到个问题,c#中有什么函数或者什么办法知道数据插入的耗了多长时间吗?
我现在form程序执行插入后,我立即进入mysql就看到数据插入成功了。如果我不手动进入mysql,怎么样才知道插入已经完成?
最好能有个插入成功后的通知事件?

谢谢!!!!

既然没有抛出异常,你怎么知道没有成功?

另外,每当执行1000条DBCommand就提交(Commit)事务,然后再次开启事务,这样比较好。把过多的命令放在一个事务中,一旦超过物理内存分配限制,你的程序会变得很慢很慢。

#8


引用 7 楼 sp1234 的回复:
引用 6 楼 wwwww112233 的回复:谢谢,我现在用了事务以及批量语句,刚才一次性插入10000多数据感觉挺快的,但是小弟又遇到个问题,c#中有什么函数或者什么办法知道数据插入的耗了多长时间吗?
我现在form程序执行插入后,我立即进入mysql就看到数据插入成功了。如果我不手动进入mysql,怎么样才知道插入已经完成?
最好能有个插入成功后的通知事件?

……


谢谢!!
我现在主要是form界面有个search按钮,每当点下后,如果数据不存在后台线程就会自动联网读取数据保存到数据库中,再执行搜索功能。所以我希望能在几万条数据成功插入之后得到通知,我再执行搜索。
我的上万条数据,我用了mysql的批量插入语句,类似 insert into table1(id,name,email...)values(1,'a','asd@asd.com'),(2,'b',''...)
所以尽管一共几万数据,我做了一些分类,一共估计也就是100个insert语句。

#9


谢谢,我采用了bulk格式的mysql查询语句,另外加入了事务,在本机上运行起来很快,多得话一次性插入3--5万条,少的话1万条左右,感觉不到在占用时间。
我是c#代码是
/// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>sql2000数据库
        /// <param name="SQLStringList">多条SQL语句</param>
        public static void ExecuteSqlTran(List<string> SQLStringList)
        {
            using (MySqlConnection conn = new MySqlConnection(MySqlHelper.ConnStr))
            {
                conn.Open();
                MySqlCommand cmd = new MySqlCommand();
                cmd.Connection = conn;
                MySqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                        if (n > 0 && (n % 500 == 0 || n == SQLStringList.Count - 1))
                        {
                            tx.Commit();
                            tx = conn.BeginTransaction();
//原本是直接下面统一提交,听从sp1234的意见,就在这里重启事务,不知道这样写会不会/好,不过我这些写运行起来好像没问题。
                        }
                    }
                    //tx.Commit();
                }
                catch (System.Data.SqlClient.SqlException E)
                {
                    tx.Rollback();
                    throw new Exception(E.Message);
                }
            }
        }

谢谢大家

#10


解决方法写成博客了,欢迎指点
http://blog.csdn.net/wwwww112233/article/details/8562630

#11


想知道插入数据的时间,可以写日志

#12


楼主请问能否提供一个完整的例子呢?

#13


c#中往mysql里批量插入上万条数据,有比较高效的方法吗?谢谢

#1


对于mysql用事务操作,一次性插入,效率明显提升。
cmd.CommandText="sql语句";
cmd.ExeucteNonQuery();
反复执行上面2句,连接不要关。

#2


我觉得LINQ插入可能会高效一点
如果不考虑并发,倒是可以多线程LNGQ
最后检测完整性,遗漏通过自设自增字段就能检查到,补上就好

#3


BULK INSERT (Transact-SQL) :http://technet.microsoft.com/zh-cn/library/ms188365(v=sql.90).aspx

#4


一楼说的对!

#5


mysql效率好像大数据量咋都不行,你写进去了……读也是很慢的……上万条

#6


谢谢,我现在用了事务以及批量语句,刚才一次性插入10000多数据感觉挺快的,但是小弟又遇到个问题,c#中有什么函数或者什么办法知道数据插入的耗了多长时间吗?
我现在form程序执行插入后,我立即进入mysql就看到数据插入成功了。如果我不手动进入mysql,怎么样才知道插入已经完成?
最好能有个插入成功后的通知事件?

谢谢!!!!

#7


引用 6 楼 wwwww112233 的回复:
谢谢,我现在用了事务以及批量语句,刚才一次性插入10000多数据感觉挺快的,但是小弟又遇到个问题,c#中有什么函数或者什么办法知道数据插入的耗了多长时间吗?
我现在form程序执行插入后,我立即进入mysql就看到数据插入成功了。如果我不手动进入mysql,怎么样才知道插入已经完成?
最好能有个插入成功后的通知事件?

谢谢!!!!

既然没有抛出异常,你怎么知道没有成功?

另外,每当执行1000条DBCommand就提交(Commit)事务,然后再次开启事务,这样比较好。把过多的命令放在一个事务中,一旦超过物理内存分配限制,你的程序会变得很慢很慢。

#8


引用 7 楼 sp1234 的回复:
引用 6 楼 wwwww112233 的回复:谢谢,我现在用了事务以及批量语句,刚才一次性插入10000多数据感觉挺快的,但是小弟又遇到个问题,c#中有什么函数或者什么办法知道数据插入的耗了多长时间吗?
我现在form程序执行插入后,我立即进入mysql就看到数据插入成功了。如果我不手动进入mysql,怎么样才知道插入已经完成?
最好能有个插入成功后的通知事件?

……


谢谢!!
我现在主要是form界面有个search按钮,每当点下后,如果数据不存在后台线程就会自动联网读取数据保存到数据库中,再执行搜索功能。所以我希望能在几万条数据成功插入之后得到通知,我再执行搜索。
我的上万条数据,我用了mysql的批量插入语句,类似 insert into table1(id,name,email...)values(1,'a','asd@asd.com'),(2,'b',''...)
所以尽管一共几万数据,我做了一些分类,一共估计也就是100个insert语句。

#9


谢谢,我采用了bulk格式的mysql查询语句,另外加入了事务,在本机上运行起来很快,多得话一次性插入3--5万条,少的话1万条左右,感觉不到在占用时间。
我是c#代码是
/// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>sql2000数据库
        /// <param name="SQLStringList">多条SQL语句</param>
        public static void ExecuteSqlTran(List<string> SQLStringList)
        {
            using (MySqlConnection conn = new MySqlConnection(MySqlHelper.ConnStr))
            {
                conn.Open();
                MySqlCommand cmd = new MySqlCommand();
                cmd.Connection = conn;
                MySqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                        if (n > 0 && (n % 500 == 0 || n == SQLStringList.Count - 1))
                        {
                            tx.Commit();
                            tx = conn.BeginTransaction();
//原本是直接下面统一提交,听从sp1234的意见,就在这里重启事务,不知道这样写会不会/好,不过我这些写运行起来好像没问题。
                        }
                    }
                    //tx.Commit();
                }
                catch (System.Data.SqlClient.SqlException E)
                {
                    tx.Rollback();
                    throw new Exception(E.Message);
                }
            }
        }

谢谢大家

#10


解决方法写成博客了,欢迎指点
http://blog.csdn.net/wwwww112233/article/details/8562630

#11


想知道插入数据的时间,可以写日志

#12


楼主请问能否提供一个完整的例子呢?

#13


c#中往mysql里批量插入上万条数据,有比较高效的方法吗?谢谢