Nahrávání ADO recordset do DataGridView   otázka

VB.NET, ADO.NET, WinForms, Databáze

Chtěl bych se zeptat, jestli s tímto problémem nemá někdo zkušenosti.

Zde je kód na vypsání recordsetu do DataGridView:

   Private Sub LoadData()
        MakeGridViewDoubleBuffered(dgv)

        ' Vyčistíme si tabulku
        dgv.Rows.Clear()

        ' Připojíme se do databáze
        Try
            ' Uděláme si select
            rs.Open("SELECT Cod, stupen, cislo, znak, DaVyd, nazev  FROM Nor_CZE", cn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockReadOnly)
        Catch ex As Exception
            MsgBox("Nepodařilo se připojit k serveru! Opakujte akci později.", MsgBoxStyle.Critical)
            Exit Sub
        End Try

        'Naplníme(DataGrid)
        For i = 0 To rs.RecordCount - 1
            row = New String() {rs.Fields("Cod").Value, rs.Fields("stupen").Value, rs.Fields("cislo").Value, rs.Fields("znak").Value, rs.Fields("DaVyd").Value, rs.Fields("nazev").Value}
            dgv.Rows.Add(row)
            rs2.Open("SELECT Id, UserId  FROM dbo.Ozn_Nor WHERE Id='" & rs.Fields("Cod").Value & "' AND UserId='" & CisloUzivatele & "'", cn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockReadOnly)
            If rs2.RecordCount > 0 Then
                dgv.Rows(i).DefaultCellStyle.BackColor = System.Drawing.SystemColors.Highlight
            End If
            ' Jestliže bude nějaká hodnota rovna něčemu, dáme si třeba jinou barvu
            If dgv.Rows(i).Cells(1).Value = "ČSN" Then
                dgv.Rows(i).DefaultCellStyle.BackColor = Color.Pink
            End If
            ' Uzravřeme rs2
            rs2.Close()
            ' A posuneme se dolů :)
            rs.MoveNext()
        Next
        rs.Close()
    End Sub

Všechno funguje tak jak má, ale problém je to, že když máme v recordsetu dejme tomu 60 000 záznamů trvá to cca 30 vteřin.

Není nějaká možnost, jak tuto dobu zkrátit ?

Už jsem toho zkoušel mnoho, ale nefungovalo snad nic.

Předem děkuji za jakoukoliv pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nahrávat 60000 řádků do mřížky je z uživatelského hlediska naprostý nesmysl. Ale zkus si pohrát s nastavením autosize šířky sloupců. Pokud ji vypneš nebo nařídíš počítači, aby šířku sloupceů počítal pouze pro řádky, které jsou visible, bude to rychlejší.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

neni rozumnejsi pouzit:

bindingsource.datasource = rs

dgv.datasouce = bindingsource

a na tu barvu dgv.CellPainting event

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím,

Zkusil bych následující:¨

A. Zkontrolovat indexy DB tabulek

B. Je-li problém SQL příkaz

„Vnitřní“ recordset (rs2) není nejvhodnější řešení. Nahradil bych ho následujícím

SELECT 0 AS nIS, Cod, stupen, cislo, znak, DaVyd, nazev FROM Nor_CZE AS a

WHERE 1 AND EXISTS (SELECT * FROM dbo.Ozn_Nor AS b WHERE b.Id = a.Cod AND b.UserId='" & CisloUzivatele & ")'

UNION

SELECT 1 AS nIS, Cod, stupen, cislo, znak, DaVyd, nazev

FROM Nor_CZE AS a

WHERE 1 AND NOT EXISTS

(SELECT * FROM dbo.Ozn_Nor AS b WHERE b.Id = a.Cod AND b.UserId='" & CisloUzivatele & ")'

ORDER BY něco

Nebo

SELECT DISTINCT b.Userid, Cod, stupen, cislo, znak, DaVyd,nazev

FROM Nor_CZE AS a

LEFT JOIN dbo.Ozn_Nor AS b ON b.Id = a. Cod AND b.UserId='" & CisloUzivatele & "'

WHERE 1

Položka Userid IS NULL nebo není NULL

C. Je-li problém použití DataGridView (.Rows.Add atd) pak rada výše (bindingsource, .CellPainting event.)

D. Nepomůže-li nic z výše uvedeného - redukovat počet zobrazovaných řádků:

a. Stránkování

b. Omezit filtrem

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback