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
PHP PDO ODBC意外的空结果集_Php_Sql Server_Pdo - Fatal编程技术网

PHP PDO ODBC意外的空结果集

PHP PDO ODBC意外的空结果集,php,sql-server,pdo,Php,Sql Server,Pdo,我试图通过ODBC连接到SQL Server数据库来跟踪使用PDO的问题,在该数据库中,我得到了一个已知良好查询的空结果集。我希望得到社区的任何指导。这是我工作了大约五年的大型系统的一部分;它接受报表的XML表示,从中生成SQL,运行查询,根据请求格式化结果集,并生成用于表示的网页。可能比你需要知道的要多,但我想表达的是,我理解这是如何工作的,在大多数情况下,它工作可靠。但我有一个客户想要新东西,这破坏了我的系统 我将此称为已知的良好查询,因为我可以将查询从日志文件复制并粘贴到SSMS(SQL

我试图通过ODBC连接到SQL Server数据库来跟踪使用PDO的问题,在该数据库中,我得到了一个已知良好查询的空结果集。我希望得到社区的任何指导。这是我工作了大约五年的大型系统的一部分;它接受报表的XML表示,从中生成SQL,运行查询,根据请求格式化结果集,并生成用于表示的网页。可能比你需要知道的要多,但我想表达的是,我理解这是如何工作的,在大多数情况下,它工作可靠。但我有一个客户想要新东西,这破坏了我的系统

我将此称为已知的良好查询,因为我可以将查询从日志文件复制并粘贴到SSMS(SQL Server控制台)并运行它。它产生62行结果。但是当我通过PDO运行同一个查询时,我得到一个PDO语句,没有
errorInfo()
,没有抛出异常,等等。但是
fetchAll()
返回一个空数组。我最初使用的是
query()
,但如果查询中缺少某些内容,使用
prepare()
execute()
似乎更安全。这没什么区别

我意识到可能存在类型转换问题,但在下面的示例中,检索到的两个字段分别为nvarchar(128)和nvarchar(32)类型,它们与其他查询一起成功返回

我应该提到的是,查询在应用程序中只执行一次,因此,据我所知,这不是之前的某个执行会干扰下一个执行的问题。此外,PDO对象具有setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)

下面是execute()返回的PDO语句:

Result Set语句对象
(

[queryString]=>选择[dbo].[Supplier].[SupplierName]作为[dbo].[Item].[ItemLookupCode]作为[dbo].[Order]上的[dbo].[OrderEntry]左连接[dbo].[OrderEntry]的ItemLookupCode]作为[dbo].[Item]上的[dbo].[Item]左连接[dbo].[OrderEntry]。ItemID=[dbo].[OrderEntry]其中([dbo].[Order].Time>='2015-01-01 00:00:00')和([dbo].[Order]。Time将查询分解为我下面使用的格式后,我注意到您混合了显式联接(左联接、内部联接等)和隐式联接(来自表1、表2)。这不仅被认为是一种非常糟糕的做法,而且已知有时会导致异常和意外的查询响应。因此,查看联接的隐式逻辑,我已将查询重写如下:

SELECT 
    [dbo].[Supplier].[SupplierName] AS suppliername,
    [dbo].[Item].[ItemLookupCode] AS itemlookupcode 
FROM [dbo].[Order] 
INNER JOIN [dbo].[OrderEntry] 
    ON [dbo].[Order].ID=[dbo].[OrderEntry].OrderID 
INNER JOIN [dbo].[Item] 
    ON [dbo].[Item].ID=[dbo].[OrderEntry].ItemID
INNER JOIN [dbo].[Supplier]
    ON [dbo].[Item].SupplierID=[dbo].[Supplier].ID
WHERE ([dbo].[Order].Time >= '2015-01-01 00:00:00') 
    AND ([dbo].[Order].Time <= '2015-03-31 23:59:59') 
ORDER BY [dbo].[Supplier].[SupplierName]
选择
[dbo].[Supplier].[SupplierName]作为供应商名称,
[dbo].[Item].[ItemLookupCode]作为ItemLookupCode
来自[dbo]。[订单]
内部联接[dbo].[OrderEntry]
在[dbo].[Order].ID=[dbo].[OrderEntry].OrderID上
内部联接[dbo]。[项]
在[dbo].[Item].ID=[dbo].[OrderEntry].ItemID上
内部联接[dbo]。[供应商]
在[dbo].[Item]上。供应商ID=[dbo].[Supplier].ID
其中([dbo].[Order].Time>='2015-01-01 00:00:00')

和([dbo].[Order].Time我并不反对你的观点。如果我手工制作SQL查询,它们会和你的非常相似

但是这里的上下文是不同的。在这个系统()中,有一个数据库表及其关系的抽象,用XML表示。还有一个所需报告的抽象,也是用XML表示的。创建SQL的应用程序必须处理给定的输入。有时有足够的信息来生成“好的”SQL就像你和我写的一样。有时没有,让系统尽其所能。回退有时是前ANSI连接语法

此外,我确实指出(尽管我们可能认为这很难看),生成的查询(1)是合法的T-SQL,并且(2)在SSMS内运行时生成了客户想要的输出。事实证明,问题不在查询中。这只是我系统中的一个配置错误,所以我需要解决这个问题

也就是说,我最近重写了SQL生成引擎,以使用一种不同的方法生成更合理的查询,也就是说,那些看起来像您和我编写的查询


你的答案很好,我怀疑它会帮助其他人编写更好的查询。

我知道这是一篇相当古老的帖子@calast,但我面临的问题与你描述的完全相同。你为什么不在系统中加入“配置错误”,以防它对任何认为你的问题相关的人都有好处?
SELECT 
    [dbo].[Supplier].[SupplierName] AS suppliername,
    [dbo].[Item].[ItemLookupCode] AS itemlookupcode 
FROM [dbo].[Order] 
INNER JOIN [dbo].[OrderEntry] 
    ON [dbo].[Order].ID=[dbo].[OrderEntry].OrderID 
INNER JOIN [dbo].[Item] 
    ON [dbo].[Item].ID=[dbo].[OrderEntry].ItemID
INNER JOIN [dbo].[Supplier]
    ON [dbo].[Item].SupplierID=[dbo].[Supplier].ID
WHERE ([dbo].[Order].Time >= '2015-01-01 00:00:00') 
    AND ([dbo].[Order].Time <= '2015-03-31 23:59:59') 
ORDER BY [dbo].[Supplier].[SupplierName]