Varför kan jag inte använda denna raden i en COM-funktion (dll-fil?) Du har inget Server objekt i Com-objektet. Så du menar att jag ska deklarera detta utanför alla funktioner, och använda samma databaskoppling till alla? CreateObject och New påverkar inte Late och early binding's. Det påverkas utav hur variablerna är deklarerade. För att använda early binding lägger man till referens till Microsoft ActiveX Data Objects (ADO) och deklarer variablerna som ADODB.Recordset. Kan du/ni ge något exempel på hur en ActiveX DLL med koppling till en Access databas kan se ut? Jag förstår fortfarande inte riktigt :) Här är ett exempelSnabb fråga om COM och ASP
<code>
Set DB_3 = Server.CreateObject("ADODB.Recordset")
</code>
Den klagar: "Object Required".. alla andra funktioner som inte innehåller något som ska hämtas ur en databas fungerar fint.
Här är hela koden:
<code>
Public Function GetUserName(userid)
'---
'FUNKTIONSBESKRIVELSE:
'Hämtar användarnamn efter användarid
'---
SQL = "SELECT Username FROM Users WHERE ID = " & userid
Set DB_3 = Server.CreateObject("ADODB.Recordset")
DB_3.Open SQL, "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.Mappath("database/SuYwqEb/forum.mdb") & "; Persist Security Info=False", 3
If Not DB_3.EOF Then
GetUserName = DB_3("Username")
Else
GetUserName = -1
End If
DB_3.Close
Set DB_3 = Nothing
End Function
</code>
Jag anropar den i ASP-koden genom följande:
<code>
set oFunctions_getNames = Server.CreateObject("Functions.getNames")
usrname = oFunctions_getNames.GetUserName(3)
</code>
DLL-filen heter "Functions.dll" och har en klassmodul som heter "getNames.cls".Sv: Snabb fråga om COM och ASP
Och undvik late binding dvs CreateObject i ett COM-objekt.
Använd early binding i stället, t.ex.
Dim Rs as ADODB.Recordset
Set Rs = New ADODB.Recordset
Det exekverar snabbare.
Du måste sätta en referens (Project References) till MS Data Access Components
OlaSv: Snabb fråga om COM och ASP
Gör inte det att jag inta kan köra två funktioner samtidigt (ex GetUserName(GetUserIDBySomething(Request.Form("exempel"))) ) ?
Jag har satt Project Reference, men det vill sig ändå inte. När jag kompilar (detta med koden utanför funktionerna) får jag felmeddelandet: "User-defined type not defined" och så markeras <code>DB as new ADODB.Recordset</code>, men inte <code>dim</code>.
Någon bra lösning på detta?Sv: Snabb fråga om COM och ASP
New och CreateObject påverkar hur man instansierar objektet.Sv: Snabb fråga om COM och ASP
Sv: Snabb fråga om COM och ASP
Projekt Typ: ActiveX DLL
Projekt Namn: ASPHelpDLL
Projetkt Referenser:
Class Name: ASPFunctions
<code>
Option Explicit
Public Function CreateAccessConnection(ByVal DataSource As String) As ADODB.Connection
Dim Connection As ADODB.Connection
Set Connection = New ADODB.Connection
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & DataSource
Set CreateAccessConnection = Connection
End Function
'**
'* FUNKTIONSBESKRIVELSE:
'* Hämtar användarnamn efter användarid
'**
Public Function GetUserName(ByVal Connection As ADODB.Connection, ByVal UserId As Long) As String
Dim strSQL As String
Dim Recordset As ADODB.Recordset
strSQL = "SELECT Username FROM Users WHERE ID = " & UserId
Set Recordset = New ADODB.Recordset
Recordset.Open strSQL, Connection, adOpenStatic, adLockReadOnly, adCmdText
If Recordset.EOF Then
GetUserName = -1
Else
GetUserName = "" & Recordset("Username")
End If
Recordset.Close
Set Recordset = Nothing
End Function
'**
'* FUNKTIONSBESKRIVELSE:
'* Hämtar användarid efter användarnamn
'**
Public Function GetUserId(ByVal Connection As ADODB.Connection, ByVal UserName As String) As Long
Dim strSQL As String
Dim Recordset As ADODB.Recordset
strSQL = "SELECT ID FROM Users WHERE Username = '" & Replace(UserId, "'", "''") & "'"
Set Recordset = New ADODB.Recordset
Recordset.Open strSQL, Connection, adOpenStatic, adLockReadOnly, adCmdText
If Recordset.EOF Then
GetUserId = -1
Else
GetUserId = Recordset("ID")
End If
Recordset.Close
Set Recordset = Nothing
End Function
</code>
ASP sida:
<code>
Dim c
Dim x
Set x = Server.CreateObject("ASPHelpDLL.ASPFunctions")
Set c = x.CreateAccessConnection(Server.Mappath("database/SuYwqEb/forum.mdb"))
Response.Write x.GetUserName(c, 5)
Response.Write x.GetUserId(c, "Nisse")
Set x = Nothing
c.Close
Set c = Nothing
</code>