【问题标题】:unwanted SET NO_BROWSETABLE ON generated by tadodatasettadodataset 生成的不需要的 SET NO_BROWSETABLE ON
【发布时间】:2023-03-30 19:06:01
【问题描述】:

我的 delphi 应用程序中的 tadodataset 有问题 从delphi xe2切换到xe9和sql2014后的简单问题 我在分析器中看到我的所有查询都以 SET NO_BROWSETABLE ON 开始,这导致在 sql server 中重新编译存储过程和函数 有人可以告诉我如何禁用此选项 和示例代码

ADODataSet1.关闭; ADODataSet1.CommandText := '选择 * 来自 我的表'; ADODataSet1.打开;

并导致分析器: 设置 NO_BROWSETABLE ON 从 mytable 中选择 *

【问题讨论】:

  • 是什么让您认为这与 Delphi 有任何关系? Afaik,发送到服务器的确切 Sql 由 Delphi 代码“下方”的 Ado/MDac 层确定。尝试使用分析器观察保存对行数据的更改时生成的内容 - 通常 MDac 层会创建一个临时的、参数化的存储过程来执行此操作,而不涉及您的应用程序。
  • 调查这个问题的答案:stackoverflow.com/questions/29430665/… - 不同的供应商问题

标签: sql-server delphi ado tadodataset


【解决方案1】:

您的问题似乎暗示 SET NO_BROWSETABLE ON 只是在更改为更新的 Delphi 版本后才开始。

如果这就是你的意思,我不确定你的观察是否准确,至少我无法重现使用当前 Delphi 版本、XE10 Seattle 和 Delphi 7 编译的应用程序之间在 NO_BROWSETABLE 方面的任何行为差异。

我在这台机器上运行了一个 Sql Server 2014 实例,它是 Windows 10 Pro 64 位。如果我编译并运行一个使用TAdoConnectionTAdoQuery 执行简单select * from sometable 的最小Delphi Seattle 项目,则Sql Server 的Profiler 会显示MDac 层发送SET NO_BROWSETABLE ON,就像你一样。但是,如果我在 Delphi 7 中编译并运行完全相同的项目,我会得到与分析器中显示的完全相同的语句 - 如果应用程序是在 D7 或西雅图编译的,则没有任何区别。

这是将光标位置设置为clUseClient。如果我使用clUseServer,则不会出现SET NO_BROWSETABLE ON。它也不会出现在使用 TSqlConnectionTSqlQuery 的最小 DBExpress 应用程序中,因此可能也使用服务器端游标。

有关NO_BROWSETABLE的更多信息,请参见此处:

https://support.microsoft.com/en-us/kb/885146

我正在使用Microsoft OLE DB Provider for Sql Server。尽管据说这已被 MS 弃用,但与他们的 ODBC 提供商或“本机客户端”提供商相比,我遇到的麻烦总是少得多。

您可能还想看看这个 SO q:

Strange ADO behavior generating unwanted NO_BROWSETABLE / set fmtonly queries in VB6

顺便说一句,您提到“xe9”。你是说 XE8 还是 Delphi Seattle 还是什么?

【讨论】:

  • 首先感谢您的关注,然后我将 locktype 更改为 itreadonly,我看到它隐藏并且我的问题已修复我无法使用其他 delphi 版本对其进行测试,但我有我的旧应用程序版本用delphi xe2编译,我在分析器中看不到SET NO_BROWSETABLE,我的主要问题是为什么我的sql过程和函数在看到SET NO_BROWSETABLE时重新编译
  • "我的主要问题是为什么我的 sql 过程和函数正在重新编译" 好吧,我认为这与您最初提出的问题不同,因此如果您想要答案,您应该将其发布为新问题.我认为你应该在你的新 q 中包含你认为你拥有的任何证据,即“SET NO_BROWSETABLE ON”会导致你认为正在发生的重新编译。你怎么知道正在重新编译?
  • SELECT DEST.TEXT FROM sys.[dm_exec_connections] SDEC CROSS APPLY sys.[dm_exec_sql_text](SDEC.[most_recent_sql_handle]) AS DEST WHERE SDEC.[most_recent_session_id] = 393 我经常看到一个创建函数和在我的 sql server 的查询历史记录中创建过程,经过少量搜索,我了解到其他人也有我同样的问题
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多