Php 选择Access DB文件中的全部或少数表,并将其存储在sql server中
目前,我正在使用yii2框架开发一个系统。在我的模块中,我必须将Access DB文件上载到sql server,并将数据提取到倍数表中。现在我可以上传access文件,但只能通过调用表名提取一个表(请参阅下面的第一个代码)。但我有多个表,所以问题是,如何从access db文件中提取多个表而不调用表名? 这是我上传access文件并保存到sql server并调用表“hs2_13”的代码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-
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自动更新),然后您只需要知道该表的名称。