问题标签 [tdataset]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
95 浏览

delphi - 定位跳转到错误记录

我有最奇怪的问题:一个 Dataset.Locate 说他找到了一条记录并跳转到它,但该记录不符合标准。

这是我的代码:

这是输出的屏幕截图:

在此处输入图像描述

这是一个简单的过程,用于在覆盖中输入员工姓名(屏幕截图中的“Zoek 员工”窗口)并跳转到包含搜索字符串的第一条记录(主窗体上的网格,在左侧)

我正在使用德尔福 10.3。FDataset 是一个 TADODataset,它连接到本地 Access 数据库,由动态创建的 SQL 字符串提供。除了该 SQL 语句中的 WHER 之外,数据集还由数据集的“过滤器”属性进一步过滤。

有一个选项可以更改网格的排序顺序。当它实际上按名称排序时(ORDER BY 子句),一切正常;当它按出生日期排序时,会出现上述结果。

我可以不再信任 TDataset 的“定位”过程吗?

0 投票
1 回答
237 浏览

delphi - 如何在运行时从 Delphi TDBGrid 后代显示 DBGrid 之前以编程方式更改 TColumn 属性?

我从 TDBGrid 继承了一个类,我希望它能够记住特定用户对列顺序和列宽所做的任何修改。而且,我希望能够完全在网格本身内完成此操作。我不想将代码附加到 TDataSet,因为这个网格在我的应用程序中被广泛使用,我想在我的所有网格中实现这个功能,而不需要重复代码。

我已经把持久性部分放下了。我能够检测到用户在会话期间对网格列进行了更改,并在关联的 TDataSet 关闭或网格本身被破坏时保留该信息。如果您有兴趣,请从覆盖的 ColumnMoved 方法以及覆盖的 ColsWidthChanged 方法中捕获列参数。(请注意,只有当 FGridState 字段等于 gsColSizing 时,这必须从 ColsWidthChanged 完成。)

我还可以在初始化网格但在显示之前检索持久化的信息。我的问题是,虽然我成功地恢复了持久的列顺序及其宽度,但这些设置在显示网格之前就丢失了。具体来说,在应用持久设置后,我可以立即确认我已恢复保存的列顺序和宽度。但是在显示网格时,它会显示默认的列顺序和宽度。这表明我在加载过程中过早地应用了持久设置。

(顺便说一句,您可以通过更改单个 TColumn.Index 属性来更改 TDBGrid 中 TColumns 的顺序。还有一个 MoveColumn 方法。一旦默认 TColumns 已经创建和配置,这些技术就会起作用。)

当此方法的参数值等于 True 时,我正在尝试从覆盖的 LinkActive 方法中恢复以前保留的列设置。

我已经检查了 DBGrid 层次结构中的各种网格类,但我根本没有看到在加载周期后期覆盖的方法。有没有人建议一种方法可以在网格显示底层 TDataSet 的内容之前成功恢复以前保存的列顺序定义。同样,我想完全从网格中执行此操作,而不必为 TDataSet 分配事件处理程序。另一方面,如果我需要重写 TDBGrid 内部的某个方法,例如它的 TGridDataLink,那很好。

编辑 - - - - - - - - - - - - - - - - -

似乎覆盖 LinkActive 并测试参数 True (以及更多技巧,例如确保您尚未加载持久数据)是执行此操作的正确方法。我的问题是我加载持久数据有一些问题。具体来说,当我更改了默认字段的位置时,其他字段也更改了位置,这些更改需要考虑在内。

编辑 2 - - - - - - - - - - - - - - - -

好的,这个解决了。当我让持久性部分工作时,我在恢复中犯了一个错误。所以,这里需要什么。为了根据保持的新顺序重新排列列,您还必须知道这些字段的默认或当前顺序。诀窍在于,当您开始更改 Columns 属性中的列顺序时,您还必须更改字段当前位置的列表。我没有做到这一点。

我的代码现在不仅更改了网格的 TColumns 属性中字段的顺序,而且还更新了我创建的列表以跟踪当前顺序。

0 投票
0 回答
25 浏览

sql-server - TDataset Post() 不更新具有毫秒的日期时间字段以降低 sql 兼容性

表 ABC 中的 TestDate 字段是数据库中的 datetime 类型,该字段的值以毫秒为单位。

从 ABC 中选择 TestDate

2021-11-29 09:52:24.823

我正在 Rad Studio 10.1 Berlin 中创建一个项目,如果我尝试使用数据集 Post() 将其更新到不同的时间,程序会引发异常“无法定位行进行更新。自上次读取以来,某些值可能已更改。

TADOQuery *qryMain;

qryMain->ConnectionString = "Provider=SQLNCLI11.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=;Data Source=";

qryMain->SQL->Add("SELECT * FROM ABC");

qryMain->打开();

qryMain->Edit();

TDateTime dtNew(2021, 11, 29, 8, 51, 23, 0);

qryMain->FieldByName("TestDate")->AsDateTime = dtNew;

qryMain->Post();

qryMain->关闭();

如果我在 ConnectionString 中将提供程序从 SQLNCLI11.1 更改为 SQLOLEDB.1,则可以正常工作。但我应该只在项目中使用 SQL Native Client。

使用 SQL Native Client 时,它也适用于 SQL 兼容性较低的情况。如果兼容性是 SQL Server 2014 或更低版本,那么它可以工作。但如果兼容性是 SQL Server 2016,它就不起作用。

有没有办法来解决这个问题 ?

[注意:我使用的是 Microsoft SQL Server Management Studio 18 - v18.10]