PDO不能在Access数据库中插入新记录,但可以在同一连接中读取和删除记录


PDO can't insert new record into Access database, but can read and delete in same connection

我有一个问题。我有一个ms访问DB文件,我必须阅读和修改(删除和插入记录)。我用PDO odbc。我有奇怪的情况,我可以读取和删除,但我不能在数据库中插入新的记录与相同的连接。我已经检查了ms Access中的插入字符串,它可以完美地工作
这里的php代码:

<?php
$path = getcwd() . "''tempFolder''MSDB.mdb";
$con = "odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$path; Uid=; Pwd=;";
try
{
    $db = new PDO($con);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //READ
    $cmd = "SELECT * FROM temp_HEADER WHERE [LINE-ID]='101'";
    $result = $db->prepare($cmd);
    $result->execute();
    $result = $result->fetch(PDO::FETCH_ASSOC);
    print_r($result); echo "<br/>";
    //DELETE
    $cmd = "DELETE FROM temp_HEADER WHERE [LINE-ID]='101'";
    $result = $db->prepare($cmd);
    $result->execute();
    echo "DELETE OK<br/>";
    //INSERT
    $cmd = "INSERT INTO temp_HEADER ([LINE-ID], PLANE, DISPLAY, X, Y, Z, LENGTH, SURF, ROCK, VARIA, LTYPE, NAME) "
    . "VALUES('101', '100', '', 100, 100, 100, 0, 0, '', 1, 'LINE', 'TEMP')";
    $result = $db->prepare($cmd);
    $result->execute();    
    echo "INSERT OK";
} catch (Exception $ex) {
    echo $ex->getMessage();
}



这段代码得到我以下结果:

Array ( [LINE-ID] => 101 [PLANE] => 100 [DISPLAY] => [X] => 100.0 [Y] => 100.0 [Z] => 100.0 [LENGTH] => 0.0 [SURF] => 0.0 [ROCK] => [VAR] => 1 [LTYPE] => LINE [NAME] => TEMP [Ind] => 1041 ) 
DELETE OK
SQLSTATE[22018]: Invalid character value for cast specification: 39 [Microsoft][Driver ODBC Microsoft Access]Invalid character value for cast specification (null) (SQLExecute[39] at ext'pdo_odbc'odbc_stmt.c:254)



这有什么不对吗?

注:我在几台计算机上测试了这个脚本,其中一些显示了所有结果,但另一个在插入命令中出现了错误。

编辑:添加字段类型:

LINE-ID - Text<br/>
PLANE - Text<br/>
DISPLAY - Text<br/>
X - Number(Double)<br/>
Y - Number(Double)<br/>
Z - Number(Double)<br/>
LENGTH - Number(Double)<br/>
SURF - Number(Double)<br/>
ROCK - Text<br/>
VARIA - Number(Long Integer)<br/>
LTYPE - Text<br/>
NAME - Text<br/>
Ind - AutoNumber(Long Integer)<br/>



编辑:我刚刚在c#中编写了相同的代码,一切都很好(我可以阅读,删除和插入)。我使用了与这里相同的sql查询,但我使用了oleDB。在这种情况下,我认为在php中使用pdo的odbc有问题。不能有人告诉我如何通过oleDB在php连接到DB,因为快速搜索没有得到任何结果?

编辑:我试图使用代码与COM (OleDB)。我对读取、删除和插入重复了同样的任务。我得到的是:

variant Object 
DELETE OK
Source: Microsoft JET Database Engine
Description: type Mismatch



编辑:我创建mdb文件和简单的脚本读取,删除和插入功能,并把它放在这里。这个代码对我不起作用。如果你可以运行它没有问题,请写下你的驱动程序的版本。我认为问题出在司机身上。在我的例子中,我已经尝试将ODBC快捷方式从system32更改为sysWOW64,但没有任何更改。

如果要硬编码该值,那么准备是没有意义的。

另一方面,这是一种风险,因为你可能会犯错误,数据类型不匹配。

看起来像是在插入坐标,例如一个空字符串(")不会转换为浮点数。

尝试正确地准备这个查询:

$cmd = "INSERT INTO 
        temp_HEADER (`[LINE-ID]`, `PLANE`, `DISPLAY`, 
                     `X`, `Y`, `Z`, `LENGTH`, `SURF`, 
                     `ROCK`, `VARIA`, `LTYPE`, `NAME`) "
    . "VALUES(  ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$result = $db->prepare($cmd);
$success = $result->execute(array('101', '100', '', 
                                  100, 100, 100, 0, 0, 
                                  '', 1, 'LINE', 'TEMP'));    
if($success){
    echo "INSERT OK";
}else{
    echo "INSERT FAIL";
}

根据这个列表,var是MS Access中的保留字。

其中一个变量名为var,因此会出现语法错误。将名称用方括号括起来

编辑:

该错误表明其中一列与您提供的值之间存在类型冲突。在任何情况下,最重要的想法都是一样的。连接很好。SQL有语法错误

"显示"字段是什么类型?您似乎要将它插入数据库,但打印结果显示它是一个二维数组

如何在php中通过oleDB连接数据库

要通过OLEDB执行INSERT,您可以使用如下命令

<?php
// this code requires the following php.ini directive:
//
// extension=php_com_dotnet.dll
$path = getcwd() . "''tempFolder''MSDB.mdb";
$con = new COM("ADODB.Connection"); 
$con->Open(
        "Provider=Microsoft.Jet.OLEDB.4.0;" .
        "Data Source=$path");
$cmd = "INSERT INTO temp_HEADER ([LINE-ID], PLANE, DISPLAY, X, Y, Z, LENGTH, SURF, ROCK, VARIA, LTYPE, NAME) "
    . "VALUES('101', '100', '', 100, 100, 100, 0, 0, '', 1, 'LINE', 'TEMP')";       
$con->Execute($cmd);
$con->Close();

如果您正在处理Unicode文本(正如您在问题的评论中提到的那样),那么我强烈建议您放弃PDO_ODBC方法,因为它注定要失败。当涉及Unicode字符时,PHP和Access ODBC不一起很好地发挥作用。

相关文章: