Avatar billede stefan Nybegynder
15. juni 2000 - 16:10 Der er 8 kommentarer og
1 løsning

Asp - Component

Jeg er begyndt at arbejde lidt med dll-filer, jeg er dog kun kommet til hello-world & lign.

Nu kunne jeg godt tænke mig at bruge noget fra en Oracle database, men hvordan?

Et eksempel ville være toppen.
Evt. noget med at man i sin asp-fil skriver :

set objref = server.CreateObject("DB.lookup")
    Response.Write(objref.hent("tabelnavn", "feltnavn"))

Funktionen skal så hente og udskrive indholdet af Feltet: "feltnavn" i tabelen: "tabelnavn"
Avatar billede overload.dk Nybegynder
15. juni 2000 - 17:19 #1
jeg er lige med på en lytter :)
Avatar billede mawtex Nybegynder
18. juli 2000 - 20:06 #2
Well - du bør jo nok kikke på ActiveX Data Objects (ADO).

Hvis ADO er nyt for dig, vil jeg foreslå at de venter lidt med Oracle, og i stedet kaster dig over Access. Hvis du en dag skal lave en mere seriøs løsning vil jeg anbefale SQL Server. Efter min mening er Oracle kun lækker hvis du har en gruppe DBA'ere til at slås med den.

Det du efterlyser har én enkelt lille fejl - du forventer at modtage én værdi, men hvis tabellen man læser fra har flere rækker data, vil du på basis af de ovenstående kriterier modtage flere værdier (én værdi for hver række).

Her er et eksempel på en funktion der gør noget i stil med det du efterlyser, der returneres blot et array (med 2 dimmensioner):

Lav et nyt ActiveX dll projekt i VB. Kald projektet DB. Slå "Microsoft ActiveX Data Objects 2.1 Library" til via "Project | References..." - så kan du referere ADOs objektstruktur. Navngiv din klasse "lookup".


Public Function GetTableRows(strTablename As String, strColumnname As String) As Variant
On Error GoTo ExitHandler
    Dim objConnection As ADODB.Connection
    Dim objRsResult As ADODB.Recordset
    Dim strSqlCommand As String
   
    '' Build SQL command
    strSqlCommand = "SELECT " + strColumnname + " FROM " + strTablename
   
    '' Open databaseconnection and execute SQL
    Set objConnection = New ADODB.Connection
    objConnection.Open "DSN=someOdbcDsnName"
    Set objRsResult = objConnection.Execute(strSqlCommand)
   
    If Not objRsResult.EOF Then
        '' Return array:
        Lookup = objRsResult.GetRows()
    Else
        Lookup = Null
    End If
   
ExitHandler:
    '' Neat clean up:
    Set objRsResult = Nothing
    Set objConnection = Nothing

    '' Check for errors and raise a localized error:
    If Err.Number <> 0 Then
        Err.Raise vbObjectError + 1, "DB.Lookup", Err.Source + " (" + Err.Number + ")" + vbCrLf + Err.Description
    End If
End Function


Du skal have sat den rette "connection string" i forbindelse med kaldet objConnection.Open - f.eks. til navnet på en ODBC data source du har sat til at pege på din Access fil.

Din ASP kunne så se således ud (efter at din nylavede "db.dll" er blevet registreret på IIS-serveren):

set myObj = server.createobject("db.lookup")
arResult = myObj.GetTableRows( "fornavn, efternavn", "medlem")
If IsArray( arResult ) Then
    For i = 0 To Ubound( arResult, 2)
        Response.write arResult( 0, i ) & " " & arResult( 1, i ) & "<br>"
    Next
Else
    Response.write "Ingen poster i tabellen medlem fundet"
End If
Set myObj = Nothing

(Dette eksempel henter en liste af for- og efternavne fra tabellem "medlem" og udskriver dem på hver sin linie)

Dette komponent går lidt videre - du kan hente flere kolonner, men ellers er det lidt i stil med det du efterlyser.

NB! Det komponent du efterlyser virker "generisk", dvs. noget man kan bruge igen og igen, men der er en del ting at sige om dén tankegang:
- performance går ned, hvis du laver flere kald op i komponentet, da du hver gang etablerer en ny forbindelse til databasen
- du bør i praksis have en måde hvorpå du kan ændre den connection string som ADO benytter - her er den kodet direkte ind i din komponent (svært at vedligeholde).
- generiske komponenter der skal spille sammen med anden funktionalitet kommer ofte til kort, hvis man ikke har tænkt sig meget grundigt om, og været god til at gætte hvad fremtiden måtte bringe af krav.
- skræddersyede løsninger bør per definition køre hurtigere og skabe en mere logisk objektstruktur. Reelt set indeholdet ovenstående komponent kun data-logik, mens gui- og forretnings-logik må forventes at køre i ASP. ASP bør fra en puritansk synsvinkel ikke indeholde forretnings-logik.

Jeg håber det kan bruges til noget.
Avatar billede tonkin Nybegynder
15. august 2000 - 13:09 #3
Hvad hvis jeg vil bruge en SQL Server i stedet for Access.

Hvad skal der så stå i:

objConnection.Open \"DSN=someOdbcDsnName\"

</Tonkin>
Avatar billede mawtex Nybegynder
16. august 2000 - 10:33 #4
Der skal lidt mere på banen.

Hvis du vil forbinde dig via ODBC skal du angive

objConnection.Open \"DSN=someOdbcDsnName;UID=username;PWD=password\"

Du kan også slippe for odbc og gå direkte på følgende måde:

objConnection.Open \"Provider=SQLOLEDB;SERVER=SqlServerName;UID=username;Pwd=password\"

(Dette forudsætter at den bruger du angiver har den ønskede database sat som default - ellers bør du også tilføje \";Database=databasenavn\")

Bemærk at du hér har brugernavn og kodeord inde i billedet, og at det efterhånden er blevet en tradition at Microsoft opdager nye huller der tillader folk at hente ASP-kildekoden - hvilket betyder at man _aldrig_ bør gemme oplysninger som ovenstående i ASP eller ASA filer.

Gem f.eks. oplysningerne i registreringsdatabasen, og lad dine komponenter (evt. ASP-filer) læse oplysningen her fra. Fordelen er dels sikkerhed, dels at oplysningen ligger ét sted.

Marcus
Avatar billede tonkin Nybegynder
16. august 2000 - 10:41 #5
Hey !!!
Det kom jeg også mere eller mindre selv frem til efter at have rodet lidt med det i aftes.
Men jeg kan ikke få dit lille eksempel (ovenstående) til at virke.

Hvordan returnerer du dit array fra COM-objektet tilbage til ASP\'en ???

Det kan jeg ikke se!

//Tonkin
Avatar billede tonkin Nybegynder
16. august 2000 - 10:44 #6
Hvad er \'Lookup\':

If Not objRsResult.EOF Then
  \'\' Return array:
    Lookup = objRsResult.GetRows()
  Else
    Lookup = Null
End If

Skal den ikke gøres Public eller noget i den dur ???

//tonkin
Avatar billede mawtex Nybegynder
16. august 2000 - 10:46 #7
;-)  Jeg ændrede funktionsnavnet til sidst for at gøre eksemplet mere sigende - det missede jeg vist.

    If Not objRsResult.EOF Then
        \'\' Return array:
        Lookup = objRsResult.GetRows()
    Else
        Lookup = Null
    End If
   
Skal være

    If Not objRsResult.EOF Then
        \'\' Return array:
        GetTableRows = objRsResult.GetRows()
    Else
        GetTableRows = Null
    End If

RecordSet funktionen \"GetRows()\" er en lille guldklump, der dels gør tingene _meget_ hurtigere og dels sikrer at du kan lukke databaseforbindelsen inden du begynder at skrive.

Avatar billede tonkin Nybegynder
16. august 2000 - 10:46 #8
Jeg fatter godt hvad der sker med Lookup, bare ikke hvordan informationerne skal kunne komme ud af dll\'en og tilbage til ASP\'en.

//tonkin (Alle gode gange tre)
Avatar billede mawtex Nybegynder
16. august 2000 - 10:49 #9
Det er

    GetTableRows = objRsResult.GetRows()

der sørger for at ASP for fat i dit array.
   
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
Kategori
Kurser inden for grundlæggende programmering

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