【问题标题】:TSQLQuery - Cursor not returned from queryTSQLQuery - 游标未从查询返回
【发布时间】:2011-06-27 09:17:21
【问题描述】:

现在,我正在尝试摆脱 delphi 程序中的一些旧搜索代码,并且我想将搜索推送到程序正在使用的 sql-server。为此,我创建了这个查询,它与我在不同 C# 程序中使用的查询非常相似。

使用 SQL Management Studio 或从 C# 程序查询可以正常工作,但使用 Delphi 我收到“未从查询返回光标”错误。

这是查询

DECLARE @SearchString NVARCHAR(MAX);
SET @SearchString = ':Param1';
IF @SearchString = '' SET @SearchString = '%';

--Table for splitted values
DECLARE @SearchItms TABLE
(
Item NVARCHAR(MAX)
)

--Split Operator
DECLARE @SplitOn NVARCHAR(MAX)
SET @SplitOn = ' '; --Split Keywords on space

--Splitting
While (Charindex(@SplitOn,@SearchString)>0)
Begin
    Insert Into @SearchItms (Item)
    Select ('%' + Substring(@SearchString,1,Charindex(@SplitOn,@SearchString)-1) + '%')

    Set @SearchString = Substring(@SearchString,Charindex(@SplitOn,@SearchString)+1,len(@SearchString))
End

--Add last Item
Insert Into @SearchItms (Item) 
Select ('%' + @SearchString + '%')

--Select fitting items
SELECT MyTable.*
FROM MyTable INNER JOIN SecondTable ON (MyTable.Key = SecondTable.Key)
WHERE
NOT EXISTS(
  SELECT * FROM @SearchItms WHERE NOT(
     (OneField IS NOT NULL AND OneField LIKE Item)
  OR (OneDateField IS NOT NULL AND (convert(varchar, OneDateField, 104) LIKE Item) OR (convert(varchar, OneDateField, 114) LIKE Item ) )
  OR (AnotherField IS NOT NULL AND AnotherField LIKE Item)
  OR (LastField IS NOT NULL AND LastField LIKE Item)
  )
)

奇怪的是,当我删除时

--Add last Item
Insert Into @SearchItms (Item) 
Select ('%' + @SearchString + '%')

我没有收到“未从查询返回光标”错误。但是使用搜索字符串,我在 SQL Management Studio 中只得到 10 个结果,我在 Delphi 中得到数据库中的所有项目,就像搜索没有做任何事情一样。

这也发生在一个简单的测试程序中,我只有一个 Form、一个 TSQLConnection、TSQLQuery、TDataSetProvider 和一个 ClientDataSet。

谁能告诉我这里有什么问题?由于查询在其他环境下运行良好,我认为应该没问题。

非常感谢您的帮助。

【问题讨论】:

    标签: delphi tsql dbexpress


    【解决方案1】:

    正如 ldsandon 在他的帖子中提到的,问题似乎在于,它不是一个简单的查询,而是一个完整的脚本。但由于其他 dbExpress 单元似乎都无法处理这个问题,所以我找到了一种让它工作的方法。

    只需在脚本开头添加一个SET NOCOUNT ON;,然后用SET NOCOUNT OFF;关闭脚本

    我认为这会抑制插入中的“xx 行影响”消息,因此可以在没有错误的情况下运行。

    如果您知道更好的方法来运行脚本而不会出错,请告诉我。

    谢谢。

    【讨论】:

    • 是的,开始了相同的答案,但你写得更快:P
    • 我有同样的问题,简单的“DELETE FROM WHERE id=:id”
    【解决方案2】:

    这不是一个查询 - 这是一个脚本。通常,Delphi TQuery 组件可以处理单个 SQL 语句,而不是多个 SQL 语句(您首先有 INSERT,然后是 SELECT)。可能是 INSERT 显然不返回游标。您可以尝试使用 TSQLDataset 并查看它是否可以处理这种 SQL Server“匿名块”,或者将其转换为存储过程并从您的 Delphi 程序中调用它。

    【讨论】:

    • 看起来问题实际上是它更像是一个脚本而不是单个查询。不幸的是,TSQLDataSet 以及带有 TStoredProc 的存储过程也无法处理它。但我找到了一个我将作为答案发布的解决方案。
    • 要将其用作存储过程,您必须将其转换为真正的存储过程。那样它也应该更高效,不需要每次都重新解析它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多