【问题标题】:Is there a way for SQL queries to handle a database which does not have all the columns requested in the SELECT command?有没有办法让 SQL 查询处理没有 SELECT 命令中请求的所有列的数据库?
【发布时间】:2021-01-29 16:08:56
【问题描述】:

简介

我的 Windows 窗体应用程序允许我加载、查看和更改 CAN 网络上的工业控制器网络的设置。这些设置被加载到存储所有信息的数据库中。客户不时要求新功能,并且更新控制器固件以包含新设置。这些新设置需要加载到数据库中,因此,我将新列添加到数据库中以便能够存储它们。除此之外,我还能够加载旧数据库以查看安装中每个控制器的设置。

问题描述

我的问题是每次向数据库添加新列时,我还必须向 SQL 查询的 SELECT 命令添加另一个字段。因此,每次我将旧数据库加载到我的应用程序时,SQL 查询都会引发异常,因为我正在请求旧数据库没有的列。

当前解决方案

我通过为每种数据库类型创建一个“填充”SQL 查询并使用 Try-Catch 循环解决了这个问题,首先我尝试查询最多的列(具有最多设置的最新数据库类型),如果抛出异常我移动到下一个最大的数据库查询。这样,我将不得不为每个数据库大小创建一个 SQL 查询。

问题

有没有更清洁的方法来做到这一点?我正在使用 Visual Studio,目标 .NET 框架是 4.0。

感谢您的时间和考虑。

【问题讨论】:

  • 如果您的应用程序不知道存在哪些列,那么它似乎必须使用DbDataAdapter FillSchema(...) 方法之一来获取可用的列,这决定了输入字段显示在用户界面中。

标签: sql database vb.net winforms


【解决方案1】:

建议一

为每个数据库类型保留一个公共列,如“Querykeys”,其中包含逗号分隔的字段名,可用于选择查询,然后您将首先查询该字段并使用结果字符串创建查询以检索数据

建议二

如果您定期更改数据库的列或列数,则意味着您的设计存在严重问题

尝试将新属性添加为子表

【讨论】:

  • 感谢您的回答。关于建议1;不幸的是,它不适用于预先存在的客户数据库,因为它们没有“Querykeys”列。至于建议2;我对 VB.NET 和 SQL 查询很陌生,能否更详细地解释一下您所说的子表是什么意思?
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 2017-12-15
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多