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
'' 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.
(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.
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 ???
;-) 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.
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.