【问题标题】:Insert/update data from access database to sql server database从 access 数据库插入/更新数据到 sql server 数据库
【发布时间】:2018-02-01 14:59:48
【问题描述】:

我有一个 ms access 数据库文件和一个 sql server 数据库。 我需要在 php 中编写一些东西,以便能够使用访问数据库数据更新 sql 数据库。更新意味着更新现有条目并插入新条目。

连接并从访问数据库文件中获取的脚本:

<?php
$connStr = 'odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};' .'Dbq=C:\\myfile.accdb;';
$dbh = new PDO($connStr);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "SELECT ID, `LAST NAME` AS lm, `FIRST NAME` AS fm,  FROM OLD";
$sql .= " UNION ALL SELECT ID, `Last Name` AS lm, `First Name` AS fm,  FROM NEW) ";
$sql .= " ORDER BY lm";

$sth = $dbh->prepare($sql);
$params = array();
$sth->execute($params);

while ($row = $sth->fetch()) {
//do something with $row['lm'] and $row['fm']
}
?>

用于连接和从 sql db 文件中获取的脚本:

<?php
$sql = "SELECT * FROM MYTABLE";
$stmt = sqlsrv_query($conn, $sql);
if($stmt === false) {
    echo 'Error. Could not execute query!';  
}

while ($rowsec = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
     //do something with $rowsec['MYTABLE_COLUMN']
?>

那么,我如何结合这两个查询以从访问文件中获取数据并从 sql 表中插入/更新记录?

假设当我在更新/插入到 sql 表之前从访问文件中读取数据时,我需要检查访问文件中的列并像这样修改:

<?php 
if($row['fm'].indexOf('am') > -1) {$id = 'am'.$row['ID']}
?> 

然后我应该使用 $id 以及 $row['lm'] 和 $row['fm'] 值来插入/更新到 sql 数据库。

提前谢谢你

【问题讨论】:

  • 在MSSQL中使用OPENROWSET()连接数据库并编写SQL代码处理复制不是更容易吗?
  • 或者您可以使用 Access 进行复制。您可以在 Access 中创建链接表,并使用查询来移动数据。您甚至可以通过 PHP 自动化 Access。但是在 PHP 中这样做是最不理想的方法。
  • 我无法在访问中使用某些东西,而且我不熟悉 openrowset()。有什么例子吗?

标签: php sql sql-server ms-access


【解决方案1】:

如前所述,考虑 SQL Server 的 OPENROWSET,如果用户被允许临时分布式查询权限并避免使用相同 ODBC 连接驱动程序的结果集之间的任何循环:

插入查询

INSERT INTO MYTABLE (ID, LM, FM)
SELECT t.*
FROM (SELECT ID, [LAST NAME] AS lm, [FIRST NAME] AS fm  
      FROM OPENROWSET('MSDASQL',
                      'Driver={Microsoft Access Driver (*.mdb, *.accdb)};
                       DBQ=C:\\myfile.accdb', 'SELECT * FROM [OLD]')

      UNION ALL 

      SELECT ID, [LAST NAME] AS lm, [FIRST NAME] AS fm  
      FROM OPENROWSET('MSDASQL',
                      'Driver={Microsoft Access Driver (*.mdb, *.accdb)};
                       DBQ=C:\\myfile.accdb', 'SELECT * FROM [New]')
     ) t
WHERE NOT EXISTS (SELECT 1 FROM MYTABLE s WHERE s.ID = t.ID)
ORDER BY t.LM

更新查询

UPDATE t
SET t.Lm = n.lm, t.Fm = n.fm
FROM MYTABLE t
INNER JOIN 
    (SELECT ID, [LAST NAME] AS lm, [FIRST NAME] AS fm  
     FROM OPENROWSET('MSDASQL',
                     'Driver={Microsoft Access Driver (*.mdb, *.accdb)};
                      DBQ=C:\\myfile.accdb', 'SELECT * FROM [OLD]')

     UNION ALL 

     SELECT ID, [LAST NAME] AS lm, [FIRST NAME] AS fm  
     FROM OPENROWSET('MSDASQL',
                     'Driver={Microsoft Access Driver (*.mdb, *.accdb)};
                      DBQ=C:\\myfile.accdb', 'SELECT * FROM [New]')
    ) n
ON t.ID = n.ID

或者,使用 ACE OLEDB Provider:

FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',   
   'C:\\myfile.accdb';'admin';'', Old)

确保在 PHP 查询字符串中加双引号(类似于加倍 \)。

【讨论】:

  • 如果我想检查访问文件中的值以查看 sql 数据库中是否存在要更新或不插入我该怎么做?
  • 使用两个查询查看编辑:使用NOT EXISTS 追加以避免重复并使用JOIN 进行更新。查看 SQL Server 的 MERGE 进行一次通话。
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多