gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:51:59 25 4
gpt4 key购买 nike

目前我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com