我正在尝试通过 ODBC 连接到 SQL Server 数据库来查找使用 PDO 时出现的问题,在该数据库中,我得到了一个已知良好查询的空结果集。我将不胜感激社区的任何指导。这是我已经工作了大约五年的大型系统的一部分;它采用报告的 XML 表示形式,从中生成 SQL,运行查询,按要求格式化结果集,并生成用于展示的网页。比您可能需要知道的更多,但我想表达的是,我很了解它应该如何工作,并且在大多数情况下它可以可靠地工作。但是我有一个客户想要一些新东西,结果我的系统坏了。
我将此称为已知的良好查询,因为我可以将查询从我的日志文件复制并粘贴到 SSMS(SQL Server 控制台)并运行它。它产生 62 行结果。但是当我通过 PDO 运行相同的查询时,我得到一个 PDOStatement,没有 errorInfo(),没有抛出异常,等等。但是 fetchAll() 返回一个空数组。我最初使用的是 query(),但使用 prepare() 和 execute() 似乎更安全,以防万一我遗漏了什么在查询中。没有区别。
我意识到可能存在类型转换问题,但在下面的示例中,两个检索字段的类型分别为 nvarchar(128) 和 nvarchar(32),它们与其他查询一起成功返回。
我应该提一下,查询在应用程序中只执行一次,所以据我所知,这不是上一次执行干扰下一次执行的问题。此外,PDO 对象具有 setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
这是 execute() 返回的 PDOStatement:
Result Set PDOStatement Object
(
[queryString] => SELECT [dbo].[Supplier].[SupplierName] AS suppliername,[dbo].[Item].[ItemLookupCode] AS itemlookupcode FROM [dbo].[Order] LEFT JOIN [dbo].[OrderEntry] ON [dbo].[Order].ID=[dbo].[OrderEntry].OrderID LEFT JOIN [dbo].[Item] ON [dbo].[Item].ID=[dbo].[OrderEntry].ItemID,[dbo].[Supplier] WHERE ([dbo].[Order].Time >= '2015-01-01 00:00:00') AND ([dbo].[Order].Time <= '2015-03-31 23:59:59') AND ([dbo].[Item].SupplierID=[dbo].[Supplier].ID) ORDER BY [dbo].[Supplier].[SupplierName]
)
它并没有那么复杂,其他 SQL 查询对这个数据库也能正常工作。关于这个通过 PDO 失败的东西,但在 SSMS 中工作。
有什么想法吗?有没有人见过这种行为?还有其他方法可以查看这里发生了什么吗?我已经查看了关于这个主题的几个问题,但它们似乎都有我没有做的错误。
顺便说一句,PHP 5.4.22。
最佳答案
在将您的查询分解为我在下面使用的格式后,我注意到您混合了显式联接(LEFT JOIN、INNER JOIN 等)和隐式联接(FROM table1、table2)。这不仅被认为是一种非常糟糕的做法,而且众所周知有时会导致异常和意外的查询响应。因此,查看您的联接的隐式逻辑,我将查询重写如下:
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]
我将查询中的 LEFT JOIN 更改为 INNER JOIN,因为 [Item].SupplierID 和 [Supplier].ID 必须在您的原始查询中匹配(因此存在,因为 equals 不会返回 TRUE 值如果一个或两个值都为 NULL。)因此,OrderEntry 值也必须存在才能返回有效响应。如果行必须存在才能返回有效数据,您应该始终使用 INNER JOIN - 它简化了内部逻辑并且通常可以导致更快的查询响应。
我意识到这是一个老问题,但绝不会浪费一个好的答案。
关于PHP PDO ODBC 意外的空结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31373207/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我正在尝试在ruby脚本中连接到服务器https://www.xpiron.com/schedule。但是,当我尝试连接时:require'open-uri'doc=open('https://www.xpiron.com/schedule')我收到以下错误消息:OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv2/v3readserverhelloA:sslv3alertunexpectedmessagefrom/usr/local/lib/ruby/1.9.1/net/http.rb:678:in`conn
尝试单击带有变音符号的按钮时出现此错误:syntaxerror,unexpected$end,expectingkeyword_endclick_on'NeueFirmahinzufц╪gen'我正在使用Ruby和Capabara进行测试。##Create_User_spec.rbrequire'acceptance/acceptance_helper'##Feature'CreateUser'feature'CreateUser'do##Scenario'CreateaUser'scenario'CreateaUser'do##Loginintotheservicevisit'url
我正在尝试将我更新的gem推送到rubygems.com并得到以下结果。~/dev/V2/V2GPTI(master)$gembuildv2gpti.gemspecSuccessfullybuiltRubyGemName:v2gptiVersion:0.2File:v2gpti-0.2-universal-darwin-13.gem~/dev/V2/V2GPTI(master)$gempushv2gpti.gemspecERROR:Whileexecutinggem...(Gem::Package::FormatError)packagemetadataismissinginv2g
重新定义Float#/似乎没有效果:classFloatdef/(other)"magic!"endendputs10.0/2.0#=>5.0但是当另一个中缀运算符Float#*被重新定义时,Float#/突然采用了新的定义:classFloatdef/(other)"magic!"enddef*(other)"spooky"endendputs10.0/2.0#=>"magic!"我很想知道是否有人可以解释这种行为的来源,以及其他人是否得到相同的结果。ruby:ruby2.0.0p353(2013-11-22)[x64-mingw32]要快速确认错误,请运行thisscript.
我正在使用ARincludes在对象User和Building之间执行LEFTOUTERJOIN的方法,其中User可能有也可能没有Building关联:users=User.includes(:building).references(:buildings)因为我正在使用references,任何关联的Building对象都将被预先加载。我的期望是我随后能够遍历用户列表,并检查用户是否有与其关联的建筑物而不会触发额外的查询,但实际上每当我尝试访问建筑物属性时我都会看到对于没有建筑物的用户,AR会进行另一个SQL调用以尝试检索该建筑物(尽管在后续尝试中它只会返回nil)。这些查询显然是
我正在使用Rails4并遇到以下错误。RoutingErrorNoroutematches[POST]"/logs/1/meals/13/edit我正在使用:meal传递模型对象的form_for,并且编辑页面正确呈现。但是,Rails似乎并没有检查膳食对象是否已经保存,因此它一直尝试将表单发送到#create操作并尝试发出POST请求,而不是将表单发送到更新操作并进行当我点击提交时一个PUT请求。我如何让form_for识别我正在尝试更新现有对象并且需要PUT而不是POST?其他一切正常,我已经运行了所有迁移。我是Rails的新手,几乎一整天都在尝试自己解决这个问题。请帮忙!请注意,
我有三个属于同一个类的对象。一个是通过Item.new创建的,另外两个是从数据库(Mongoid)中提取的。我将这些对象中的一个/任何一个传递给另一个方法,并通过is_a?检查该方法中的类型:definitialize(item,attrs=nil,options=nil)super(attrs,options)raise'invaliditemobject'unlessitem.is_a?(Item)好吧,这次加薪被击中了。所以我在Rails控制台中检查类、is_a和instance_of。我得到相互矛盾的结果。为什么它们有相同的class但只有其中一个是那个class的instan