从Access向mysql导入数据

jonglin 2012-03-06 03:04:23
项目需要定期将access里的数据自动导入到mysql;access里大概有十来张表的样子,总共的记录数大概是20w左右;
我实现的思路如下:
1. 逐行读取Access中的第一张表,并将每条记录组成一个sql语句,写入到一个临时的文件里;
2.当某个表读完之后,再用程序依次执行这个临时文件里的每一行(每行都是一个sql插入的语句),插入到mysql数据库对应的表里。
3.重复第一步,直到所有的用户表都被读取。

这样可以实现,但速度太慢,20w条记录40分钟都弄不完;
各位有什么好的建议没,谢谢了:)
...全文
383 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
jonglin 2012-03-12
  • 打赏
  • 举报
回复
结贴了
“直接从access导入到mysql”这个木有搞定
现在采用“Access到出为txt,然后再load data到mysql”这种方法
jonglin 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]

或者考虑把ACCESS中的各表直接导出为文本文件,(这个有多种方法在ACCESS中实现)
然后在MYSQL中用LOAD DATA FILE来加载导入数据。
[/Quote]

你好,我想问一下都有哪些方法可以实现?
我用的是,通过程序读一条,然后往txt里写一条这种方式,但是速度太慢了。 谢谢你
jonglin 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wwwwb 的回复:]

引用 21 楼 jonglin 的回复:

引用 20 楼 wwwwb 的回复:

直接在ACCESSESS中运行,看看提示


我刚才在Access中直接运行,是可以的;但是用程序实现就是不对,神奇了!!

是同1个用户、数据库?
[/Quote]

是的,很奇怪
ps:Access向Mysql导入的时候,前提是mysql里不存在这张表,但是如果存在呢?我要将Access中的数据每次都追加到mysql中固定的表里。这样是不是只能先导入到txt,然后从txt导入到mysql呢?
wwwwb 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 jonglin 的回复:]

引用 20 楼 wwwwb 的回复:

直接在ACCESSESS中运行,看看提示


我刚才在Access中直接运行,是可以的;但是用程序实现就是不对,神奇了!!
[/Quote]
是同1个用户、数据库?
jonglin 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wwwwb 的回复:]

直接在ACCESSESS中运行,看看提示
[/Quote]

我刚才在Access中直接运行,是可以的;但是用程序实现就是不对,神奇了!!
wwwwb 2012-03-08
  • 打赏
  • 举报
回复
直接在ACCESSESS中运行,看看提示
wwwwb 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 jonglin 的回复:]

引用 22 楼 wwwwb 的回复:

引用 21 楼 jonglin 的回复:

引用 20 楼 wwwwb 的回复:

直接在ACCESSESS中运行,看看提示


我刚才在Access中直接运行,是可以的;但是用程序实现就是不对,神奇了!!

是同1个用户、数据库?


是的,很奇怪
ps:Access向Mysql导入的时候,前提是mysql里不存在这张表,但……
[/Quote]
加上:
drop table if exists tt
jonglin 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wwwwb 的回复:]

example是否存在岧已经存在则删除,注特殊字段要用代码导入如OLE之类的
[/Quote]

example表不存在,并且表里也没有特殊字段
jonglin 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wwwwb 的回复:]

MYSQL 5.1 ODBC没有安装?
[/Quote]

安装了
但是不知道为啥还是提示调用失败
wwwwb 2012-03-07
  • 打赏
  • 举报
回复
example是否存在岧已经存在则删除,注特殊字段要用代码导入如OLE之类的
wwwwb 2012-03-07
  • 打赏
  • 举报
回复
MYSQL 5.1 ODBC没有安装?
jonglin 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wwwwb 的回复:]

我的代码:
SELECT * INTO t4 IN ODBC[ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=TMP;USER=root;Pwd=123;]
FROM T4;

你的:
SELECT * INTO IN ODBC [ODBC;Driver={MySQL ODBC 5.1 Dr……
[/Quote]

应该是这么写"SELECT * INTO example IN ODBC [ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;USER=root;Pwd=12345;] FROM tb_testcase"
这样执行之后,提示“ODBC--CALL FAILED”
但是我的机子上装了odbc驱动啊
wwwwb 2012-03-07
  • 打赏
  • 举报
回复
SELECT * INTO example IN ODBC [ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;USER=root;Pwd=12345;]FROM tb_testcase

直接在ACCESSESS中运行,看看提示

SELECT * INTO [ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;USER=root;Pwd=12345;].example FROM tb_testcase
jonglin 2012-03-07
  • 打赏
  • 举报
回复
不好意思 拷贝错了
中间的语句是这样

strcpy(strCmd, "SELECT * INTO example IN ODBC [ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;USER=root;Pwd=12345;]FROM tb_testcase");
wwwwb 2012-03-07
  • 打赏
  • 举报
回复
我的代码:
SELECT * INTO t4 IN ODBC[ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=TMP;USER=root;Pwd=123;]
FROM T4;

你的:
SELECT * INTO IN ODBC [ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;USER=root;Pwd=12345;]FROM tb_testcase

检查一下

OR
SELECT * INTO [ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=TMP;USER=root;Pwd=123;].T4
FROM T4;
jonglin 2012-03-07
  • 打赏
  • 举报
回复
我的代码如下:


int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
::ADOX::_CatalogPtr pCatalog;
::_ConnectionPtr pCon;
::_RecordsetPtr pRs;
char strConn[MAX_PATH];
memset(strConn, 0, sizeof(strConn));
strcpy(strConn, "Provider=Microsoft.Jet.OLEDB.4.0; Data source=D:\\temp\\TestSuiteNameSample_001E4FB28661_20120216191327.mdb");
pCon.CreateInstance(__uuidof(Connection));
pRs.CreateInstance(__uuidof(Recordset));
try
{
pCon->Open(_bstr_t(strConn), "", "", NULL);
}
catch(_com_error &e)
{
cout<<e.Description()<<endl;
}

char strCmd[MAX_PATH];
memset(strCmd, 0, sizeof(strCmd));
strcpy(strCmd, "SELECT * INTO IN ODBC [ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=test;USER=root;Pwd=12345;]FROM tb_testcase");
_variant_t RecordAffected;

try
{
pCon->Execute((_bstr_t)strCmd,&RecordAffected, adCmdText);
}
catch(_com_error &e)
{
cout<<e.Description()<<endl;
}

pCon->Close();
CoUninitialize();

return 0;
}
wwwwb 2012-03-07
  • 打赏
  • 举报
回复
你是在ACCESS中运行?
不需要建表,直接运行,你的代码?
jonglin 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wwwwb 的回复:]

4楼的代码测试没有,在ACCESS中运行
[/Quote]

测试了,提示“The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.”

我想问一下,在这句里面,"t4" 是mysql里的表的名字, T4是Access里表的名字,对么?
如果是的话,是不是需要先在mysql里创建t4表,然后才能导入呢? 谢谢:)
“SELECT * INTO t4 IN ODBC[ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=TMP;USER=root;Pwd=123;]
FROM T4;”


wwwwb 2012-03-07
  • 打赏
  • 举报
回复
4楼的代码测试没有,在ACCESS中运行
jonglin 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

可以直接在ACCESS中创建一个ODBC链接表到MYSQL,然后就可以直接 insert into link_table_mysql select * from accessTable
[/Quote]

“可以直接在ACCESS中创建一个ODBC链接表到MYSQL”这一步怎么实现? 谢谢了:)
加载更多回复(6)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧