【问题标题】:Delphi 7 changing parameters from integer to shortintDelphi 7将参数从整数更改为shortint
【发布时间】:2012-09-13 17:25:14
【问题描述】:

我遇到了一个问题,即在 IDE 中关闭并重新打开文件会将我的数据集的参数 (tparam) 从整数更改为短整数。如果我将它们更改为整数,它似乎可以保存,但是一旦 lcosed 并重新打开它就会返回为 shortint。 有没有办法绕过 Delphi 将参数从 Integer 更改为 Shortint

我在这里发现了一个类似的问题 http://www.delphigroups.info/2/1/284088.html

这似乎是一个错误,但是有一些时尚的解决方法吗? 升级的 Delphi 版本不是我现在可以做的。 (第二次编辑中概述的复制步骤)

编辑:

如果将值类型更改为整数,只需在表单上放置一个带有参数的 sql 语句,就会发生这种情况。保存并重新打开值类型然后是shortint。

再次编辑:

在 Delphi 7 中,创建新应用程序。在表单上放置一个 TQuery。将 SQL 脚本编辑为类似于 'select * from table where id = :idnumber.接下来编辑参数。选择 idnumber 并将 VALUE.TYPE 更改为 Integer。此时您可以保存文件并关闭。当您重新打开文件时。然后再次转到参数选择 idnumber 它将保持类型 ftInteger 但 value.type 将是 Shortint。这是我希望保留为整数的部分,但不幸的是正在转换为 shortint。

【问题讨论】:

  • 底层数据库类型(Paradox、ADO等)和字段类型是什么?
  • TQuery 必须连接到某处的数据库。如果它是一个实际的TQuery,它附加到某种 BDE 数据库(正如我所说,Paradox 或其他通过 BDELinks 的东西)。它可能与数据库驱动程序或底层数据库列数据类型有关,这就是为什么我问(并且会再次):底层数据库类型和字段类型是什么? (如果 DB 列是 shortint,则无需将指向它的参数保存为 integer,因为该列不能容纳超过 shortint 的值。)
  • 我还要再说一遍。没有与 TQuery 组件关联的数据库。您所要做的就是在表单上删除一个 tquery,添加一个带参数的 sql 语句,将参数 value.type 分配给整数并点击保存。当您重新打开表单时,它会改为显示“shortint”。没有与 tquery 关联的数据库,只是表单上的一个组件。
  • 我刚刚尝试过:我创建了一个新的 D7 应用程序,在其上放置了一个 TQuery,单击对象检查器中的 SQL 按钮,输入 SELECT ID FROM sometable WHERE ID = :id,然后关闭 SQL编辑窗口。将表单作为文本检查,我得到一个声明的参数 (ID),带有 DataType = ftUnknownParamType = ptUnknown,两者都不是 integer,因此不保存为 integer
  • 如果您首先将参数更改为 value.type of Integer(它会自动将数据类型更改为 ftInteger)并保存它,然后关闭 form/pas 文件,然后重新打开,它现在将是 ftInteger value.type 的shortint。 (至少在我的环境中)。数据库最终会很重要,但无论哪种方式,问题都会发生,因为似乎是 Tquery 组件或 tdataset 或其他东西中的错误。这最终将在 Firebird 数据库上,但同样不需要该部分来创建问题。它似乎只发生在 tquery 组件本身。

标签: delphi


【解决方案1】:

我可以解释您看到的行为,这不是错误。 (顺便说一句,您的问题具有误导性。根据编辑和 cmets,您的实际问题是“Delphi 7 将 Parameter.Value.Type 从整数更改为短整数”,这根本不是一回事。)

您正在检查Param.ValueValue.Type,它未存储在.dfm 文件中。 Value.Type 在表单从dfm 流入并读取Value 时设置,或者在运行时设置Value 时设置。

我可以完全按照你的步骤来证明这一点:

在一个新的空白表单上放置一个 TQuery。在TQuery.SQL 中添加一些 SQL。我用SELECT Id FROM SomeTable WHERE Id = :id

点击... 对应TQuery.Params,然后在出现Parameter Editor 对话框时点击id 参数。单击对象检查器中的Value,并将Value.Type 更改为Integer

保存项目和表单,然后关闭它们。重新打开项目,右键单击表单,然后从上下文菜单中选择 View as Text。您将看到 Query1 组件的以下内容:

object Query1: TQuery
  SQL.Strings = (
    'select id from sometable where id = :id')
  Left = 152
  Top = 80
  ParamData = <
    item
      DataType = ftInteger
      Name = 'id'
      ParamType = ptInput
      Value = 0
    end>
end

注意ParamData中没有Value.Type;这是因为它是在读取Value 时设置的,而不是在保存表单时存储的。

现在再次右键单击,然后选择View as Form。回到Query1.Parameters,编辑Value,并将其设置为一个高数(我使用了123456789)。

保存表单,然后再次View as Text。注意Query1 信息:

object Query1: TQuery
  SQL.Strings = (
    'select id from sometable where id = :id')
  Left = 152
  Top = 80
  ParamData = <
    item
      DataType = ftInteger
      Name = 'id'
      ParamType = ptInput
      Value = '123456789'
    end>
end

请注意,仍然没有存储Value.Type。检查对象检查器中的ValueType,它现在显示String,即使Parameter.DataType 仍然是ftInteger。这是由 IDE 的流机制看到引号并相应地设置 Value.Type 引起的。

同样,它对您正在运行的应用程序没有影响。 IDE 中的Value.Type 无关紧要。

有趣的旁注:在看到Value.TypeString后,如果再次以文本形式查看表单,请删除Value属性周围的'字符和View as Form,然后检查再次将参数的Value.Type 变为Integer。这进一步表明它是在流式处理过程中设置的,在设计时没有任何意义。

【讨论】:

  • 完美,非常感谢。这是在跟踪与错误类型的查询参数相关的错误时发现的。所以这一定不是原因,也不是问题。尽管如此,解释还是值得赞赏的。
猜你喜欢
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多