Avatar billede tigerdyr Nybegynder
11. juni 2001 - 10:53 Der er 6 kommentarer og
2 løsninger

Com+ dll (global variabel)

Halløjsa,

Så stødte jeg sgu på et problem...
Opgaven:
Jeg vil lave et COM+ komponent, som indeholder 4 funktioner:
- OpenDB(DSN)
- CloseDB()
- Recordset(SQL)
- NoRecordset(SQL)

Jeg kan sagtens få åbnet forbindelse til databaser dynamisk i en funktion, men lige så snart jeg begynder at ville dele det op, så jeg kan åbne en forbindelse fra en funktion, lukke fra en anden og mens forbindelsen er åben oprette recordsets eller udføre TSQL statements, fejler alt bare.

Spørgsmålet er ganske enkelt (og svaret er sikkert også):
HVORDAN kan jeg i min class fil (ActiveX dll project) oprette globale variabler som modificeres/benyttes af mine 4 funktioner, sådan at jeg med OpenDB(DSN) kan lave et global object der indeholder en ADO connection op mod min DSN, og lukke selv samme forbindelse med funktionen CloseDB()
Kan det lade sig gøre at dele processerne op på den måde ??

Regards
Tigerdyr
Avatar billede jennemaan Nybegynder
11. juni 2001 - 10:58 #1
Du kan blot oprette et modul.bas og erklære dine variable der.

Du skal dog være opmærksom på at de globale variable du opretter KUN vil være globale inden for den pågældende tråd. Da din COM+ komponent sikkert er Multi threaded vil der for hver tråd være et sæt \"globale\" variable.

Det er generelt ikke tilrådeligt at have globale variable i COM+ komponenter, da du ikke hårdt kan styre hvilke tråde dine objekt instanser bliver kreeret på.

/Jennemaan

Avatar billede tigerdyr Nybegynder
12. juni 2001 - 09:10 #2
Den må jeg vist lige have uddybet...
Jeg tilføjer blot en .bas fil til projektet og smider de globale variabler deri ?
Ideen er netop at jeg vil sikre at hver instans af objektet med 4 funktioner kan styre om en database forbindelse er åben eller lukket, samt udføre SQL statements mod en åben database og enten benytte TSQL eller få et recordset tilbage...
Hovedtanken bag var at jeg så skulle slippe for at smide en masse db forbindelser osv. på siderne, men blot kunne benytte en COM+ til samtlige projekter.

Jeg tester lige af :o)
Avatar billede kedde65 Praktikant
12. juni 2001 - 17:22 #3
Som Jenneman skriver så kan du bare lave erklæringerne i et kode modul.
Eksempelvis

dim conn as ADODB.Connection

og så lægge instantieringen ind i i den funktion der skal gøre det ved hjælp af

set conn = new ADODB.Connection

og tilsvarende i den f unktion der skal lukke forbindelsen skrive

set conn = nothing

kedde
Avatar billede tigerdyr Nybegynder
15. juni 2001 - 14:19 #4
Jeg synes ikke rigtigt jeg kan få det til at virke :o((
Et lynhurtigt sammenbikset eks. (der er sikkert fejl) på hvad jeg vil ser sådan ud:
Dim Conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim DSN As String

Function OpenDB()
  DSN = \"Driver={SQL Server};Server=DKLT2503;Database=Kursustest;UID=sa;PWD=;\"
  Set Conn = New ADODB.Connection
  Conn.Open DSN
End Function

Function CloseDB()
  Conn.Close
  Set Conn = Nothing
End Function

Private Sub udskriv()
  Set rs = Conn.Execute(\"SELECT * FROM Kursus\")
  If Not rs.EOF Then
    Label2.Caption = rs(\"id\") & \", \" & rs(\"Kursusnavn\")
  Else
    Label2.Caption = \"Nothing found\"
  End If
  rs.Close
  Set rs = Nothing
End Sub
Private Sub Command1_Click()
  Call OpenDB
  On Error Resume Next
  If (Conn.State <> 1) Then
    Label1.Caption = \"Closed\"
  Else
    Label1.Caption = \"Open\"
  End If
  Call udskriv
End Sub

Private Sub Command2_Click()
  On Error Resume Next
  If (Conn.State <> 1) Then
    Label1.Caption = \"Closed\"
  Else
    Label1.Caption = \"Open\"
  End If
 
  Call CloseDB
 
  If (Conn.State <> 1) Then
    Label1.Caption = \"Closed\"
  Else
    Label1.Caption = \"Open\"
  End If
End Sub

Jeg vil så yderlige (ud over openDB og CloseDB) have 2 funktioner: Recordset(sql) og NoRecordset der hhv. returnerer et recordset til ASP siden og udfører en TSQL statement, men ikke returnerer andet end en status for complete/not complete.

Kan det lade sig gøre ??
Evt. en smule kode/hjælp til hvordan
Avatar billede tigerdyr Nybegynder
19. juni 2001 - 12:04 #5
En stump kode perhaps ??
Et eksempel med åbning og lukning af en database via 2 funktioner, funktionerne kaldes fra ASP eller vb, det burde vel få mig så langt at jeg selv kan gennemskue resten :o))
Any help with that ?
Avatar billede tigerdyr Nybegynder
29. juni 2001 - 11:04 #6
Der var åbenbart ikke mere hjælp at hente :o(
Problemet er dog stadig ikke løst.
Avatar billede jennemaan Nybegynder
02. juli 2001 - 09:09 #7
æhm tigerdyr... Hvor svært kan det være???

Du laver et modado.bas

her har du følgende:

Public padoConn As ADODB.Connection



Public Sub PokeAdoConnection()

\'Først checker vi at connection objektet er instansieret
If Typename(padoConn)=\"Nothing\" Then
  Set padoConn=New ADODB.Connection
End If

\'Nu checker vi om forbindelsen er åben...

If padoConn.State<>1 Then
  padoConn.Open \"Driver={SQL Server};Server=DKLT2503;Database=Kursustest;UID=sa;PWD=;\"
End If

End Sub




I de rutiner i dine klassemoduler som skal bruge padoConn tilføjer du blot et kald til PokeAdoConnection.


/Jennemaan


Avatar billede tigerdyr Nybegynder
05. juli 2001 - 08:09 #8
Lad os bare sige at VB ikke er mit primære område... jeg har bare bohov for at få fremstillet sådan en enkel komponent, der kan benyttes til alt db adgang jeg får behov for...
I bund og grund er jeg ikke engang sikker på at jeg har fanget den kode du har skrevet ovenover, som jeg læser den, vil den åbne en forbindelse første gang jeg kalder sub\'en og bruge den for alle instanser
(eg. hvis 3 brugere kalder simultant, vil de dele en connection, eller tager jeg fejl ??)
Desuden skulle den meget gerne kunne modtage variable (eks. en DSN string)
Et andet problem er så hvordan det styres at jeg gerne fra en funktion vil have returneret et recordset til what-ever der end kaldte funktionen ??
Nyt spørgsmål og masser af point for den hjælp der skal til at sætte mig på rette spor, så jeg kan få lavet skidtet :-)

/Tigerdyr
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester