在vb6中实现简单数据库选择/更新程序的更好方法是什么?

时间:2009-06-05 18:48:01

标签: database vb6

好的,这是大黄 - 我正在开发一个用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个不同的地方添加它。我必须将它添加到所有这些查询中以确保在记录检索上检索它并在记录集上设置,以及当复选框状态与记录的状态不匹配时设置标志以将数据与“true”进行比较

所以我正在考虑所有这些想法“有 GOT 是一种更好/更容易/更易于维护的方法。”

我对VB6几乎一无所知,但有没有办法制作一个简单的选择/更新数据库应用程序,看起来很漂亮的GUI(即我们不能只是给客户端提供一个可编辑的DataGrid,并说“你去,它,它拥有你需要的一切“)控件自动绑定到数据库(我通过相同名称的字段猜测),并且更新也可以轻松处理(因为它基本上只是”填充控件名称foo的值为数据库字段名为'foo')?

这样做的VB6最佳实践方法是什么?用C#这样的语言更容易完成吗?

提前致谢

编辑:根据给出的答案更新规格

  • 必须是独立的.exe

7 个答案:

答案 0 :(得分:3)

我会转向更新的技术堆栈;但是,如果那不可能......因为看起来你已经在使用ADO了,你想要使用断开连接的记录集。

一般来说,您要做的是使用连接打开记录集,将记录集连接设置为空。编辑记录集(它可以在任何时间内闲逛)然后获取新连接并设置与它的记录集连接。然后更新批次。

这是一个很好的起点:http://www.devguru.com/features/tutorials/DisconnectedRecordsets/tutDisconnRS.asp

编辑:我很确定你可以将该记录集绑定到数据网格,但是它已经有一段时间了:)

答案 1 :(得分:2)

说实话,你需要做两件事。

  1. 告知拥有此应用程序完全无法维护的人。尽可能谨慎地进行所需的任何更改,但也可以尽可能方便地进行。不要试图将其重构为更好的方法。

  2. 告知那些拥有他们需要进行重新编写的所有权(在这种情况下,您应该远离VB6)。

  3. 如果管理层没有采取这些措施,请继续使用当前的应用程序,但不要重构,而是更新您的简历,您知道其余的。

答案 2 :(得分:1)

只要并发用户数量相对较少,MS Access就非常适合此类应用。

答案 3 :(得分:0)

我猜你不想重写应用程序?写入的查询写得很差。不知道为什么开发人员这样写。它应该使用参数。但是,任何“好”的开发人员都可以用任何语言编写错误的代码。

答案 4 :(得分:0)

有很多不同的方法,但是你现在在这里我会做的是:

1)对于每个表单,创建一个例程,根据传递给它的关键信息加载该表单。 1b)改变嵌入的加载代码来调用这些例程。

2)对表单操作执行相同操作以创建新记录(插入)和删除记录。

3)对更新执行相同操作,但可以有多种更新,因此每个表单/表可能需要多个更新。这些现在构成了表单/表的数据访问例程:加载(选择),添加(插入),删除(删除)和更改X(更新(x))。将所有这些集合到自己的模块或类中:{form} _DBAccess。此时,任何表单或业务逻辑模块中都不应存在嵌入式SQL。

4)与此同时,更改数据访问例程以使用存储过程或嵌入式SQL。只需创建一个相应的存储过程(QueryDf for Access DB)并复制嵌入式SQL登录。然后更改vb6代码以调用存储过程。

答案 5 :(得分:0)

简要地说,应用MVC,在这种情况下:从数据中拆分视图。

我会做一个Employee类,它包含表的所有字段以及更新,插入和删除方法(类似于Hibernate / JPA中的实体)。然后在表单中,您将有2个函数用于从/向类字段/属性加载和保存GUI字段(如您所愿)。然后,每个用户操作(添加,编辑,删除,...)将通过GUI保存功能更改该Employee对象,并调用更新,插入或删除。也许你需要一些其他特殊的更新功能,我不知道。

我认为以这种方式重构员工部分不应该花费超过1天的时间,您将获得GUI和数据的清晰分离。您将不再使用SQL中的GUI元素的依赖关系,也可能涉及其他一些逻辑。

我也在使用这种方法,而且它足够灵活和稳定。

答案 6 :(得分:0)

即使是Jet MDB也支持ADO的参数化存储过程。除非您经常使用准备好的查询。这两种技术都允许您将SQL与程序逻辑中的过程活动分开,并减少SQL注入(有意或无意)的麻烦。

你也可以考虑使用数据绑定控件,它更像是一个Access应用程序,但它有它的弱点,毫无疑问是一个重大的重写。

MVC方法有其优点,但可能过度,并且经常会导致大型,混乱且难以维护的对象模型。它通常必须以不纯的方式完成,其中方法调用通过Friend属性或方法在其他对象中具有副作用。这通常是因为一旦投入使用,随着用户随着时间的推移细化业务规则并且对象模型不再正确地建模业务,很难改变。对于生命周期较短的应用程序,它可能是最佳选择。

在没有单一用户界面的情况下,它也可以很好地工作,即可能是Web UI,桌面UI和“替代服务交付”UI(IVR,面向公众的Web应用程序等)。我有一个应用程序,我希望我现在采用MVC方法,因为这个原因:一个GUI程序现在必须能够以批处理或命令行模式运行。