TAdoQuery.ParseSql 在 xe4 中不起作用

2024-03-07

我有一个 Delphi 7 项目,我使用TAdoQuery.ParseSql();加载参数。现在我在XE4中编译它,参数类型有时是错误的。是真的ftInteger但创建为ftSmallint。我可以做什么来解决这个问题?我的数据库是SQL Server 2008 R2。

表定义:

CREATE TABLE [dbo].[tblTest]( 
   [sysId] [int] IDENTITY(1,1) NOT NULL,  
   [Code] [nvarchar](50) NOT NULL, 
   [Name] [nvarchar](500) NOT NULL, 
CONSTRAINT [PK_tblTest] 
PRIMARY KEY CLUSTERED ( [sysId] ASC )
   WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
          ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) 
   ON [PRIMARY] )
ON [PRIMARY]

样本数据:

INSERT INTO tblTest ( Code, Name ) VALUES ( 'a1', 'name1' )

德尔福代码:

ADOQuery.SQL.Text := 'SELECT * FROM tblTest WHERE sysId = :sysId';
AdoQuery.Parameters.ParseSQL(ADOQuery.SQL.Text,True);
AdoQuery.Parameters.ParamByName('sysId').value := -1;
AdoQuery.open;

ConnectionString(数据库:MyDb)

Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial  Catalog=MyDb;Data Source=.

作为解决方案,我使用这个delphi代码

AdoQuery.Parameters.ParseSQL(ADOQuery.SQL.Text,false);

现在有人可以解释一下吗?有副作用吗?


首先,在我对 ParseSQL 进行任何解释之前,请检查您的连接字符串。初始值和目录之间有两个空格。当我使用该连接字符串时,打开查询时出现错误,tblTest 不存在。删除多余的空间解决了这个问题。

当我看到这个问题时,我不知道 ParseSQL 是做什么的。我多年来一直从事 Delphi / SQL Server / ADO 开发,但从未使用过它。我认为这将是一个学习新东西的机会。

请注意,我运行的所有测试在 Delphi 7 和 Delphi XE5 中给出了相同的结果。我仍然很想看到一些在 Delphi 7 中工作但在 Delphi XE5 中不起作用的代码。

当你执行AdoQuery.SQL.Text:='...',如果连接已设置并打开,您的应用程序将创建参数,并查询数据库服务器以确定它们的类型。这段代码:

AdoQuery := tAdoQuery . Create(nil);
AdoQuery . Connection := AdoConnection;
ADOQuery.SQL.Text := 'SELECT * FROM tblTest WHERE sysId = :sysId';

aDataType := AdoQuery.Parameters.ParamByName ( 'sysId' ) . DataType;
Msg ( 'Parameter type = ' + DataTypeToString ( aDataType ) );

将导致:

Parameter type = ftInteger

请注意,DataTypeToString 只是我编写的用于将 tDataType 转换为字符串的例程。

function DataTypeToString ( const nDataType : tDataType ) : string;
begin
  Result := GetEnumName ( TypeInfo(tDataType),
                          integer (nDataType) );
end;

然后执行这段代码。

AdoQuery.Parameters.ParamByName ( 'sysId' ) . Value := -1;
AdoQuery . Open;

如果运行 SQL Profiler,您将看到发送到 SQL Server 的查询:

exec sp_executesql N'SELECT * FROM tblTest WHERE sysId = @P1
',N'@P1 int',-1

请注意,@P1 被声明为int.

注意:如果连接字符串中有两个空格,则参数类型将显示为ftUnknown,@P1 将被键入smallint。该答案的其余部分将假设您拥有带有一个空格的正确连接字符串。

打电话是什么意思ParseSQL with DoCreate=true do?

AdoQuery.Parameters.ParseSQL(ADOQuery.SQL.Text,True);

它所做的第一件事是清除参数列表。在这种情况下,这意味着我们已经拥有的正确键入的参数被破坏。ParseSQL然后解析SQL并找到参数。它创造了一个新的tParameter有名称的对象sysID并将其添加到列表中。新参数的类型ftUnknown.

为什么有人想要这样做?如果查询连接未设置或未打开,这可能非常有用。将为您构建参数列表,之后您可以显式设置它们的数据类型。

如果你要执行怎么办ParseSQL with DoCreate=false:

AdoQuery.Parameters.ParseSQL(ADOQuery.SQL.Text,false);

答案是:什么也没有。 ParseSQL 会解析 SQL,找到参数,然后返回一个像这样的字符串:

SELECT * FROM tblTest WHERE sysId = ?

将参数替换为问号。它不会对参数列表进行任何更改。由于您的代码对返回的字符串不执行任何操作,因此最终结果是对 ParseSQL 的调用不会发生任何更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TAdoQuery.ParseSql 在 xe4 中不起作用 的相关文章

随机推荐

  • 如何仅在缺失的路线上将 Express.js 转至 404?

    目前 我的所有其他路线下方有以下内容 app get function req res console log 404ing res render 404 根据日志 即使上面的路由被匹配 它也会被触发 我怎样才能让它只在没有匹配的情况下才触
  • Sprite Kit 中的多点触控手势

    我正在使用 XCode 6 在 Swift 中使用 Sprite Kit 并且我有许多不同的节点 但目前我只能检测到一根手指并同时移动一个节点 我想知道如何设法检测多个手指以便同时移动多个节点 我的实际代码是 var location CG
  • 更改 jboss 7.1 中的日志级别,无需使用 Web 控制台界面重新启动服务器

    我想在 jboss 7 1 1 中使用 Web 控制台界面更改standalone xml 中的日志级别而不停止服务器 同样的事情 我可以使用 CLI commonds 执行以下操作 standalone localhost 9999 su
  • IIR 滤波器的 C 语言实现

    我正在尝试用 C 实现 IIR 滤波器FRDM KL25Z http www freescale com webapp sps site prod summary jsp code FRDM KL25Z木板 我当前的代码如下所示 inclu
  • 在 HTML 或 JavaScript 中设置自定义 userAgent

    有什么办法可以做到这一点吗 我正在尝试向网站发送 GET 请求 但我想自定义我的 UserAgent 有没有办法用纯 HTML 和 JavaScript 来做到这一点 我希望它全部在本地执行 这对我有用 Object definePrope
  • 按查询中的行字段降序排序

    我想编写一个 EF 查询 它根据条件按升序或降序排序 以下是我的伪代码 var result q OrderByDescending x gt x StatusId 3 if x StatusId 3 then order by x Res
  • 链表中元素的频率[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个点类型的链接列表 我想计算特定点的频率Code LinkedList
  • 我的代码在输出前面打印一个新行[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在编写代码 但遇到了问题 我的代码在输出前面打印了一个新行 我想避免这种情况 这是我的代码 if movieName
  • file() [function.file]: php_network_getaddresses: getaddrinfo failed: 名称解析暂时失败

    当我从文件中获取内容时出现以下错误 http www otherdomain com http www otherdomain com file function file php network getaddresses getaddri
  • Visual Studio Code:禁用特定文件类型的错误/警告检查

    在工作中 我的团队使用 Ruby 和 Treetop 解析器创建了我们自己的小型脚本语言 该语言本身的语法与 Ruby 非常相似 我使用 Ruby 和 Ruby 扩展为该语言的文件进行语法突出显示 但 Ruby 扩展会抛出错误 因为该语言实
  • 垂直居中可变高度图像,同时保持最大宽度/高度

    我想将未知宽度 高度的图像放在页面上的中心 同时确保它在大于页面时缩小 即使用max width max height 我尝试使用display table cell方法 但是max width在 Firefox 中 对于使用 声明的元素中
  • 在 Jersey REST 客户端中设置内容类型/编码

    您好 我一直在尝试使用 jersey REST 客户端调用 REST POST API API 文档是 网址 方法 邮寄 标题信息 X GWS 应用程序名称 XYZ 接受 application json 或 application xml
  • VSCode 任务错误:/bin/bash: npm: 找不到命令

    我一直在使用 Node 和 npm 然而现在 什么时候做command shift p Tasks Run task npm build 我收到此错误消息 执行任务 npm install bin bash npm 找不到命令 终端进程终止
  • pdo 包装器真的太过分了吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经做了一些关于使用数据库包装器来处理我的数据的研究 然而 我读过一些帖子 人们声称您不应该使用 PDO 作为数据库包装器 因为它已经是一个了
  • 查找并替换文本区域中的所有匹配字符串

    我有这个 var textarea content textarea html textarea html replace PID 111111 这部分有效 但它只找到文本区域中的第一个 PID 并将其替换为 1111111 我还需要更改大
  • 尝试取消引用迭代器时出现分段错误

    我正在尝试使用 std max element 查找向量的最大值 当我运行程序时 出现分段错误 我认为这与 std end 超出向量的末尾有关 我尝试将其更改为 std end tempdata 1 但无济于事 auto max std m
  • 如何获取当前DOM树对应的HTML?

    jQuery html html 似乎检索了其中的大部分内容 除了包装标签 DOM 被大量修改 因此原始源没有多大用处 可靠吗 只获取 jQuery 的输出并将其包裹起来是个好主意吗 我在这里至少可以看到一些文档类型问题 以及包含不应重新运
  • React JS - 如何通过 fetch 语句验证凭据

    我的目标是创建一个运行 json Rest 服务的 React JS 登录页面 在 Postman 中 当我输入服务的 URL 时 将其设置为以 POST 方式运行 并在正文中输入以下 JSON 用户名 myUserName 密码 myPa
  • REST API 中基于令牌的身份验证

    我尝试实现基于令牌的身份验证方法 每次成功登录都会创建新的令牌 如果用户选择 保持登录状态 或者用户使用移动设备 则令牌将保留在 Redis 数据库中 并且没有过期日期 否则 令牌将在 20 分钟后过期 一旦用户通过身份验证 就会从 Red
  • TAdoQuery.ParseSql 在 xe4 中不起作用

    我有一个 Delphi 7 项目 我使用TAdoQuery ParseSql 加载参数 现在我在XE4中编译它 参数类型有时是错误的 是真的ftInteger但创建为ftSmallint 我可以做什么来解决这个问题 我的数据库是SQL Se