Jag har en accessapplikation (access 2000) som bl.a. kör procedurer i en oracledatabas. Du använder: Helt rätt, det finns inget Oracle-forum. Men då har du ju eliminerat Oracle/SQL från det hela :) Testa att byta driver när du kör mot sql server. ODBC-drivern är inte lika snabb som sql server-drivern. Se om det ger resultat. Som du mycket riktigt påpekar är inte varabeltyperna optimala. Det finns med all säkerhet en OLEDB drivrutin även för Oracle, som du kan använda från Access. Låter som en framkomlig lösning. www.connectionstrings.comOracleprocedurer från Access (VB6)
Ett anrop kan se ut så här:
<code>
Function AngeTidviaSMS(WO_NO As Long, EMP_NO As String, HOURS As Long) As Boolean
Dim Cn As ADODB.Connection, CPw2 As ADODB.Command,Conn As String
Conn = "UID=UserID;PWD=PassWord;Driver={Microsoft ODBC for Oracle};SERVER=DB2"
Set Cn = New ADODB.Connection
With Cn
.ConnectionString = Conn
.CursorLocation = adUseClient
.Open
End With
Set CPw2 = New ADODB.Command
With CPw2
.ActiveConnection = Cn
.CommandText = "ObjOwner.Package.functionName"
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter(, adVarChar, adParamOutput, 2000, 10) 'Ev feltext
.Parameters.Append .CreateParameter(, adVarChar, adParamInput, 60) 'wo_no
.Parameters.Append .CreateParameter(, adVarChar, adParamInput, 60) 'emp_no
.Parameters.Append .CreateParameter(, adVarChar, adParamInput, 60) 'hours
End With
CPw2(1) = WO_NO
CPw2(2) = Format(EMP_NO, ">")
CPw2(3) = HOURS
CPw2.Execute
</code>
Alla rader ovan, fram till CPw2.Execute, går givetvis blixtsnabbt.
CPw2.Execute går för långsamt.
Man kan då givetvis dra slutsatsen att proceduren är felaktig i Oracle.
Men om man kör samma procedur från Oracle:s egna verktyg PL-SQL, går det betydligt snabbare.
Just exemplet ovan går inte så långsamt, jag tog just det exemplet för att visa hur jag kör en oracleprocedur.
Jag har andra procedurer som tar ca 2 sekunder på ovanstående sätt, men tar ca 0,2 sekunder från PL-SQL.
PL-SQL kan väl jämföras med SQL-serverns Query-analyser.
Om man från access vill uppdatera 20.000 poster i en SQL-tabell, tar det många sekunder.
Om man kör samma fråga från Query-analysern, tar det max någon sekund.
Dvs gemensam (seg) nämnare är väl ODBC.
Finns det något annat sätt att köra en oracleprocedur från Access än ovanstående via ODBC?
Något sätt som liknar att köra en fråga mot en SQL-server via Query-analyser isf via ODBC.
(Jag har även testat med Oracles egna ODBC-rutin, men med samma långsamma resultat)
/ MikaelSv: Oracleprocedurer från Access (VB6)
Access
Oracle
VB6 ? (är det inte VBA i Access...)
och ditt inlägg finns i Microsoft SQL Server forumet...
/mickeSv:Oracleprocedurer från Access (VB6)
Men detta berör även SQL-server.
Samma seghet via ODBC gäller även där.
Om det är Oracle eller SQL, VB6 eller Access spelar ingen roll.
Samma kodning, samma problem.
Jag tror att det finns bäst kompetens gällande detta, i detta forum.
/ MikaelSv: Oracleprocedurer från Access (VB6)
ODBC är ju inte känt för att vara snabbt...
/mickeSv:Oracleprocedurer från Access (VB6)
Andra saker jag såg när jag kollade på koden:
wo_no och hours ska väl inte skickas in som varchar till proceduren? Int skulle passa bättre eftersom de är av datatypen long.
Dessutom tycker jag att det är lite konstigt (och förmodligen prestandakrävande) att returnera en feltext som kan vara upp till 2000 tecken lång. En snyggare lösning är att ta hand om procedurens returvärde som i sql server är en int (vet dock ej om detta funkar i Oracle).
/PelleSv: Oracleprocedurer från Access (VB6)
Men problemet ligger inte där.
Om jag stegar koden, så ser man att segheten kommer vid .execute (som förväntat givetvis).
Om man kör samma kod via plSQL, går det betydligt snabbare.
Dvs själva funktionen i Oracle går snabbare via plSQL.
plSQL kan nog jämföras med QueryAnalysern mot SQL-server.
All kod exekveras lokalt på servern (?).
Jag antar att msjet då inte är inblandad.
Kan jag kommunicera med en OracleDB på annat sätt än via ODBC från Access, och då slitta msjet?
Du nämner sql-driver mot SQL-server, hur funkar det, var hittar man den?
Finns liknande driver för Oracle?
/ MikaelSv:Oracleprocedurer från Access (VB6)
Där du väljer hur du connectar dig, kan du säkert uppdatera från DSN till det du skall ha.
/mickeSv: Oracleprocedurer från Access (VB6)
Tyvärr vet jag inget om detta.
Har du något exempel på hur det skulle se ut?
Var kan man hitta en OLEDB-driver?
hittade detta
http://www.orafaq.com/faqmsvb.htm
/ MikaelSv:Oracleprocedurer från Access (VB6)
har jag inte kollat i själv, men det är en vanlig länk när man vill börja laborera med OLEDB.
/micke