精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..技术文章连载..〓〓>>跟我学用VB的类(系列)>>(转)跟我学用VB的类(系列)之第六天(一)

主题:(转)跟我学用VB的类(系列)之第六天(一)
发信人: 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 



----
......
不想想起偏更记起
假装开心心更悲
辗转翻侧因为你起
愿你不是你
......
可捒选不恋上你么
可捒选不想你么
种种捒选可以许多
若我不是我
...... 

[关闭][返回]