【问题标题】:Problem with ADO query connection to a DB Grid in Delphi?与 Delphi 中的数据库网格的 ADO 查询连接有问题吗?
【发布时间】:2020-11-20 11:05:46
【问题描述】:

问题背景: 所以我试图从我的数据库中通常在 DBGrid 中显示一个表(在我的 GUI 的单选组中选择了特定的表),以便当用户输入 SQL 查询时,他们将能够看到更改DBGrid 中的表。 (除非另有说明,所有图片均来自 Delphi 的设计视图)

您可以在其中选择表格的无线电组的图像(无线电组尚未执行任何操作):

主要问题: 问题是它没有显示所有内容,它只显示 DBGrid 上的第一列,没有其他内容。

我正在谈论的输出示例:

有关表单、组件等的额外信息: 连接到我声明为 TDataSource 组件的 DBGrid 的数据源称为 dsrSQL。我正在使用一个名为 qrySQL 的 TADOQuery 组件,它连接到 conClientInfo(一个连接到数据库的 TADOConnection 组件)。该数据源具有 qrySQL,因为它是 DataSet。所有组件都处于活动状态并已启用。它们也都在一个名为 DM_client_u 的数据模块中。 (我确实在表单代码中声明了使用下的数据模块)

Access 中一张表的图片:

我尝试了什么: 我在 conClientInfo 中重新编写了连接字符串,检查了 qrySQL 组件和 DBGrid。我仍然没有看到程序表面有任何问题。

提前致谢!

【问题讨论】:

  • 我认为你真正的问题是第一列的宽度。其余数据都在那里,但您必须水平滚动才能看到它。如果您没有明确定义第一列的宽度或使用隐式列,则宽度会根据基础字段的数据类型和 DBGrid 的字体自动计算。对于大的 VARCHAR 字段,它可能是一个巨大的数字。
  • @PeterWolf 谢谢,改变列的宽度有很大帮助!但是我的某些字段具有 WIDEMEMO 值?我怎么能解决这个问题? (我在 Access 中更改了字段的数据类型,全部改为短文本而不是长文本)
  • 坦率地说,你需要重新考虑你的 q,因为其中的大部分信息都是无关紧要的,例如一个非功能性无线电组的图像,显​​示它完全没有意义,以及一个表格在 Access 中的样子。您应该包括的详细信息是表格中的字段类型和大小(以文本而非图像的形式表示)以及用于打开表格的代码以及在切换表格时如何重置 DBGrid。尝试使用同一个网格来显示来自不同结构表的数据并不是一个好主意,除非您知道如何使用 DBGrid。

标签: sql ms-access delphi delphi-xe2 pascal


【解决方案1】:

如果您不介意我这么说,那么您尝试使用相同的 DBGrid 来为自己制造问题 当您不知道如何操作时,显示来自 2 个具有不同结构的表的数据。 无论如何,尝试这样做意味着您失去了在设计时设置网格外观的能力 并对其进行调整以适应每个表中的特定数据。

我建议你这样做:

  1. 向您的表单添加一个 TPageControl 并向其中添加两个 TTabSheets。

  2. 在每个 TTabSheet 上放置一个 TDataSource、TDBGrid 和 TDBNavigator,并将每个 TDataSource 连接到 数据模块中的数据集之一。假设涉及的 AdoQueries 已经有适合的 Sql 要检索您希望显示的数据,请将 AdoQueries 设置为活动并使用列编辑器 (您可以通过右键单击每个 TDBGrid 来访问)为每个设置和调整网格列的大小 字段。

  3. 现在您可以独立控制每个 AdoQuery 的显示,而无需纠结。

如果使用 TPageControl 不符合您的口味,请执行一些操作,例如将每个 TDBGrid 嵌入它自己的 TPanel, 使两个 TPanel 占据表单上完全相同的区域并使用代码显示其中一个面板 或其他取决于您的 TRAdioGroup 的设置,通过将一个 TPanel 的 Visible 属性设置为 True,其他为 False。

顺便说一句,一旦您的 2 个 TDBGrids 看起来和工作正常,请设置 AdoQueries to Active = False 并使用代码在运行时打开它们 - 这是不好的做法 在设计时让 DB 连接和 DataSet 之类的东西保持活动状态。你会 当您遇到意外问题时找出原因,例如当您希望您的应用程序对表具有独占访问权限时,例如在尝试在运行时重构它们时。

【讨论】:

  • 好的,我会好好利用你的建议。不过,我还有 1 个问题。如何将 TTabSheets 添加到 TPageControl?因为我没有看到 TTabSheet 的单独组件,所以您是否必须在页面控件的处理程序中添加代码或..?
  • 右击PageControl并从弹出菜单中选择New Page(两次)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多