数据库开发中类模块的使用

 

摘要 使用面向对象编程工具处理数据库问题时,可以通过创建类模块把数据管理逻辑和用户接口逻辑独立开来,即把管理数据封装在类模块中。在应用程序有多个接口让用户编辑相同数据时,这种方法可以实现代码共享,当用户修改底层数据库时,其窗体的用户接口逻辑不用改变。本文介绍了创建数据管理逻辑和用户接口逻辑的基本方法,给出了一般化模型,并以VB6为例说明具体实现方法。

关键字 类(Class  窗体(Form) 数据库(Database)  封装(encapsulation

使用面向对象的编程工具进行数据库开发时,有很多工具可以使用,如VBDelphiPBVFP等。它们的共同特点是可以通过创建类模块把数据管理逻辑和用户接口逻辑独立开来。在类模块中进行数据管理,如连接数据库、创建结果集、定义私有变量完成当前记录的中间存取等。在窗体中通过创建类实例就可以完成数据库连接,通过对类属性的操作实现类模块和窗体之间的数据传递,进而实现对结果集的操作,如记录的浏览、添加、删除等。由于在窗体的用户接口逻辑中不对具体的结果集进行操作,也不对具体的字段进行操作,其操作对象只是类属性,对结果集的操作全部封装在类模块中,这样就创建了数据库和用户接口之间的独立层。采用这种分离技术,可以创建许多不同的窗体,所有的窗体使用同一个类而不用复制任何数据管理逻辑,类模块中代码被多个窗体共享。另外,对底层数据库的修改只在类中进行,而不需要对基于它的窗体做任何改变。

不论使用那种编程工具,实现数据管理逻辑和用户接口逻辑分离的基本方法是一致的。本文给出一个一般化的处理模型,再以VB6为例,说明具体的实现方法。

一 实现数据管理逻辑和用户接口逻辑分离的一般化处理模型

⑴在装载窗体时创建类实例。在类初始化中完成数据库连接、创建结果集、取当前记录到一组类私有变量中。

⑵在窗体中浏览记录时,通过调用类自定义方法,实现结果集中记录指针的移动。同时在类模块中取当前记录到一组私有变量中,为把数据传递给窗体做好准备。

⑶在类模块中,为每一个字段定义一个属性。读属性时,把相应私有变量值送属性。写属性时,把要写的内容送私有变量。

⑷在窗体中进行读操作时,只读相应属性,实质是读类私有变量,而私有变量中已存好了当前记录值。

⑸写操作时,只把当前值写到属性中,实质是写到类私有变量中,再通过类自定义方法写到结果集中。

其大致关系可用下图描述:

 

窗体类模块

装载窗体
创建类实例

 类实例初始化连接数据库、创建结果集
取当前记录到类私有变量
读数据
实质为读属性
 当前记录已存放在类私有变
量中,读属性的实质即返回 私有变量

写数据      
实质为写属性

写属性实际是把控件值写到
类私有变量中,再调用类自
定义方法写到结果集中


用户接口逻辑          数据管理逻辑

二 使用VB6处理上述问题的实际例子

⒈创建类Cstudent并做如下操作

⑴做下述定义:

Private cnnStudent As New ADODB.Connection

Private mStudent As New ADODB.Recordset

Private mstrName As String

Private mstrSex As String

Private mintAge As Integer

Public Enum CStudentMove

FirstRecord = 0

PreviousRecord = 1

NextRecord = 2

LastRecord = 3

End Enum

这里采用ADO,定义了三个私有变量mstrNamemstrSexmintAge分别对应结果集中的NameSexAge,枚举类型CstudentMove包含四个常量,为结果集指针移动做准备。

⑵在CstudentClass_Initialize()中添加如下代码:

Private Sub Class_Initialize()

创建并打开结果集

Dim StrSql As String

cnnStudent.Provider = "Microsoft.Jet.OLEDB.3.51"

cnnStudent.ConnectionString = "c:/access/student.mdb"

cnnStudent.Open

StrSql = "select * from sName"

mStudent.ActiveConnection = cnnStudent

mStudent.CursorType = adOpenKeyset

mStudent.LockType = adLockOptimistic

mStudent.Open StrSql

调用GetCurrentRecord方法,取结果集当前记录到私有变量

GetCurrentRecord

End Sub

⑶添加如下属性过程:

Public Property Get Name() As String

Name = mstrName

End Property

Public Property Let Name(ByVal vNewValue As String)

mstrName = vNewValue

End Property

Public Property Get Sex() As String

Sex = mstrSex

End Property

Public Property Let Sex(ByVal vNewValue As String)

mstrSex = vNewValue

End Property

Public Property Get Age() As String

Age = mstrAge

End Property

Public Property Let Age(ByVal vNewValue As String)

mstrAge = vNewValue

End Property

这六个属性分别对应字段NameSexAge。读属性时执行Get过程,写属性时执行Let过程。

⑷在类模块中定义SaveRecordGetCurrentRecord方法

Public Sub SaveRecord()

mStudent.Edit

mStudent.Fields("Name") = mstrName

mStudent.Fields("Sex") = mintSex

mStudent.Fields("Age") = mstrAge

mStudent.Update

End Sub

Public Sub GetCurrentRecord ()

mstrName = mStudent.Fields("Name").Value

mintAge = mStudent.Fields("Age").Value

mstrSex = mStudent.Fields("Sex").Value

End Sub

⑸在类模块中定义Move方法如下:

Public Sub Move(MoveType As Integer)

Select Case MoveType

Case 0

 mStudent.MoveFirst

Case 1

 mStudent.MovePrevious

Case 2

 mStudent.MoveNext

Case 3

 mStudent.MoveLast

End Select

GetCurrentRecord

End Sub

⑹在类的Class_Terminate()中添加如下代码:

Private Sub Class_Terminate()

mStudent.Close

Set mStudent = Nothing

cnnStudent.Close

Set cnnStudent = Nothing

End Sub

⒉在窗体中做如下操作

⑴在Form_Load()中添加如下代码

Private Sub Form_Load()

Set mclsStudent = New Cstudent  创建类实例

GetData

End Sub

⑵定义GetData方法

Private Sub GetData()

txt(0).Text = mclsStudent.Name 读属性值到控件

txt(1).Text = mclsStudent.Sex    读属性值到控件

txt(2).Text = mclsStudent.Age    读属性值到控件

End Sub

⑶定义Command按钮的Click事件

Private Sub cmdMove_Click(Index As Integer)

mclsStudent.SaveRecord

Select Case Index

Case 0

 mclsStudent.Move FirstRecord

Case 1

 mclsStudent.Move PreviousRecord

Case 2

 mclsStudent.Move NextRecord

Case 3

 mclsStudent.Move LastRecord

End Select

GetData

End Sub

⑷在Form_UnLoad()中添加如下代码

Private Sub Form_UnLoad()

mclsStudent.SaveRecord

Unload Me

End Sub

为简化起见,这里的表sName只有三个字段NameSexAge

可以看出,所有的数据管理都在类模块中进行。在窗体中不直接对结果集和字段操作,操作对象是类属性和类方法。真正实现了数据管理逻辑和用户接口逻辑的分离,创造了它们之间的独立层,为程序的进一步开发奠定了基础。不难在此基础上增加记录添加、删除、撤消等功能。

在应用程序有多个接口让用户编辑相同数据时,这种方法的优越性将显示出来。它不仅可以使管理数据的大部分代码得到共享,简化了程序设计,而且程序的修改,特别是底层数据库的修改变得非常容易。真正发挥了面向对象编程的优势。

 

参考资料:[]E.Winemiller,J.Roff B.Heyman,R.Groom   斌、杨德斌

          清华大学出版社

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT使用MySQL数据库开发登录窗口的步骤如下: 1. 首先,需要安装并导入MySQL数据库的驱动程序。可以从QT官网下载相应的MySQL驱动程序,并将其导入到项目中。 2. 创建一个QT窗口应用程序,并设计登录窗口的用户界面。可以使用QT的界面设计工具进行设计,并添加用户名和密码的输入框、登录按钮等控件。 3. 在窗口类中,添加与MySQL数据库交互的代码。首先,需要在代码中引入MySQL相关的头文件,并创建一个数据库连接对象。 4. 在登录按钮的槽函数中,编写验证用户输入信息和查询数据库的代码。可以使用SQL语句查询数据库中的用户名和密码是否与用户输入的一致。 5. 如果验证成功,则登录窗口提示登录成功并跳转到主窗口。如果验证失败,则提示登录失败,并可选择重新输入用户名和密码。 6. 在用户成功登录后,可根据需要进行后续操作,例如显示用户相关的信息或进行其它数据库操作。 需要注意的是,使用MySQL数据库开发登录窗口需要了解QT的信号与槽机制和MySQL数据库的基本操作。在连接数据库时,还需要提供正确的数据库连接信息,例如数据库服务器的地址、用户名、密码等。 ### 回答2: 使用Qt开发登录窗口时,可以使用MySQL数据库来存储和验证用户登录信息。首先,我们需要在Qt项目中引入MySQL数据库驱动,例如QMYSQL驱动。 接下来,我们可以创建一个登录窗口的UI界面,包括用户名输入框,密码输入框和登录按钮。当用户点击登录按钮时,我们可以获取输入的用户名和密码。 接下来,我们可以使用Qt的数据库模块来连接到MySQL数据库。首先,我们需要创建一个QSqlDatabase对象,并指定数据库驱动和连接的主机、用户名和密码。然后,我们可以调用open()函数来打开数据库连接。 一旦数据库连接成功,我们就可以执行SQL查询语句。我们可以使用prepare()函数为查询语句进行准备,然后通过bindValue()函数将查询语句中的参数绑定到输入的用户名和密码上。接下来,我们可以调用exec()函数执行查询,并使用next()函数遍历查询结果。 如果查询结果中存在匹配的用户名和密码,那么用户输入的用户名和密码是有效的,登录成功。我们可以弹出一个成功的提示框,并执行相应的操作。否则,我们可以弹出一个错误的提示框,告知用户输入的用户名或密码错误。 最后,不要忘记在程序结束时关闭数据库连接,以释放资源并与数据库断开连接。 总结,使用Qt和MySQL数据库开发登录窗口,我们可以实现用户输入的用户名和密码的验证,并根据验证结果做出相应的响应。这样,我们可以在Qt应用程序中实现一个安全可靠的登录功能。 ### 回答3: 使用Qt开发登录窗口需要先安装Qt以及Qt的MySQL驱动。安装完成后,首先需要包含Qt的头文件和MySQL驱动的头文件,之后创建一个连接对象,用于连接到MySQL数据库。 在登录窗口的设计中,我们需要添加一些控件,例如用户名输入框、密码输入框、登录按钮等。我们可以使用Qt的图形界面设计工具来方便地创建这些控件,并设置它们的属性、信号槽等。 在登录按钮的点击事件中,我们可以编写代码来获取用户名和密码输入框的内容,然后使用连接对象与数据库进行交互。可以采用SQL语句来查询数据库,判断用户名和密码是否匹配。 例如,可以使用以下代码来实现登录功能: ``` #include <QtSql> #include <QtWidgets> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建连接对象 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("testDB"); db.setUserName("root"); db.setPassword("password"); if (!db.open()) { qDebug() << "无法连接到数据库!"; return 1; } // 创建登录窗口及相关控件 QDialog loginDialog; QLineEdit usernameEdit; QLineEdit passwordEdit; QPushButton loginButton("登录"); // 添加控件到窗口 QVBoxLayout layout; layout.addWidget(&usernameEdit); layout.addWidget(&passwordEdit); layout.addWidget(&loginButton); loginDialog.setLayout(&layout); QObject::connect(&loginButton, &QPushButton::clicked, [&]() { // 获取用户名和密码输入框的内容 QString username = usernameEdit.text(); QString password = passwordEdit.text(); // 执行SQL查询语句判断用户名和密码是否匹配 QSqlQuery query; query.prepare("SELECT * FROM users WHERE username = :username AND password = :password"); query.bindValue(":username", username); query.bindValue(":password", password); if (query.exec() && query.next()) { qDebug() << "登录成功!"; } else { qDebug() << "用户名或密码错误!"; } }); loginDialog.show(); return app.exec(); } ``` 以上是一个简单的登录窗口使用Qt开发使用MySQL数据库验证登录的示例代码。当用户点击登录按钮时,程序会根据用户输入的用户名和密码在数据库中进行查询,并给出相应的提示信息。需要注意的是,实际开发中还需要处理异常情况和对数据库的操作进行更加合理的封装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值