"C#":MySql批量数量导入
现在对数据库(以MySql为例)的操作大多会封装成一个类,如下例所示:
namespace TESTDATABASE
{
public enum DBStatusCode { ALL_OK, MySqlExcuteErr }
public class TestDB
{
private string hostIp;
private string dbName;
private string dbUser;
private string dbPasswd;
private MySqlConnection dbConn; public TestDB()
{
this.initConn();
}
~TestDB()
{
dbConn.Dispose();
}
void initConn()
{
dbName = "testDB";
hostIp = "127.0.0.1";
dbUser = "root";
dbPasswd = "root";
string connString; // Connection string。数据库连接字符串大全:http://www.connectionstrings.com/
connString = "SERVER=" + hostIp + ";" + "DATABASE=" +
dbName + ";" + "UID=" + dbUser + ";" + "PASSWORD=" + dbPasswd + ";";
dbConn = new MySqlConnection(connString);
}
// Open connection
public void openConn()
{
if (dbConn.State == ConnectionState.Closed)
dbConn.Open();
}
// Close connection
public void closeConn()
{
if (dbConn.State == ConnectionState.Open)
dbConn.Dispose();
}
// Insert
public DBStatusCode insertTest(ItermList itemList)
{
DBStatusCode flag = DBStatusCode.ALL_OK;
openConn();
string cmdText = "insert into testTable (c1, c2, c3, c4)"
+ "VALUES (@c1, @c2, @c3, @c4)";
MySqlCommand cmd = new MySqlCommand(cmdText, dbConn);
try
{
foreach (Item item in itemList)
{
cmd.Parameters.Clear(); // it is needed
cmd.Parameters.AddWithValue("@c1", item.c1);
cmd.Parameters.AddWithValue("@c2", item.c2);
cmd.Parameters.AddWithValue("@c3", item.c3);
cmd.Parameters.AddWithValue("@c4", item.c4);
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
flag = DBStatusCode.MySqlExcuteErr;
}
finally
{
cmd.Dispose();
}
closeConn();
return flag;
}
}
}
上边例子涉及到对MySql数据库的数据导入。可以看出(56~60),每循环一次,就会对数据库插入一次。当数据量比较小时,可能还看不出软件的卡顿现象;当数据量很大时,整个软件可能就会卡住几分钟了。所以,我们最好是当所有数据都准备好时,再一次性向数据库定入,以减少插入次数,以最终减少数据导入时间。而且,我们还想,在数据库插入失败的情况下还能够回滚。下边是改进的函数:
// Insert
public DBStatusCode insertTest(ItermList itemList)
{
DBStatusCode flag = DBStatusCode.ALL_OK;
openConn();
string cmdText = "insert into testTable (c1, c2, c3, c4)"
+ "VALUES (@c1, @c2, @c3, @c4)";
MySqlCommand cmd = new MySqlCommand(cmdText, dbConn);
MySqlTransaction tx = this.dbConn.BeginTransaction();
cmd.Transaction = tx;
try
{
foreach (Item item in itemList)
{
cmd.Parameters.Clear(); // it is needed
cmd.Parameters.AddWithValue("@c1", item.c1);
cmd.Parameters.AddWithValue("@c2", item.c2);
cmd.Parameters.AddWithValue("@c3", item.c3);
cmd.Parameters.AddWithValue("@c4", item.c4);
cmd.ExecuteNonQuery();
}
tx.Commit();
}
catch (Exception ex)
{
flag = DBStatusCode.MySqlExcuteErr;
tx.Rollback();
}
finally
{
cmd.Dispose();
}
closeConn();
return flag;
}
这里的改进可以说还只是初步的。当数据特别大时,这种方法就会出问题了。因为计算机要一次性把非常多的数据插入到数据库,有可能因为内存不足等原因而导致最终导入时间过长等。所以,在有一些情况下,我们还得分批提交(tx.Commit()),例如每1000个数据提交一次,这样就能够大大减轻计算机和数据库负担了。
关于MySql事务介绍资料:
关于批量插入数据,可参考的资源还有:
.NET 批量插入数据,DataSet, SqlDataAdapter.Update
datatable 使用SqlDataAdapter.Update批量插入更新数据
"C#":MySql批量数量导入的更多相关文章
- mysql批量数据导入探究
最近工作碰到一个问题,如何将大量数据(100MB+)导入到远程的mysql server上. 尝试1: Statement执行executeBatch的方法.每次导入1000条记录.时间为12s/10 ...
- MySQL批量导入Excel数据
MySQL批量导入Excel数据 1.确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序:(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名 ...
- MySQL批量导入Excel、txt数据
MySQL批量导入Excel.txt数据 我想Excel是当今最大众化的批量数据管理软件了吧,所以我们会经常涉及到将Excel中数据导入到MySQL中的工作.网上有一些关于直接将Excel导入MySQ ...
- 文件批量加密重命名--python脚本AND mysql命令行导入数据库
在考试中学生交上来的报告,需要进行一下文件名加密,这样阅卷老师就不知道是谁的报告了 在百度帮助下,完成了加密和解密脚本, 加密 #!/usr/bin/python # -*- coding: utf- ...
- 【转】MySQL批量SQL插入各种性能优化
原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...
- 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)
问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...
- 转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合
需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...
- 完美转换MySQL的字符集 Mysql 数据的导入导出,Mysql 4.1导入到4.0
MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是 ...
- redis 队列缓存 + mysql 批量入库 + php 离线整合
问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入 ...
随机推荐
- Python 3.3.3 使用requests模拟登录网站
在模拟登录上,requests确实比python标准库中的相关模块更加简洁. 假设你需要去爬一组页面(targetUrls),而这些页面要登录才能进行访问.那么requests能够提供一种相当简单的语 ...
- iOS下使状态栏颜色与H5中背景色一致
iOS 中有的页面也能会内嵌WebView,然后WebView中用H5做了一个导航,而iOS 中状态栏的颜色很难调整的与H5中导航颜色一致.如下图所示: 其实出现这种原因,主要是因为使用16进制颜色, ...
- 1CCTableView的使用,TableView响应和小格子tableView实现
1 CCTableView的使用 T26TableView.h #ifndef __T26TableView_H__ #define __T26TableView_H__ #includ ...
- android 集成微博常见问题
我们在做微博集成登录.分享.聊天的时候,肯定会遇到很多的坑,这里总结下常见的问题. 文件不存在 C8998 的解决方法 如图我们走微博授权登录的时候如果OAuth2.0 授权设置回调页面设置和本地的不 ...
- JDBC-数据库的更新操作编程(三)
首先建立一个静态方法,代码如下: public static Statement getStatement(){ Statement st = null; try { Class.forName(&q ...
- ORA-28001: the password has expired 详解 不用重启项目
大早上正式库提示: Oracle提示错误消息ORA-28001: the password has expired 解决办法: 1.利用SYSDBA权限登陆: 2.查看账户信息:select user ...
- app如何更换用户头像信息呢?不妨这样做
对于现在的手机应用而言,要想获得更多的人的使用,就需要给用户更多的自由功能才行,这也是基于用户体验开发软件的核心思想,一切以用户为中心,想用户之所想,做用户之所需.今天我就来谈一谈刚学到的一个关于设置 ...
- Ext JS 6开发实例(三) :主界面设计
在上文中,已经将CMD创建的应用程序导入到项目里了,而且也看到默认的主界面了,今天的主要工作就是修改这个主界面,以符合项目的需要.除了设计主界面,还有一些其他的东西需要配置一下. 添加本地化包 打开a ...
- Android初级教程以动画的形式弹出窗体
这一篇集合动画知识和弹出窗体知识,综合起来以动画的形式弹出窗体. 动画的知识前几篇已经做过详细的介绍,可翻阅前面写的有关动画博文.先简单介绍一下弹出窗体效果的方法: 首先,需要窗体的实例:PopupW ...
- UNIX网络编程——shutdown 与 close 函数 的区别
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据 ...