发信人: pack27()
整理人: gzwsh(2001-05-12 22:56:12), 站内信件
|
第六天 有数据库功能的类(一)
这次,我们来看看类在数据库应用程序中的应用。
为了测试这次的内容,您可以建一个数据库,我用的SQL Server,您也可以用ACCESS或别的数据库系统,只要ADO的连接字符串做点修改就可以了。下面是这个数据库的SQL Server建表的脚本:
CREATE TABLE [dbo].[Users] (
[ID] [int] NOT NULL ,
[UserName] [char] (10) NOT NULL ,
[UserPassword] [char] (10) NOT NULL
)
Go
您有没有看过没使用类的数据库应用程序?它一般是这样的,在应用程序窗体的代码中,有大量的数据库操作代码与窗体操作代码混合。比如窗体上的查询按钮Command1一般会有这样的代码:
Private Sub Command1_Click()
Dim Rs As New ADODB.Recordset
Dim strSQL As String
strSQL = "select * from Users where ID=1"
Rs.Open strSQL, conn, adOpenKeyset, adLockReadOnly, adCmdText
Text1 = Rs!UserName
Text2 = Rs!UserPassword
Text3=Rs!ID
Rs.Close
Set Rs = Nothing
End Sub
我并不认为这样的写法有什么不好,但如果在程序中有多个地方或者在多个程序中要对这个Users表进行查询,那么重写一部份代码是很难避免的。
下面,我们看看怎样用类来封装这种数据库功能。
首先我们创建一个类cUsers。
您会发现这个类的这段代码的比上面的复杂,因为这个类不只是有一个查询功能,它有添加记录、查询记录、修改记录、删除记录这些功能。因为时间原因,我没对这些代码进行很认真的调试和设计,所以我不保证这个类的代码能作为数据库访问的范例,只能保证您能通过它了解类在数据库访问中起到的作用,和其基本的方法。
Option Explicit
Private MyConn As ADODB.Connection , mvarUserName As String
Private mvarUserPassword As String , mvarUserID As Long
Public Event ReferSucceed(ByVal Information As String) '提交成功事件
Public Event ReferLost(ByVal Information As String) '提交失败事件
Public Function SetConn(TheConn As ADODB.Connection) As Boolean
Set MyConn = TheConn
End Function
Public Function DeleteUserInfo(Optional UserID As Long = 0) As Boolean
Dim Rs As New ADODB.Recordset
Dim strSQL As String
On Error GoTo SysErr
strSQL = "SELECT * FROM USERS WHERE UserID=" & UserID
Rs.Open strSQL, MyConn, adOpenKeyset, adLockOptimistic, adCmdText
On Error GoTo 0
If Not Rs.EOF Then
Rs.Delete
RaiseEvent ReferSucceed("删除" & UserID & "成功!")
DeleteUserInfo = True
Else
RaiseEvent ReferLost(UserID & "编号无记录!请检查您的条件")
DeleteUserInfo = False
End If
Rs.Close
Set Rs = Nothing
Exit Function
SysErr:
RaiseEvent ReferLost("意外错误!请检查您的数据库连接是否成功。")
End Function
'下面这个方法中的参数SaveType用于判断SaveUserInfo是插入新记录还是修改旧记录
'当SaveType=0时,为修改旧记录,
'当SaveType<>0时,为插入新记录.
Public Function SaveUserInfo(UserID As Long, Optional SaveType As Long = 0) As Boolean
Dim Rs As New ADODB.Recordset
Dim strSQL As String
On Error GoTo SysErr '下面这两句如果有错误,是意外错误用专门的错误处理程序处理
strSQL = "SELECT * FROM USERS WHERE UserID=" & UserID
'注意下面这一句中的LockTypeEnum参数不能用adLockReadOnly.而要用adLockOptimistic或者adLockPessimistic
Rs.Open strSQL, MyConn, adOpenKeyset, adLockOptimistic, adCmdText
On Error GoTo 0 '以上的错误是容易处理的,所以取消错误处理
If SaveType = 0 Then '如果SaveType=0则为添加新记录方式
If Rs.EOF Then
Rs.AddNew
Else
RaiseEvent ReferLost(UserID & "号用户已经存在,请重新设定您的UserID值,您的这次操作被取消!")
GoTo CloseRs
Exit Function
End If
Else '如果SaveType<>0则为修改旧记录
If Rs.EOF Then
RaiseEvent ReferLost(UserID & "号用户并不存在,请检查您的UserID值,您的这次操作被取消!")
GoTo CloseRs
Exit Function
End If
End If
Rs!UserID = mvarUserID
Rs!UserName = mvarUserName
Rs!UserPassword = mvarUserPassword
Rs.Update
If SaveType = 0 Then
RaiseEvent ReferSucceed("添加" & UserID & "成功!")
Else
RaiseEvent ReferSucceed("修改" & UserID & "成功!")
End If
SaveUserInfo = True
Exit Function
CloseRs:
Rs.Close
Set Rs = Nothing
Exit Function
SysErr:
RaiseEvent ReferLost("意外错误!请检查您的数据库连接是否成功。错误号" & Err.Number)
SaveUserInfo = False
End Function
Public Function GetUserInfo(Optional UserID As Long = 0) As Boolean
Dim Rs As New ADODB.Recordset
Dim strSQL As String
On Error GoTo SysErr
strSQL = "SELECT * FROM USERS WHERE UserID=" & UserID
Rs.Open strSQL, MyConn, adOpenKeyset, adLockReadOnly, adCmdText
On Error GoTo 0
If Not Rs.EOF Then
If Rs.RecordCount > 1 Then
RaiseEvent ReferLost("返回的记录不唯一," & UserID & "编号有" & Rs.RecordCount & "条记录!请检查您的数据库记录")
GetUserInfo = False
Else
mvarUserID = Rs!UserID
mvarUserName = Rs!UserName
mvarUserPassword = Rs!UserPassword
RaiseEvent ReferSucceed("查询" & UserID & "成功!")
GetUserInfo = True
End If
Else
RaiseEvent ReferLost(UserID & "编号无记录!请检查您的条件")
GetUserInfo = False
End If
Rs.Close
Set Rs = Nothing
Exit Function
SysErr:
RaiseEvent ReferLost("意外错误!请检查您的数据库连接是否成功。")
GetUserInfo = False
End Function
Public Property Let UserID(ByVal vData As Long)
mvarUserID = vData
End Property
Public Property Get UserID() As Long
UserID = mvarUserID
End Property
Public Property Let UserPassword(ByVal vData As String)
mvarUserPassword = vData
End Property
Public Property Get UserPassword() As String
UserPassword = mvarUserPassword
End Property
Public Property Let UserName(ByVal vData As String)
mvarUserName = vData
End Property
Public Property Get UserName() As String
UserName = mvarUserName
End Property
-----------------------------------------------------------------------------
然后我们添加一个标准模块,内容如下:(请修改您的工程属性,把程序设定为从Sub Main启动。)
Option Explicit
Public conn As New ADODB.Connection
Sub main() '这是程序启动的地方
Dim strConnString As String
strConnString = "Provider=SQLOLEDB;" & _
"Persist Security Info=True;" & _
"User ID=sa;" & _
"Initial Catalog=pubs;" & _
"Data Source=ntserver"
conn.Open strConnString '打开数据库连接
Form1.Show
End Sub
---- ......
不想想起偏更记起
假装开心心更悲
辗转翻侧因为你起
愿你不是你
......
可捒选不恋上你么
可捒选不想你么
种种捒选可以许多
若我不是我
...... |
|