【问题标题】:Writing to a VFP Database using the Visual FoxPro OLE DB Provider in PHP使用 PHP 中的 Visual FoxPro OLE DB 提供程序写入 VFP 数据库
【发布时间】:2013-12-03 11:46:34
【问题描述】:

我在使用 Visual fox pro OLE DB 提供程序 (vfpoledb.dll) 在 php 中写入 VFP 数据库时遇到问题。使用 select 语句访问数据没有问题,如该问题中所述和回答:

Php, odbc & vfp

但是,在写作方面我遇到了麻烦

Cannot update the cursor ''tablename'', since it is read-only.

我认为解决此问题的方法是在打开命令中包含 Mode="ReadWrite"(也尝试过共享独占),如msn article 中所述,如下所示:

$conn = new COM("ADODB.Connection");
$conn->Open('Provider="VFPOLEDB.1";Data Source="' . $filename . '";Mode="ReadWrite";');

但是在执行如下语句时我仍然收到同样的错误:

$up = $conn->Execute("UPDATE tablename SET fieldname='Testing' WHERE fieldname = 'somevalue'");

有什么想法,有可能吗?
还有其他人喜欢封装遗留系统吗?

【问题讨论】:

  • 这是什么版本的驱动?我目前正在使用 ODBC 驱动程序 6.0 版,我打算使用 VFP OLE 驱动程序 9.0 版
  • 据我所知它是 v1.2(我厌倦了通过在此处运行安装程序来更新它:microsoft.com/en-gb/download/details.aspx?id=14839
  • 好的,谢谢。这就是我说的那个。在您的问题中,您声明它是 vfpodbc.dll,但 VfpOleDB.dll 是正确的。
  • 我的错误,感谢您指出这一点。

标签: php visual-foxpro


【解决方案1】:

这个表是 VFP 数据库的一部分吗?您是否检查过 .DBF 或 .DBC 的文件属性以查看它们是否为只读?此错误通常意味着 DBF 或索引(CDX 或 IDX)被标记为只读。

或者,您可能执行了 SELECT * FROM TABLE INTO CURSOR MyCURSOR,这将使光标 MyCURSOR 成为只读的。在这种情况下,您需要将 READWRITE 子句添加到 SELECT 语句中。

【讨论】:

  • 该表是 VFP 数据库的一部分,我已经检查了表 dbf 文件以查看它是否是只读的(它不是)。我刚刚检查了数据库 dbc 文件,看看它是否是只读的(它是)。我改变了它,但我仍然收到那个错误。
  • 您能否详细说明您的第二点。我没有将任何选择语句放入游标中。您可以将 READWRITE 添加到 update 语句中吗?如果可以,格式是什么?
  • 还有其他文件与 DBC(DCT, DCX) 和 DBF(CDX, IDX, FTP) 相关联。确保这些未标记为只读。另外,该目录可以是只读的吗?你在网络上吗?至于 READWRITE,仅在执行 SELECT 语句时适用。您的 UPDATE 看起来是正确的。
  • 已排序,经典文件权限因访问数据的过程而失败,我的错,感谢您为我指明正确的方向。
【解决方案2】:

不要忽略您遇到的其他问题,但我在前面提到的帖子中的回答具体提到了连接字符串。由于您没有显示文件名变量值的值,而是使用该变量的名称,我假设它是您要更新的实际表的全名。如果是这样,这是不正确的。

在为 VFP 进行连接时,您希望连接到数据表所在的实际 PATH,而不是实际表名本身。连接后,您可以查询该 PATH 中的任何表(如果您愿意,也可以查询子文件夹)。

确保您的连接指向 PATH 而不是实际的 table.dbf 引用。

【讨论】:

  • 首先感谢您的原始帖子,它非常有帮助,但是连接字符串不是问题。您的帖子非常清楚地表明不要使用表名本身,而我的代码没有(我知道您无法从我的帖子中看到这一点)。我已经整理好了,经典文件权限失败。
  • 我想知道您是否知道如何在执行前准备或安全声明,如本问题所述:stackoverflow.com/questions/20645426/…
  • @hygap,对不起,但没有 php 经验,我无法充分回答......但是,当值可以由外部提供时,仅仅连接字符串来构建查询总是很危险的来源(主要是基于网络的),并且应该在 OleDB 调用中进行参数化......但同样,我不熟悉 php 如何处理查询的参数化内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多