在 vb6 中实现简单的数据库选择/更新程序的更好方法是啥?
Posted
技术标签:
【中文标题】在 vb6 中实现简单的数据库选择/更新程序的更好方法是啥?【英文标题】:What is a better way to implement a simple database select/update program in vb6?在 vb6 中实现简单的数据库选择/更新程序的更好方法是什么? 【发布时间】:2009-06-05 18:48:00 【问题描述】:好的,这里是大黄——我正在开发一个用 VB6 编写的应用程序(我在其中的经验不到 1 个月),该应用程序的要点是它是一个简单的数据库选择/更新类型的应用程序.
基本上,您可以搜索员工(从数据库中选择记录),并编辑他们的数据(并更新数据库)。
嗯,在我继承的代码库中完成此操作的方式是通过数量惊人的大 SQL 查询字符串。这是我所说的一个不是真的编造但改变以保护无辜者的例子:
'Post Transaction to Database
If actionToDo = "Change" Then
Set coffeeTableRS = jawsTheSQL.Execute("Update coffeeTable set Name = '" & txtName.text & "', OriginalName = '" & MOriginalName & "', Prefix = '" & txtPrefix.text & "', FName = '" & txtFName.text & "', MName = '" & txtMName.text & "', LName = '" & txtLName.text & "', Suffix = '" & txtSuffix.text & "', Relationship = '" & txtRelationship.text & "', " & _
"Addr1 = '" & txtAddr1.text & "', Addr2 = '" & txtAddr2.text & "', StreetNumber = '" & txtStreetNumber.text & "', StreetName = '" & txtStreetName.text & "', City = '" & cboCity.text & "', State = '" & ChkNull(cboState.text) & "', ZipCode = '" & ChkNull(txtZipCode.text) & "', ZipCode2 = '" & ChkNull(txtZipCode2.text) & "', " & _
"Birthdate = " & MBirthdate & ", SSN = '" & Trim(txtSSN1.text & txtSSN2.text & txtSSN3.text) & "', OccuCode = '" & currentOccupationCode & "', OccuValue = " & currentOccupationValue & ", ChangeDate = '" & Format(MDate, "yyyy/mm/dd hh:mm:ss") & "', Active = '" & IIf(chkActive.Value = vbChecked, "", "I") & "'" & _
" where IDnumber = '" & txtIDNumber.text & "'")
对于我们可以采取的每个操作(添加、编辑、删除等),都有其中之一
换句话说,当我被要求向处理所有这些的主窗体添加一个简单的复选框控件时,我不得不在大约 15 个不同的地方添加它。我必须将它添加到所有这些查询中,以确保它在记录检索时被检索并在记录集上设置,并设置标志以在复选框状态与记录状态不匹配时将数据与“真”进行比较.
所以我正在考虑所有这些想法“有 GOT 是一种更好/更容易/更易于维护的方式来做到这一点。”
我对 VB6 几乎一无所知,但是有没有一种方法可以制作一个简单的选择/更新数据库应用程序并具有漂亮的 GUI(即,我们不能只给客户端一个可编辑的 DataGrid 并说“给你,它拥有你需要的一切”),其中控件自动绑定到数据库(我猜是通过同名字段),并且更新也可以轻松处理(因为它基本上只是“使用值填充控件名称 foo名为“foo”的数据库字段)?
做这种事情的 VB6 最佳实践方法是什么?用像 C# 这样的语言更容易完成吗?
提前致谢
编辑:根据给出的答案更新规范
必须是独立的 .exe【问题讨论】:
【参考方案1】:我会转向更新的技术堆栈;但是,如果那不可能……因为看起来您已经在使用 ADO,所以您希望使用断开连接的记录集。
通常您要做的是使用连接打开记录集,将记录集连接设置为空。编辑记录集(它可以挂起任何时间长度),然后获取一个新连接并将记录集连接设置到它。然后你更新批次。
这是一个很好的起点:http://www.devguru.com/features/tutorials/DisconnectedRecordsets/tutDisconnRS.asp
编辑:我很确定您可以将该记录集绑定到数据网格,但是已经有一段时间了 :)
【讨论】:
【参考方案2】:说实话,你需要做两件事。
通知那些拥有此应用程序完全不可维护的所有权。尽可能谨慎但尽可能方便地进行所需的任何更改。不要试图将其重构为更好的方法。
通知那些拥有所有权的人他们需要重新编写(在这种情况下,您应该远离 VB6)。
如果管理层没有采取这些措施,请继续对当前应用尽最大努力但不重构,而是更新您的简历,其余的一切您都知道。
【讨论】:
【参考方案3】:只要并发用户数量相对较少,MS Access 就非常适合此类应用程序。
【讨论】:
我认为这行不通 - 它需要是一个独立的可执行文件。不过还是谢谢。 Access 2007 带有免费运行时 - FWIW【参考方案4】:我猜你不想重写应用程序?编写的查询写得不好。不知道为什么开发人员这样写。它应该使用参数。但是,任何“优秀”的开发人员都可以用任何语言编写糟糕的代码。
【讨论】:
我没有足够的时间来重写这个特定的(尽管我想尽可能改进它),但是下一个从长矛上下来的几乎是我自己的空白画布:) 所以我想知道这种事情的最佳实践是什么,这样我就可以开始了。 (短期内必须坚持使用 VB6,因为这里几乎所有的代码库都在 VB6 中 - 迁移到 C# 是我的目标,但这是一个长期目标)【参考方案5】:有很多不同的方法,但是从你现在的位置来看,我会这样做:
1) 对于每个表单,创建一个例程,该例程将根据传递给它的关键信息加载该表单。 1b) 更改嵌入式加载代码以调用这些例程。
2) 对创建新记录(插入)和删除记录的表单操作执行相同操作。
3) 对更新执行相同的操作,除了可以有不止一种更新,因此每个表单/表格可能需要多个更新。这些现在构成了表单/表格的数据访问例程:Load(Select)、Add(Insert)、Remove(Delete) 和 ChangeX(Update (x))。将所有这些收集到他们自己的模块或类中:form_DBAccess。此时不应在任何表单或业务逻辑模块中留下嵌入式 SQL。
4) 与此同时,更改您的数据访问例程以使用存储过程或嵌入式 SQL。做一个对应的存储过程(Access DB的QueryDef),把嵌入式SQL登录复制进去。然后改vb6代码改为调用存储过程。
【讨论】:
【参考方案6】:简而言之,应用 MVC,在这种情况下:从数据中拆分视图。
我会创建一个 Employee 类来保存表的所有字段以及更新、插入和删除方法(类似于 Hibernate/JPA 中的实体)。然后在表单中,您将有 2 个函数用于从/向类字段/属性加载和保存 GUI 字段(如您所愿)。然后,每个用户操作(添加、编辑、删除……)将通过 GUI 保存功能更改该 Employee 对象并调用更新、插入或删除。可能你还需要一些特殊的更新功能,我不知道。
我会说以这种方式重构员工部分不应该超过 1 天,并且您将清晰地分离 GUI 和数据。您也将摆脱 SQL 中 GUI 元素的依赖关系以及可能涉及的其他一些逻辑。
我也在使用这种方法,它足够灵活和稳定。
【讨论】:
【参考方案7】:即使是 Jet MDB 也将支持来自 ADO 的参数化存储过程。除非您也可以经常使用准备好的查询。这两种技术都允许您将 SQL 从程序逻辑中的过程活动中分离出来,并减少 SQL 注入(有意或无意)带来的麻烦。
您也可以考虑使用更类似于 Access 应用程序的数据绑定控件,但它也有其弱点,并且无疑是一个重大的重写。
MVC 方法有其优点,但可能过于矫枉过正,并且经常导致大型、混乱且难以维护的对象模型。它通常必须以不纯的方式完成,其中方法调用通过 Friend 属性或方法对其他对象产生副作用。这通常会发生,因为一旦一成不变,随着用户随着时间的推移改进业务规则并且对象模型不再正确地对业务建模,就很难改变。对于生命周期较短的应用程序,这可能是可行的方法。
它也可以在没有单一用户界面的情况下很好地工作,例如,可能是 Web UI、桌面 UI 和“替代服务交付”UI(IVR、面向公众的 Web 应用程序等)。我有一个应用程序,我希望我现在因此采用 MVC 方法:一个 GUI 程序现在还必须能够以批处理或命令行模式运行。
【讨论】:
以上是关于在 vb6 中实现简单的数据库选择/更新程序的更好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
通过部分更新在 REST 中实现 PATCH 方法的官方方法