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

标签 php sql-server database ms-access yii2

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

这是我的代码,用于将 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 的新表中。我希望你能理解我的问题,抱歉我的英语不好。谢谢。

最佳答案

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

请注意,此解决方案需要在通过 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文件中的全部或少数表并将其存储在sql server中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034134/

相关文章:

javascript - AJAX 成功后刷新 Div

jquery - 创建动态 html 表,其中 td 值与 ms sql db 中的 th 值关联

c# - SqlTransaction 中的 SqlDataAdapter.Fill() - 这是一种不好的做法吗?

database - 有没有办法告诉 postgresql 如何使用索引?

php - 错误消息 “Strict standards: Only variables should be passed by reference”

php - 如何重写 url 以删除?id=13

php - 使用 mysql_insert_id() 将 .php 的 id 传递给另一个 .php

sql-server - 使用 DATEADD 添加秒数会返回四舍五入为分钟的值 - 为什么?

ios - 如何在 Realm 中创建 NSData 对象的可选列表(数组)?

mysql - 如何连接mysql中多个不同表的数据