Är det nån som vet varför en funktion i vb kan returnera ett ADODB.Recordset, men inte ett DAO.Recordset? <br>För att läsa inlägget, klicka här: Klicka här Jag tror att jag vet vad jag gjort för fel Andreas, förstår inte riktigt ditt inlägg..... <br>För att läsa inlägget, klicka här: Klicka här Vad händer? <br>För att läsa inlägget, klicka här: Klicka här Har löst problemet PRoblemet är att i DAO måste du hålla objekt herkin vid liv. Efter som din workspace bara lever i funktionen kommer då oxå bara ditt recordset att göra det. Tack Anders! Du kan göra vilket som. Gjorde bara så i exemplet. Men du måste hålla anslutningen öppen så länge du använder recordsetet. Därför är det mer lämpligt att göra så i DAO. Blir så mycket kod. Beror på hur man prioriterar prestanda.Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Det fungerar att ha en funktion i en modul som returnerar ADODB, men ändrar jag det till DAO så dör recordset innan jag har skickat tillbaks det med funktionen.
Måste tyvärr använda DAO objektet.....
TIASv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Sv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Jag tror att jag glömt Set FuncName = rs i slutet av funktionen det står säkert bara "FuncName = rs". skall kolla imorgonSv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Problemen kvarstår, det verkar inte som om jag kan ha en function som returnerar ett dao.recordset.
Kallande funktion
<code>
Private Sub Command5_Click()
Dim rsx As dao.Recordset
Set rsx = zz()
lbl.Caption = ""
'************
' raden nedanför får jag felmeddelande
' Error 3420
' Object invalid or no longer set
'************
Do Until rsx.EOF
lbl.Caption = lbl.Caption & rsx(0) & vbCrLf
rsx.MoveNext
Loop
rsx.Close
</code>
Dbaccess function
<code>
Function zz() As dao.Recordset
Dim db As dao.Database
Dim ws As dao.Workspace
Dim rs As dao.Recordset
Set ws = DBEngine.CreateWorkspace("", "", "", dbUseODBC)
' måste använda fildsn eftersom vi inte kan installera dsn på servern
Set db = ws.OpenConnection("", dbDriverNoPrompt, False, "ODBC;DATABASE=ass_test;FileDSN=" & App.Path & "\waydsn.dsn;UID=sa;PWD=")
'Set rs = db.OpenRecordset("select * from ort") ', DAO.dbOpenDynaset, DAO.dbExecDirect, DAO.dbOptimisticValue)
Set rs = db.OpenRecordset("sp_WAY_SearchUser 'p'")
' Här har jag ett recordset som innehåller data
Set zz = rs
End Function
</code>Sv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Sv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Varför lägger ni in en länk till detta inlägg?Sv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Sv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Jag skickar in en array till funktionen som jag fyller genom att köra: rsRecordset.GetRows()
/UffeSv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Testa:
<code>
Private db As dao.Database
Private ws As dao.Workspace
Private Sub Form_Load()
Set ws = DBEngine.CreateWorkspace("", "", "", dbUseODBC)
Set db = ws.OpenConnection("", dbDriverNoPrompt, False, "ODBC;DATABASE=ass_test;FileDSN=" & App.Path & "\waydsn.dsn;UID=sa;PWD=")
End Sub
Private Sub Form_UnLoad()
db.Close
Set db = Nothing
ws.Close
Set ws = Nothing
End Sub
Private Sub Command5_Click()
Dim rsx As dao.Recordset
Set rsx = zz(db)
lbl.Caption = ""
Do Until rsx.EOF
lbl.Caption = lbl.Caption & rsx(0) & vbCrLf
rsx.MoveNext
Loop
rsx.Close
End Sub
Function zz(db As dao.Database) As dao.Recordset
Set zz = db.OpenRecordset("sp_WAY_SearchUser 'p'")
End Function
</code>Sv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
Detta skulle kunna vara en lösning, men innebär inte denna lösning att man håller en connection mot databasen öppen hela tiden programmet är igång?
Det jag lärt både hör på Pellesoft och nästan överallt annars är väl principen att öppna connection sent, och stänga den fort, eller beter sig Workspace objektet sig annorlunda?Sv: Funktion kan returnera ADODB.Recordset men ej DAO.Recordset?
<code>
Private Sub Form_Load()
End Sub
Private Sub Form_UnLoad()
End Sub
Private Sub Command5_Click()
Dim ws As dao.Workspace
Dim db As dao.Database
Dim rsx As dao.Recordset
Set ws = DBEngine.CreateWorkspace("", "", "", dbUseODBC)
Set db = ws.OpenConnection("", dbDriverNoPrompt, False, "ODBC;DATABASE=ass_test;FileDSN=" & App.Path & "\waydsn.dsn;UID=sa;PWD=")
Set rsx = zz(db)
lbl.Caption = ""
Do Until rsx.EOF
lbl.Caption = lbl.Caption & rsx(0) & vbCrLf
rsx.MoveNext
Loop
rsx.Close
db.Close
Set db = Nothing
ws.Close
Set ws = Nothing
End Sub
Function zz(db As dao.Database) As dao.Recordset
Set zz = db.OpenRecordset("sp_WAY_SearchUser 'p'")
End Function
</code>
Att varje gång öppna och stänga recordsetet blir ju då lite knöligt. Kan ju göra så att man kapslar det i en funktion.