Hej Testa Istället: Hej Andreas Tycker din kod är lite skum:<br> Hej & tack Förslagsvis via en query i sql eller sammanräkning efter att du läst ut din DAO är i regel mycket snabbare än ADO mot JET och Access-databaser just därför att DAO är utvecklat för att fungera bra mot Access medan ADO är en teknik som innehåller mycket mer funktionalitet och är mer flexibel och därmed långsammare mot Access. De förändringar du kan göra rent kodmässigt kommer inte att ge samma prestanda som samma kod med DAO ger. du använder dig av en "gammal" jet driver. Tycker att du borde uppdatera till nyaste versionen av JET (inkl. sp). DAO använder sig dirket av ODBC medans ADO använder sig av OLE DB ... om man kör dirket med OLE DB kan du få mycket bättre prestanda än med DAO.. hoppa dessutom över att skriva rs!fält .. använd istället rs.fields("fält").value eller explicita fält objekt .. då har inte dao en chans Lite synpunkter på din kod:<br> Om man bortser från defakto att man inte kan hitta på en bra anlednign att öppna ett rs som uppdaterbart om man inte skall uppdatera det så har jag en fråga: Uppdaterbart kräver mer resurser. Så man bör undvika det om man inte behöver det. Hej Frågan är vad du bygger ditt påstående på om att DAO inte har en chans......DAO var designat helt för JET-motorn och har enligt mina egna tester betydligt bättre prestanda mot Access-databaser med JET-motorn än vad ADO har genom OLE DB. Eftersom frågan från början handlade om en Access-databas så kan jag inte ur prestandasynpunkt råda honom att använda ADO framför DAO. Det är dock så att ADO är en nyare teknik som är mer flexibel och inte bunden till JET-motorn utan är avsedd att användas mot en mängd olika datakällor. Om det inte finns något behov för att kunna ta del av ADO:s generellt utökade funktionalitet skulle jag ur prestandasynpunkt använda DAO.Långsamt med ADO!!!
Jag håller på att lära mig databas hantering med ADO men tycker att det går sämre med ADO än med gammla DAO.
Om jag kör det här så tar det några långsama sekunder extra med ADO.
Dim rs As New ADODB.Recordset
Dim DB As ADODB.Connection
Set DB = New ADODB.Connection
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
DB.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source= '" & FrmDataLoc.Text1(0).Text & "' ;Persist Security Info=False"
DB.Open
rs.Source = ("select(MODELL),(NAMN),(ADRESS1),(POSTNUMMER),(POSTADRESS),(BRUKARE),(TELEFON),(ID) from GRUND where REG_NUMMER ='" & txtRegnr(0).Text & "'")
Set rs.ActiveConnection = DB
rs.Open
Do Until rs.EOF
Text1(1).Text = rs!MODELL & vbNullString
Text1(2).Text = rs!Namn & vbNullString
Text1(3).Text = rs!ADRESS1 & vbNullString
Text1(4).Text = rs!Postnummer & vbNullString
Text1(5).Text = rs!Postadress & vbNullString
Text1(6).Text = rs!BRUKARE & vbNullString
Text1(7).Text = rs!TELEFON & vbNullString
Text1(8).Text = rs!Id & vbNullString
rs.MoveNext
Loop
Vad gör jag för fel ?
Jag kör mot en Access databas i ett nätverk.
Hälsningar
TobbeSv: Långsamt med ADO!!!
Dim strSQL as String
Dim rs As ADODB.Recordset
Dim DB As ADODB.Connection
Set DB = New ADODB.Connection
DB.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source= '" & FrmDataLoc.Text1(0).Text & "' ;Persist Security Info=False"
strSQL = "SELECT [MODELL], [NAMN], [ADRESS1], [POSTNUMMER], [POSTADRESS], [BRUKARE], [TELEFON], [ID]" & vbCrLf & _
"FROM [GRUND]" & vbCrLf & _
"WHERE [REG_NUMMER] ='" & txtRegnr(0).Text & "'"
Set rs = New ADODB.Recordset
rs.Open strSQL, DB
Do Until rs.EOF
Text1(1).Text = rs!MODELL & vbNullString
Text1(2).Text = rs!Namn & vbNullString
Text1(3).Text = rs!ADRESS1 & vbNullString
Text1(4).Text = rs!Postnummer & vbNullString
Text1(5).Text = rs!Postadress & vbNullString
Text1(6).Text = rs!BRUKARE & vbNullString
Text1(7).Text = rs!TELEFON & vbNullString
Text1(8).Text = rs!Id & vbNullString
rs.MoveNext
LoopSv: Långsamt med ADO!!!
Jag testade din kod men då verkar inte rs.recordcount funka
t.ex
If KeyAscii = 13 Then
MousePointer = vbHourglass
Dim strSQL As String
Dim rs As ADODB.Recordset
Dim db As ADODB.Connection
Set db = New ADODB.Connection
db.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source='" & FrmDataLoc.Text1(1).Text & "';Jet OLEDB:Database Password=XXXX"
strSQL = "SELECT [Namn] FROM [EmplID] where [EmplId] = '" & txtLogon.Text & "'"
Set rs = New ADODB.Recordset
rs.Open strSQL, db
Do Until rs.EOF
LblUser.Caption = "Välkommen" & " " & rs!Namn & vbNullString
rs.MoveNext
Loop
If rs.RecordCount < 1 Then
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
LblUser.Caption = "Fel användar identitet eller så saknas användaren försök igen ?"
txtLogon.SetFocus
txtLogon.SelStart = 0
txtLogon.SelLength = Len(txtLogon.Text)
MousePointer = vbNormal
Else
Combo1.Enabled = True
Combo1.SetFocus
End If
End If
MousePointer = vbNormal
Exit Sub
Funkade med min gammla kod. Skall man ändra på re.recordcout ?
Hälsningar
TobbeSv: Långsamt med ADO!!!
* Varför lopar du igenom recordsetet?<br>
* Varför stänger du bara objekten om inlogning misslyckades?
Jag skulle vilja ändradet till:
<code>
Dim strSQL As String
Dim rs As ADODB.Recordset
Dim db As ADODB.Connection
If KeyAscii = 13 Then
MousePointer = vbHourglass
Set db = New ADODB.Connection
db.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source='" & FrmDataLoc.Text1(1).Text & "';Jet OLEDB:Database Password=XXXX"
strSQL = "SELECT [Namn] FROM [EmplID] where [EmplId] = '" & txtLogon.Text & "'"
Set rs = New ADODB.Recordset
rs.Open strSQL, db
If rs.EOF Then
LblUser.Caption = "Fel användar identitet eller så saknas användaren försök igen ?"
Combo1.Enabled = False
txtLogon.SetFocus
txtLogon.SelStart = 0
txtLogon.SelLength = Len(txtLogon.Text)
Else
LblUser.Caption = "Välkommen " & rs!Namn
Combo1.Enabled = True
Combo1.SetFocus
End If
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
MousePointer = vbNormal
End If
</code>
Svar på din fråga är: Visa cursor känner inte till antalet poster i ett recordset. Det retunerar då RecordCount = 0 om inga poster finns eller RecordCount = -1 om poster finns. Deta gäller för t.ex en ForwardOnly Cursor. Man kan komma runt detta genom att t.ex använda cursor på clienten istället för servern vilket är standard. Sv: Långsamt med ADO!!!
Jag testade din kod och det verkar som det går både smidigare och snabbare skall testa i nätverket i morgon.
Men det där med rs.recordcount låter inte bra, hur ska man få reda på hur många poster det finns t,ex med samma datum eller tider.
Vad min skumma kod kommer i från vet jag inte förmodligen ett hopkok från pellesoft.nu´s forum och div böcker !!!!!.
Hälsningar
Tobbe
Sv: Långsamt med ADO!!!
data i variabler...
/EmmaSv: Långsamt med ADO!!!
Sv: Långsamt med ADO!!!
Så istället för att köra:
Provider=Microsoft.Jet.OLEDB.3.51;
borde du köra:
Provider=Microsoft.Jet.OLEDB.4.0;
som är en bättre, säkrare och snabbare än 3.51
Det med att inte recordcount funkar beror på att du öppnar recordsetet med default värden för hur cursortype och locktype. Du får säkerligen tillbaka -1 som det nu är öppnat.
du borde öppna recordsetet på detta viset:
rs.Open strSQL, db, 1, 3
för att recordcount m.m ska kunna funka.
För att kunna öka prestandan mer så kan man "spara" recordsetet på client-sidan (disconnected recordset)
Testa skapandet av recordsetet på detta viset:
Set rs = New ADODB.Recordset
Wtih rs
.ActiveConnection = db
.Source = strSQL
.CursorLocation = adUseClient
.CursorType = 1
.LockType = 3
.Open
.ActiveConnection = Nothing
End With
vill man inte räkna hur många poster som returneras, inga behov att uppdatera recordsetet så bör CursorType vara = 0 och LockType = 1
cya,
PatrikBSv: Långsamt med ADO!!!
Sv: Långsamt med ADO!!!
* With satsen har ingen funktion ur prestanda synpunkt i detta fallet.<br>
* Minska antalet procedur anrop genom att använda open metoden. Ger bättre prestande helst när det gäller "out of process" anrop(t.ex word eller excel).<br>
* Namngivna konstaner är mer lätt lästa.<br>
<br>
Om man vill skapa ett uppdaterbart "Disconnected recordset" bör man använda adLockBatchOptimistic låsning.<br>
<br>
Skrivskyddat recordset:
<code>
Dim strSQL As String
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open strSQL, db, adOpenStatic, adLockReadOnly
Set rs.ActiveConnection = Nothing
</code>
<br>
Uppdaterbart recordset:
<code>
Dim strSQL As String
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open strSQL, db, adOpenKeyset, adLockBatchOptimistic
Set rs.ActiveConnection = Nothing
</code>Sv: Långsamt med ADO!!!
Är det ngn prestandaskillnad på ett uppdaterbart resp skrivskyddat rs?Sv: Långsamt med ADO!!!
Sv: Långsamt med ADO!!!
Ms Jet 4,0 funkar den bättre mot Access97 än MS Jet 3.51 det var någon som sa att den är långsammare än 3.51 p.g.a att den laddar mera onödiga saker som en vanlig vb mot access97 inte behöver.?????
TobbeSv: Långsamt med ADO!!!