Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS Access中的Delphi SQL子选择错误_Delphi_Ms Access_Ado - Fatal编程技术网

MS Access中的Delphi SQL子选择错误

MS Access中的Delphi SQL子选择错误,delphi,ms-access,ado,Delphi,Ms Access,Ado,我正在使用Delphi7和ADO组件,以及MS Access 2003。SQL语句 SELECT CMCB.Name, (SELECT SUM(amount) FROM movement MCB WHERE MCB.movement_classification_id=CMCB.movement_classification_id AND MCB.operation_date >= #01/01/2013# AND MCB.operation_da

我正在使用Delphi7和ADO组件,以及MS Access 2003。SQL语句

SELECT CMCB.Name, 
     (SELECT SUM(amount) FROM movement MCB
     WHERE MCB.movement_classification_id=CMCB.movement_classification_id
     AND MCB.operation_date >= #01/01/2013#
     AND MCB.operation_date < #01/01/2014#
 ) AS MyYear 
 FROM movement_classification CMCB
在MS Access console中工作正常,但在打开数据集TADOQuery时,通过Delphi应用程序启动以下错误:

数据提供程序或其他服务返回了E_失败状态

知道为什么会这样吗?在本例中,它与ADO组件TADOQuery有关吗

我从数据库dbdemos.mdb Program Files\Common Files\Borland Shared\Data中尝试了类似的查询,结果很好

SELECT CustNo, 
    (SELECT SUM(AmountPaid) FROM orders O 
    WHERE O.CustNo = C.CustNo 
    AND O.SaleDate >= #01/01/1994# 
    AND O.SaleDate < #01/01/1995#
) AS AmountPaid 
FROM customer C
我在Delphi中使用的代码如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
    ADOConnection1.Connected := False;
    ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Xiber\Delphi\StackOverflow\Subquerys\dbdemos.mdb';
    ADOConnection1.Connected := True;

    ADOQuery1.SQL.Text := 'SELECT CustNo, (SELECT SUM(AmountPaid) FROM orders O WHERE O.CustNo = C.CustNo AND O.SaleDate >= #01/01/1994# AND O.SaleDate < #01/01/1995#) AS AmountPaid FROM customer C';
    ADOQuery1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
    sSQL: string;
begin
    ADOConnection1.Connected := False;
    ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Xiber\Delphi\StackOverflow\Subquerys\XiGest-CASA.mdb';
    ADOConnection1.Connected := True;

    sSQL := ' SELECT CMCB.Name, ' +
        ' (SELECT SUM(amount) FROM movement MCB ' +
        ' WHERE MCB.movement_classification_id=CMCB.movement_classification_id ' +
        ' AND MCB.operation_date >= #01/01/2013# ' +
        ' AND MCB.operation_date < #01/01/2014# ' +
        ' ) AS MyYear ' +
        ' FROM movement_classification CMCB ';
    ADOQuery1.SQL.Text := sSQL;
    ADOQuery1.Open;
end;

目前,您的查询应该为每一行员工返回相同的sumqty值。如果Access隐藏了两个表之间的关系,这就可以解释为什么它在Access中工作。 我希望得到类似以下内容的查询:

    select e.name, sum(i.qty)
    from
        employee e,
        items i
    where
        i.employeeid = e.employeeid
会更像你想要的东西。当然,这假设两个表之间的items表中employeeid的外键存在直接关系,这是不现实的

正如其他人所评论的,更多的信息将允许更精确的答案

假设查询是ADO错误,有什么原因不能简化查询,例如:

    select CMCB.Name, SUM(MCB.amount)
    from
        movement_classification CMCB,
        movement MCB
    where
        MCB.movement_classification_id=CMCB.movement_classification_id
        AND MCB.operation_date >= #01/01/2013#
        AND MCB.operation_date < #01/01/2014# 

最后,我意识到这两个总和之间的差异是,在dbdemos中,字段AmountPaid.mdb是两倍,在我的例子中是小数点8,2

这似乎是一个ADO错误。你可以自己复制

因此,如果将Borland提供的dbdemos.mdb中的字段AmountPayed更改为十进制8,2,并使用ADOConnection和ADOQuery通过Delphi 7执行查询,则会出现上述错误

SELECT CustNo, 
    (SELECT SUM(AmountPaid) FROM orders O 
    WHERE O.CustNo = C.CustNo 
    AND O.SaleDate >= #01/01/1994# 
    AND O.SaleDate < #01/01/1995#
) AS AmountPaid 
FROM customer C

但是,如果您在MS Access中执行此查询,它可以正常工作。

我认为这里没有足够的信息来找出问题所在。没有错误代码,没有其他详细消息,什么都没有吗?这是一个有点奇怪的子查询,表之间根本没有关系。如果使用像这样的子查询会发生什么?MS Access是否支持公共表表达式?如果是这样,使用它如果你为子选择生成的列别名会发生什么?这里有两件事,首先这个查询会为每个名字显示相同的数量,这真的是你想要的吗?第二,你在delphi中从哪里得到这个错误?在打开查询时还是在哪里?其他查询有效吗?还是只有这个查询会出错?需要更多信息才能帮上忙好的,jciberta,看起来好多了!将ADOConnection1.Connected设置为true后,是否测试了Connected是否为true?如果不是,则表示连接字符串中存在问题。是的,ADOConnection1.Connected设置为true。此外,我删除了数据库中的所有表和两个表中的几个字段,并将大小减小到1.608KB。错误仍然存在很抱歉,我没有MS Access,因此我无法自己检查,但这两个数据库的字符集是否可能不同?它也可能是一个ADO错误。请检查我的答案,以了解您的查询的变化。谢谢Pat,但我终于找到了错误。再次抱歉您的询问。它仍然是简化的,所以没有必要改变它。真正的查询是select语句中有更多的子select,事实上,每月一次。类似于选择。。。作为一月,…,选择。。。十二月。。。