项目需要定期将access里的数据自动导入到mysql;access里大概有十来张表的样子,总共的记录数大概是20w左右;
我实现的思路如下:
1. 逐行读取Access中的第一张表,并将每条记录组成一个sql语句,写入到一个临时的文件里;
2.当某个表读完之后,再用程序依次执行这个临时文件里的每一行(每行都是一个sql插入的语句),插入到mysql数据库对应的表里。
3.重复第一步,直到所有的用户表都被读取。这样可以实现,但速度太慢,20w条记录40分钟都弄不完;
各位有什么好的建议没,谢谢了:)

解决方案 »

  1.   

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

  2.   

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

  3.   


    这个我考虑过,但是将access表直接导出为文本文件,除了界面操作的方式之外;用程序怎么实现?有什么函数可以直接调用么?还是说只能一条条的读,然后依次写入到文本文件?
      

  4.   

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

  5.   

    如果是在ASP。NET中,你只能通过程序来实现这个文件的生成。如果在ACCESS内部,则可以通过 tansfertext 方法实现,或者直接 select * into  [Text;DATABASE=c:/temp].[test.txt] from table1
      

  6.   


    将Access的数据导出到txt文件,我这样写"INSERT INTO OPENDATASOURCE('MICROSOFT.JET.OLEDB.4.0','Text;DATABASE=c:/temp').[data.txt] SELECT * FROM tb_testcase"提示有语法错误啊
      

  7.   


    “可以直接在ACCESS中创建一个ODBC链接表到MYSQL”这一步怎么实现? 谢谢了:)
      

  8.   

    4楼的代码测试没有,在ACCESS中运行
      

  9.   


    测试了,提示“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;”
      

  10.   

    你是在ACCESS中运行?
    不需要建表,直接运行,你的代码?
      

  11.   

    我的代码如下:
    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;

      

  12.   

    我的代码:
    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;
      

  13.   

    不好意思 拷贝错了
    中间的语句是这样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");
      

  14.   

    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
      

  15.   


    应该是这么写"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驱动啊
      

  16.   

    MYSQL 5.1 ODBC没有安装?
      

  17.   

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

  18.   


    example表不存在,并且表里也没有特殊字段
      

  19.   

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

  20.   


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

  21.   


    是的,很奇怪
    ps:Access向Mysql导入的时候,前提是mysql里不存在这张表,但是如果存在呢?我要将Access中的数据每次都追加到mysql中固定的表里。这样是不是只能先导入到txt,然后从txt导入到mysql呢?
      

  22.   


    你好,我想问一下都有哪些方法可以实现?
    我用的是,通过程序读一条,然后往txt里写一条这种方式,但是速度太慢了。 谢谢你
      

  23.   

     加上:
    drop table if exists tt
      

  24.   

    结贴了 
    “直接从access导入到mysql”这个木有搞定
    现在采用“Access到出为txt,然后再load data到mysql”这种方法