Sitter och jobbar med ett bokningsprogram och stötte på lite prestandaproblem i samband med postbläddring. Efter varje navigering i mitt huvuddataset så anropas denna Sub för att fylla en datagrid med bokningsrader. Problemet är att detta tar otroligt lång tid (ca 2sekunder) även om det inte finns några rader eller bara ett fåtal rader i "dsBokningsRad.Tables("BokningRad")". Jag kan tänka mig att det som tar tid är att skapa objektet EgenRefAdapter. Prova att skapa detta tidigare och inte varje gång som du gör denna läsning, skapa det vid form_load t ex. Att skapa EgenRefAdapter endast en gång hjälper inte. IsConnecting = True Jag har gjort ett snabbt hack för att testa mot northwind. Om du har lust kan du testa detta för att se vilken prestanda du får och vi har samma kod att diskutera. Det ska gå blixtsnabbt (förutom 1a gången).Prestanda med DataGrid
Stored proceduren "get_Bokning_rad" tar ca. 10ms tid att köra.
GridBokningRad formatteras en gång i Form load.
Ideér?
<code>
Private Sub FyllBokningsRader()
Dim IsConnecting As Boolean
dsBokningsRad.Clear()
Dim sSql As String
sSql = "EXEC get_Bokning_rad " & BokningId
IsConnecting = True
While IsConnecting
Dim EgenRefAdapter As New SqlDataAdapter(sSql, DataBas.GetobjObj)
EgenRefAdapter.Fill(dsBokningsRad, "BokningRad")
IsConnecting = False
End While
GridBokningRad.DataSource = dsBokningsRad.Tables("BokningRad")
End sub
</code>Sv: Prestanda med DataGrid
Om inte detta hjälper kontrollera vilken rad det är som tar tid, är det t ex "EgenRefAdapter.Fill" eller kanske "GridBokningRad.DataSource"
Jag är också lite förbryllad över din While sats...Sv: Prestanda med DataGrid
Jag har klockat vad det är som tar tid och kommit fram till att det är fyllnigen av datagriden som tar tid.
<code>
GridBokningRad.DataSource = dsBokningsRad.Tables("BokningRad")
</code>
Vad är det som förbryllar dig med While satsen?Sv: Prestanda med DataGrid
While IsConnecting
Dim EgenRefAdapter As New SqlDataAdapter(sSql, DataBas.GetobjObj)
EgenRefAdapter.Fill(dsBokningsRad, "BokningRad")
IsConnecting = False
End While
jag kanske är helt pucko , men vad gör while satsen?
den går ju garanterat bara igenom den EN!!! gång eftersom "IsConnecting = false" efter första vändan....
//RogerSv: Prestanda med DataGrid
Obs, det är ingen best practice att skapa databas objekten varje gång, utan detta görs bäst genom att lägga objekten i din klass. Jag ville bara försöka att återskapa din kod och ditt problem så snarlikt som möjligt.
Skapa ett enkelt projekt med en grid en textbox för att skriva i customerid och en knapp med följande kod.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sSql = "EXEC CustOrdersOrders " & TextBox1.Text
Dim sCon = "data source=ALLANKN04\NETSDK;initial catalog=Northwind;integrated security=SSPI;" & _
"persist security info=True;workstation id=ALLANKN04;packet size=4096"
Dim myCon As New SqlConnection(sCon)
Dim myAdapt As New SqlDataAdapter(sSql, myCon)
Dim myDS As New DataSet()
Try
myAdapt.Fill(myDS, "CustOrdersOrders")
Catch ex As Exception
End Try
DataGrid1.DataSource = myDS.Tables("CustOrdersOrders")
End Sub
OBS! du måste förstås ange din egen connection string