项目需要定期将access里的数据自动导入到mysql;access里大概有十来张表的样子,总共的记录数大概是20w左右;
我实现的思路如下:
1. 逐行读取Access中的第一张表,并将每条记录组成一个sql语句,写入到一个临时的文件里;
2.当某个表读完之后,再用程序依次执行这个临时文件里的每一行(每行都是一个sql插入的语句),插入到mysql数据库对应的表里。
3.重复第一步,直到所有的用户表都被读取。这样可以实现,但速度太慢,20w条记录40分钟都弄不完;
各位有什么好的建议没,谢谢了:)
我实现的思路如下:
1. 逐行读取Access中的第一张表,并将每条记录组成一个sql语句,写入到一个临时的文件里;
2.当某个表读完之后,再用程序依次执行这个临时文件里的每一行(每行都是一个sql插入的语句),插入到mysql数据库对应的表里。
3.重复第一步,直到所有的用户表都被读取。这样可以实现,但速度太慢,20w条记录40分钟都弄不完;
各位有什么好的建议没,谢谢了:)
然后在MYSQL中用LOAD DATA FILE来加载导入数据。
这个我考虑过,但是将access表直接导出为文本文件,除了界面操作的方式之外;用程序怎么实现?有什么函数可以直接调用么?还是说只能一条条的读,然后依次写入到文本文件?
SELECT * INTO t4 IN ODBC[ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=TMP;USER=root;Pwd=123;]
FROM T4;
将Access的数据导出到txt文件,我这样写"INSERT INTO OPENDATASOURCE('MICROSOFT.JET.OLEDB.4.0','Text;DATABASE=c:/temp').[data.txt] SELECT * FROM tb_testcase"提示有语法错误啊
“可以直接在ACCESS中创建一个ODBC链接表到MYSQL”这一步怎么实现? 谢谢了:)
测试了,提示“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;”
不需要建表,直接运行,你的代码?
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;
}
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;
中间的语句是这样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");
应该是这么写"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驱动啊
example表不存在,并且表里也没有特殊字段
我刚才在Access中直接运行,是可以的;但是用程序实现就是不对,神奇了!!
是的,很奇怪
ps:Access向Mysql导入的时候,前提是mysql里不存在这张表,但是如果存在呢?我要将Access中的数据每次都追加到mysql中固定的表里。这样是不是只能先导入到txt,然后从txt导入到mysql呢?
你好,我想问一下都有哪些方法可以实现?
我用的是,通过程序读一条,然后往txt里写一条这种方式,但是速度太慢了。 谢谢你
drop table if exists tt
“直接从access导入到mysql”这个木有搞定
现在采用“Access到出为txt,然后再load data到mysql”这种方法