none
Отобразить набор в гриде RRS feed

  • Вопрос

  • Добрый день! Работаю с ADODB подключением, так как считаю его намного быстрее. Собственно код:

            rs = Nothing
            rs = New ADODB.Recordset
            rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
     
            SqlCom = "SELECT journal.ID, journal.RDate, journal.Patient, journal.Age, journal.HomeAddress, LPO.LPONAME, journal.Diagnosis, journal.BloodTypeReceipt, journal.BloodType, journal.RhesusFactor, journal.ExistenceAntibodies, journal.Note FROM LPO INNER JOIN journal ON LPO.LPOID = journal.LPName"
            rs.Open(SqlCom, conn, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockBatchOptimistic)
            MsgBox(rs.RecordCount)
     
            DataGridView1.DataSource = rs

    Работает! Но не отображается созданный набор в DataGridViev, что не так делаю или не дописываю? Visual Basic.NET 2012 среда .NET 4.5

    23 июня 2013 г. 9:35

Ответы

  • Тогда это можно обяснить так. REcordset считывает строки бд один за другим пока не достигнет конца. Один за одним он обращается к серверу. Поэтому размеры не увеличиваются. Зато 1000000 раз обратится к базе. А OleDbConnection'ом он разом все загружает в ваш комп, то есть в оперативку. оттого она раздувается. Тогда предлагаю не оперировать всей базой а загружать лишь необходимую информацию. В любом случае 1000000 записей в гриде вам не понадобится
    • Изменено Higgs.Boson 23 июня 2013 г. 12:12 Корректировака
    • Помечено в качестве ответа inv.DS 23 июня 2013 г. 12:30
    23 июня 2013 г. 12:11

Все ответы

  • Это невозможно сделать. Нельзя использовать ADODB.Recordset как источник данных. Тут указано

    DataGridView поддерживает модель привязки данных Windows Forms. Это означает, что источник данных может быть любого типа, который реализует один из следующих интерфейсов:

    А Ваш  ADODB.Recordset таковым не является. Напишите свой код который будет проходить весь  ADODB.Recordset и будет вставлять все записи в датагрид. Вот Вам также ссылка, надеюсь Вы найдете в ней для себя полезное

    23 июня 2013 г. 11:23

  • Извините, я конечно понимаю, что ADODB как бы не пик решения, но у меня в наборе получается что-то около 1.000.000 записей из базы данных. Если я использую OLEDB тогда .EXE файл становится в памяти размеров от 100 до 250 мегабайт!

    В чем может быть ошибка!? Как же мне тогда преобразовать в понятное для DataGridView? Подскажите!?

    23 июня 2013 г. 11:34
  • Про размер не могу сказать, почему у Вас так много получается. Насколько я понял вы используете библиотеку ADO. Попробуйте использовать ADO.NET
    • Изменено Higgs.Boson 23 июня 2013 г. 11:54 ...ак
    23 июня 2013 г. 11:53
  • Использую вот так:

        Public Con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\Database.accdb" & ";Persist Security Info=False;")    Public SqlCom As OleDb.OleDbCommand    Public DT As New Data.DataTable    Public DA As OleDb.OleDbDataAdapter


    Потом сам запрос и помещаю данные в DataGridView:

            DT.Clear()
            SqlCom = New OleDb.OleDbCommand("SELECT * FROM journal", Con) 
            Con.Open()
            SqlCom.ExecuteNonQuery()
            DA = New OleDb.OleDbDataAdapter(SqlCom)
            DA.Fill(DT)
            Me.DataGridView1.DataSource = DT
            Con.Close()

    На данном этапе работает отлично! Но когда загружаю основную базу с более 1 миллиона строками, все .EXE начинает весить приличные объемы.

    Что же все таки не так? Может покажите как работать с OLEDB? И ADODB в .NET?

    23 июня 2013 г. 11:56
  • В смысле весить? Я так понимаю программа начинает занимать столько оперативной памяти?
    23 июня 2013 г. 12:00
  • Мне показалось что вы про exe на жестком диске говорите. Наверное хотели сказать что в оперативке он начинает занимать 250 мб? Тогда это вполне объяснимо

    Второй вопрос и Вы хотите миллион записей загрузить в датагрид??

    • Изменено Higgs.Boson 23 июня 2013 г. 12:04 Исправление
    23 июня 2013 г. 12:01
  • Да именно в оперативной памяти. Видел проекты писали на Delphi там смело как-то грузятся записи и миллионами. Так все же как быть с моей проблемой, можно примеры про OLEDB? И ADODB в .NET?

    в оперативке он начинает занимать 250 мб? Тогда это вполне объяснимо

    вот тут вкратце, так сказать, для самопознания. Почему тогда старенький Visual basic 6.0 в таком варианте максимум до 40 - 80 мегабайт .exe в оперативке загружается?

    23 июня 2013 г. 12:09
  • Тогда это можно обяснить так. REcordset считывает строки бд один за другим пока не достигнет конца. Один за одним он обращается к серверу. Поэтому размеры не увеличиваются. Зато 1000000 раз обратится к базе. А OleDbConnection'ом он разом все загружает в ваш комп, то есть в оперативку. оттого она раздувается. Тогда предлагаю не оперировать всей базой а загружать лишь необходимую информацию. В любом случае 1000000 записей в гриде вам не понадобится
    • Изменено Higgs.Boson 23 июня 2013 г. 12:12 Корректировака
    • Помечено в качестве ответа inv.DS 23 июня 2013 г. 12:30
    23 июня 2013 г. 12:11
  • Однако остается вопрос с ADODB он мне как-то роднее. Видел на MSDN пример как работали с ADODB и DataGridView можете показать пример?

    23 июня 2013 г. 12:18
  • Тут есть пример кода, использующий Recordset. Хотя у меня ощущение, что потом у Вас возникнет проблема с большим временем загрузки всех записей и в результате вся информация по записям у вас будет сохраняться в гриде, что приведет к увеличению ОП
    • Изменено Higgs.Boson 23 июня 2013 г. 12:36 ...в
    23 июня 2013 г. 12:35
  • Тот пример который я видел на MSDN показывал как создается набор с помощью ADODB.RecordSet потом он преобразовывается в понятные данные для GridView. Вот не могу его найти...
    23 июня 2013 г. 13:33
  • Если найдете, обязательно выложите ссылку, возможно кому-то это пригодится в будущем
    23 июня 2013 г. 14:17
  • Public Class Form1
        Public conn As New ADODB.Connection
        Public rs As New ADODB.Recordset
    
        Public DT As New Data.DataTable
        Public DA As OleDb.OleDbDataAdapter
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Call OpenDB()
    
            Dim DA As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter
            Dim DT As DataTable = New DataTable
    
            rs = New ADODB.Recordset
    
            rs.Open("select * from journal", conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
            DA.Fill(DT, rs)
            DataGridView1.DataSource = DT
            rs.Close()
    
    
        End Sub
    
        Sub OpenDB()
            On Error GoTo er
    
            conn = New ADODB.Connection
    
            conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
            conn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Database.accdb;Jet OLEDB:Database Password=454865a;")
    
            If conn.State = 1 Then
    
            Else
    
            End If
    
            Exit Sub
    er:     MsgBox(Err.Description & vbCrLf & "Код ошибки " & Err.Number, vbCritical, "Ошибка выполнения запроса") : End
        End Sub
    End Class

    Вот код, который работает с ADODB! Всем спасибо кто заинтересовался и главное кто отвечал!

    Да и при 1.000.000 всего 90 MB в памяти. Хотя в современное время на машинах стоят по 20 GB ОЗУ и более.

    • Изменено inv.DS 24 июня 2013 г. 2:24 Добавление
    • Предложено в качестве ответа Higgs.Boson 24 июня 2013 г. 4:04
    24 июня 2013 г. 2:20
  • 1. Вы не закрываете соединение. 

    2. Не очень понимаю как провайдер влияет на то, какой объем памяти занимает экземпляр DataTable. 

    3. Возвращать пользователю 1000000 записей это совсем не гуманно, и вообще сложно представить что он будет делать с таким объемом данных. Правильнее будет использовать пейджинг (если этот 1000000 необходим) или фильтры на стороне базы данных, которые будут возвращать адекватное число записей.

    24 июня 2013 г. 9:33
  • 1. Я привел пример кода, то есть полностью не обработанный. Закрывать соединение я принципиально не буду, так как в дальнейшем обрабатываются данные через данное открытое соединение. Открывать его по нескольку раз нет смысла.

    2. Влияет еще как! Вот скрин:

    Был опыт вообще не показывать набор записей весь. Но отпало по причинам упертости начальства. Им не доказать, что это не правильно! Вот приходится делать так...

    24 июня 2013 г. 9:55