COM objects efficiency design for database connection

I just studied COM and tried implementing a puzzle solver application using Active Exe as my server component and a standard exe as my client.

But I created my objects to create a database connection in its exposed public function. Thus everytime when I request for the component to run the puzzle solver's logic, I have to create a new database connection. Which I believe will create an overhead, if I choose to reuse the component object.

I was hoping that I could pass the exposed public function of my COM object as an ADO recordset object. Thereby, I wouldn't have to create a new connection everytime I instantiate the class (clsDictionary), which actually creates an overhead, especially if the database is rather large in size.

But this isn't possible as an error saying 'wrong data type' will appear, if I implement it that way.

Is there any particular technique or design that I could adhere to, in order to lessen the overhead by using a single database connection only at the point of entry.

I would like to attach my codes so that it can be downloaded but there isn't any place I can do it in experts-exchange. So i'll just have to explain it through text.

This part sits in clsDictionary of my ActiveX exe project

Public Function SearchStrSQL(SQLString As String, SearchType As Integer) As Boolean
    Set conDictionary = New Connection
    Set comWordlist = New Command
    Set rstWord = New Recordset
    On Error GoTo errhandler
    With conDictionary
        .ConnectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Dictionary;Data Source=PHILIP"
        .Provider = "SQLOLEDB"
    End With
    If SearchType = 1 Then
        SQLStr = "select * from wordlist where word like '" & SQLString & "' order by word "
        rstWord.Open SQLStr, conDictionary, adOpenDynamic, adLockOptimistic
    ElseIf SearchType = 0 Then
        SQLStr = "select meaning from wordlist where word like '" & SQLString & "' order by word "
        rstWord.Open SQLStr, conDictionary, adOpenDynamic, adLockOptimistic
    End If
        Call WriteToFile(SearchType)
        SearchStrSQL = 1
    Exit Function
    SearchStrSQL = 0
    MsgBox Err.Number & "Error encountered"
End Function

This part sits in my Client, standard exe project

Private Sub cmdFind_Click()
Dim blnValid As Boolean
Dim Searchstr As String
Set objDictionary = New clsDictionary
Searchstr = txtStringSearch.Text
blnValid = objDictionary.SearchStrSQL(Searchstr, 1)
If blnValid = True Then
    Call ReadFromFile
    If indicator = 0 Then
        Call PrintToListBox
    End If
    indicator = 0
    MsgBox "Error occured"
End If
End Sub

Who is Participating?

Improve company productivity with a Business Account.Sign Up

Brendt HessConnect With a Mentor Senior DBACommented:
You can reduce overhead by creating a class-global connection, a client-global objDictionary, setting objDictionary on the client start-up, and opening the connection in an Initialization step for the class.  

Once that is set, make sure that the class is destroyed when the client closes, and that the class closes the connection when the object is destroyed.
philcpAuthor Commented:
Hi bhess1,

When you say, i have to create a class-global connection, what function is similar to a Sub form_load() module to a class that has been instantiated?

philcpAuthor Commented:
i think i didn't make myself. my words are lil' out of place. Allow me to phrase my question again.

To a ActiveX exe project where could I place my codes for database connection other then my exposed function. so that I don't have to create a new connection everytime i'm interfacing with the object.
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

philcpAuthor Commented:
nvm i got it, is it to be place at class initialize?
but how do u destroy the class when the client closes?
Brendt HessSenior DBACommented:
Set the Class variable in the CLient to Nothing on the termination of the client.  For example, if Form_Unload is the last action in the client, you could add:

Sub Form_Unload(Cancel as Integer)

If Not objDictionary is Nothing Then
   Set objDictionary = Nothing
End If

End Sub
Brendt HessSenior DBACommented:
Yes, class_Initialize should be where you open the connection.  And class_Terminate should close it.
philcpAuthor Commented:
When I put my data connection codes in the class_initialize() standard procedure, along with a error handler. I seem to catching an err.number numbered '0'. I added the err.description but there's no description written down to explain it. And I tried looking up in MSDN, but nothing too. What could actually caused it?
Brendt HessSenior DBACommented:
Error number 0 is no error.  I have had this happen in my code... are you remembering to Exit Sub before dropping into your error handler code?
philcpAuthor Commented:
Well i guess I'll check my codes. Thanks for the help bhess1. I feel more confident with doing COM now... :) But I guess I have lots to learn.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.