2012-03-14 210 views
1

我有一个特殊情况,我的客户需要将ms访问数据库导入到他的mysql网站数据库(所以它是一个远程数据库)。在Mysql数据库中导入Microsoft Access数据库

因为托管计划是共享主机(而不是vps),所以唯一的方法是通过PHP通过SQL查询,因为我没有对托管的ODBC支持。

我现在的想法是这样的一个(obviusly客户端有MS-Windows操作系统):

  • 创建转换MS-Access数据库到书面上的文件很大的SQL查询一个小C#应用程序
  • 然后
  • 该应用程序将使用FTP方式将文件发送到指定的目录下的网站上
  • 一个PHP脚本,然后将定期运行(每30分钟等),并检查文件是否存在,最终将其导入到数据库中

我知道这不是最好的方法,所以我提出了一个问题来为这个问题创建一个不同的解决方法。客户已经表示他想继续使用他的ms访问数据库。

我遇到的最大问题是,脚本只能持续30秒,这显然是导入数据的一个问题。

+0

我以前用过的类似过程。使用脚本将Access数据库导出到有效的MySQL导入SQL文件并上传到FTP站点,远程服务器上的另一个脚本每晚运行一次,以查看该文件是否存在。如果是这样,它会导入SQL文件(经过一些安全检查) – 2012-03-14 18:39:43

+0

如何处理30秒的脚本执行限制?我不知道多少数据库会大 – 2012-03-14 18:46:43

+0

http://php.net/manual/en/function.set-time-limit.php – horatio 2012-03-14 19:12:10

回答

1

要解决30秒的限制,请分解数据导入块。这里有一个大概的想法:

if(!file_exists('upload.sql')) exit(); 

$max = 2000; // the maximum number you want to execute. 

if(file_exists('progress.txt')) { 
    $progress = file_get_contents('progress.txt'); 
} else { 
    $progress = 0; 
} 

$file = file('upload.sql'); 

foreach($file as $current => $query) { 
    if($current < $progress) continue; // skip the ones we've done 
    if($current - $progress >= $max) break; // stop before we hit the max 
    mysql_query($query); 
} 

// did we finish the file? 
if($current == count($file) - 1) { 
    unlink('progress.txt'); 
    unlink('upload.sql'); 
} else { 
    file_put_contents('progress.txt', $current); 
} 
+0

是的,这是我想过的方法,但是我喜欢你在代码中处理它的方式(特别是$ current <$ progress thing),我会在几天内告诉你结果。 – 2012-03-14 21:24:13