Php 选择Access DB文件中的全部或少数表,并将其存储在sql server中

Php 选择Access DB文件中的全部或少数表,并将其存储在sql server中,php,sql-server,database,ms-access,yii2,Php,Sql Server,Database,Ms Access,Yii2,目前,我正在使用yii2框架开发一个系统。在我的模块中,我必须将Access DB文件上载到sql server,并将数据提取到倍数表中。现在我可以上传access文件,但只能通过调用表名提取一个表(请参阅下面的第一个代码)。但我有多个表,所以问题是,如何从access db文件中提取多个表而不调用表名? 这是我上传access文件并保存到sql server并调用表“hs2_13”的代码 if($data->save()) { Yii::$app-

目前,我正在使用yii2框架开发一个系统。在我的模块中,我必须将Access DB文件上载到sql server,并将数据提取到倍数表中。现在我可以上传access文件,但只能通过调用表名提取一个表(请参阅下面的第一个代码)。但我有多个表,所以问题是,如何从access db文件中提取多个表而不调用表名?

这是我上传access文件并保存到sql server并调用表“hs2_13”的代码

if($data->save())
        {

          Yii::$app->session->setFlash('msg', 'Successful upload File and Process Integration will be Execute');
          Yii::$app->session->setFlash('msg_process', 'Process Integration in Execute');
          $result = $this->actionReadAccess($data,'"hs2_13"');
         return $this->refresh();
        }
这是从sql server读取并提取表的函数

public function actionReadAccess($data, $table)
{
  $query = 'SELECT TOP 100  * FROM ' . $table;

  $path = $_SERVER["DOCUMENT_ROOT"]. Yii::$app->request->baseurl."/".$data->path;
  $uname = explode(" ",php_uname());
  $os = $uname[0];
  switch ($os){
    case 'Windows':
    $driver = '{Microsoft Access Driver (*.mdb)}';
    break;
    case 'Linux':
    $driver = 'MDBTools';
    break;
    default:
    exit("Don't know about this OS");
  }
  $dataSourceName = "odbc:Driver=$driver;DBQ=$path;";

  $connection = new \PDO($dataSourceName);
  $result = $connection->query($query)->fetchAll(\PDO::FETCH_ASSOC);
  print_r($result);
  die();
  return $result;
}
现在我想调用access文件中的所有表并提取数据。随后,数据将保存在sql server的新表中。我希望你能理解我的问题,并为我糟糕的英语道歉。谢谢。

考虑使用循环遍历MS Access数据库的集合,将表名添加到数组中。将下面的新函数作为新方法添加到类中,该方法返回所有当前表名的字符串数组。然后在查询过程中遍历表

请注意,此解决方案需要通过Windows上的PHP安装在运行脚本的计算机上安装MSAccess.exe(MS Office程序)(通常COM库随Windows安装一起提供,但可能需要.dll加载项或.ini文件中启用的扩展名)

新功能

public function getaccTables($database) {                               
    $tables = [];

    try {
       $acc =  new COM("Access.Application", NULL, CP_UTF8) 
                          or Die ("Did not instantiate Access");
       $acc->OpenCurrentDatabase($database);               
       $db = $acc->CurrentDb();

       foreach ($db->TableDefs as $tbl){
          // IGNORE SYSTEM AND TEMP TABLES
          if (substr($tbl->Name(), 0, 4) != 'MSys' && substr($tbl->Name(), 0, 1) != '~') {
              $tables[] = $tbl->Name();
          }
       }
    }            

    catch (com_exception $e){
        echo $e;
    }

    $acc->DoCmd->CloseDatabase();
    $acc->Quit();

    // RELEASE RESOURCES
    $db = NULL; unset($db);        
    $acc = NULL; unset($acc);

    return $tables;
}
更新的功能

if($data->save()) {

    Yii::$app->session->setFlash('msg', 'Successful upload File and Process Integration will be Execute');
    Yii::$app->session->setFlash('msg_process', 'Process Integration in Execute');

    $tablelist = $this->getaccTables($data); 
    $result = $this->actionReadAccess($data, $tablelist);

    return $this->refresh();
}

public function actionReadAccess($data, $tables) {
    //... same connection setup ...

    // NEW LOOP FOR MULTIPLE QUERIES 
    foreach($tables as $tbl) {

        $query = 'SELECT TOP 100  * FROM ' . $tbl;
        $result = $connection->query($query)->fetchAll(\PDO::FETCH_ASSOC);
        print_r($result);            

    }

    $connection = NULL;

    return $result;
}

无法从php的access db文件中动态获取表名?MDBTools附带了一个名为mdb tables的工具,该工具提供了文件中所有access表的列表。在Windows中,您可以通过tabledef列出表。另一种方法是在accessDB中有一个包含所有表名的表(当有人更改accessDB时,该表甚至可以通过VBA自动更新),然后您只需要知道该表的名称。