日期:2013-09-02  浏览次数:20378 次

<?php
/**
* ODBC to mySQL
* 徐祖宁 (唠叨)
* czjsz_ah@stats.gov.cn
*
* 初次接触php+mysql的朋友,有很多是ASP的高手。为使尽快上手
* 特写此程序,用于将原有的数据库通过ODBC数据源转换到mysql
* 其实此类程序有很多,精华区中也有不少。
* 本程序的特点在于只需知道数据源名和mysql的库名即可。程序将
* 根据数据源中的表自动进行工作。
*
*/
set_time_limit(0);

$dsn = "tjtz";  // 数据源名
$dsn_name = "";  // 数据源用户名
$dsn_pass = "";  // 数据源口令

$sql = "tjtz";  // mysql库名,通常可用数据源名
$sql_host = "";  // mysql服务器名
$sql_name = "";  // mysql用户名
$sql_pass = "";  // mysql口令

$odbc = odbc_connect($dsn,$dsn_name,$dsn_pass);
$result = odbc_tables($odbc);

$fields = odbc_num_fields($result);

if(! function_exists("odbc_fetch_array")) {
  // 检查函数odbc_fetch_array是否存在,若没有则定义
  // 手册上说有这个函数,但4.1.2中肯定没有
  // 注意,使用odbc_fetch_into回串的数组只能用下标访问
  function odbc_fetch_array(&$result) {
    $ar = array();
    odbc_fetch_into($result,$ar);
    return $ar;
  }
}
// 获取库中的表
while($ar[] = odbc_fetch_array($result));
// 定义过滤函数
function filter($var) {
  return ($var[3] == "TABLE");
}
// 筛选出用户表
$ar = array_filter($ar,"filter");
foreach($ar as $tab) {
  $tables[] = $tab[2];
}
// 生成建表文档,若存在则不执行
if(! file_exists("$sql.sql")) {
  // 提取各表的字段信息
  $fp = fopen("$sql.sql","w");
  foreach($tables as $table) {
    $result = odbc_do($odbc,"select * from $table");
    $str = sprintf("create table %s (",$table);
    for($i=0;$i<odbc_num_fields($result);$i++) {
      if(eregi("DOUBLE",odbc_field_type($result,$i+1))) {
        $s = sprintf("%s%s %s"
               ,($i>0?", ":"")
               ,odbc_field_name($result,$i+1)
               ,odbc_field_type($result,$i+1)
             );
      }else if(eregi("COUNTER",odbc_field_type($result,$i+1))) {
        $s = sprintf("%s%s TINYINT(%s) AUTO_INCREMENT PRIMARY KEY"
               ,($i>0?", ":"")
               ,odbc_field_name($result,$i+1)
               ,odbc_field_len($result,$i+1)
             );
      }else {
        $s = sprintf("%s%s %s(%s)"
               ,($i>0?", ":"")
               ,odbc_field_name($result,$i+1)
               ,odbc_field_type($result,$i+1)
               ,odbc_field_len($result,$i+1)