Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Навагация записей, справочные таблицы, память и т.д. / 12 сообщений из 12, страница 1 из 1
19.06.2006, 10:04
    #33798778
Vw
Vw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
Помагите разобраться, покритекуйте, поправьте...
Пишу своё первое приложение VB.Net + sql2005через ado.Net.
Очень много накопилось вопросов на которых трудно найти где либо ответы.
Вот к примеру.
Разработал простеньй класс для работы с данными(код ниже).
Принцип такой.
Основная часьт таблиц в бд представленны в виде справочных и организована так:
Чтобы Убыстрить работу приложения и поиска записей
Создаю DataTable создаю в ней только необходимые атрибуты и заполняю её датаридером, те.
для таблицы клиентов это Будет
Id-PK
Surname-фамилия
Name1,Name2 - имя, отчество
Есс-но таблица содержит гораздо больше атрибуто тип Датарожд. Паспортные данные и тд. Но для индефикации клиента в небольшой БД я думаю достаточно.
Далее на основание этой таблички создаем справочник, где организовываем систему фильтрации и поиска. Ну и вешаем на какое либо событие справочника открытие самой формы где редактируются все атрибуты таблицы, где есть дата адаптер.
Примерно вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
Option Strict Off
Option Explicit On

Imports System.Data.SqlClient
Imports System.Data
Public Class RdrSprCients

    Private Shared Dtable As DataTable
    Public Sub New()
        If IsNothing(Dtable) Then update()
    End Sub
    Public ReadOnly Property Dt() As DataTable
        Get
            Return Dtable
        End Get
    End Property
    Private Shared Sub CreateDt()

        Dtable = New DataTable

        Dim columnID As DataColumn = New System.Data.DataColumn("ID", GetType(Integer), Nothing, System.Data.MappingType.Element)
        columnID.AllowDBNull = False
        columnID.Unique = True
        Dtable.Columns.Add(columnID)

        Dim SurName As DataColumn = New System.Data.DataColumn("SurName", GetType(String), Nothing, System.Data.MappingType.Element)
        SurName.AllowDBNull = False
        SurName.MaxLength =  50 
        Dtable.Columns.Add(SurName)


        Dim Name1 As DataColumn = New System.Data.DataColumn("Name1", GetType(String), Nothing, System.Data.MappingType.Element)
        Name1.AllowDBNull = False
        Name1.MaxLength =  50 
        Dtable.Columns.Add(Name1)

        Dim Name2 As DataColumn = New System.Data.DataColumn("Name2", GetType(String), Nothing, System.Data.MappingType.Element)
        Name2.AllowDBNull = True
        Name2.MaxLength =  50 
        Dtable.Columns.Add(Name2)

        Dim pk( 0 ) As DataColumn
        pk( 0 ) = Dtable.Columns("ID")
        Dtable.PrimaryKey = pk
    End Sub
    Public Shared ReadOnly Property RdrSprDt() As DataTable
        Get
            Return Dtable
        End Get
    End Property

    Public Shared Sub update()
        Try
            If IsNothing(Dtable) Then
                CreateDt()
            Else
                Dtable.Dispose()
                CreateDt()
            End If
            Dim conn As New SqlConnection(ProjTur.Settings.Default.ConnectionString)
            If conn.State <> ConnectionState.Open Then conn.Open()
            Dim cmd As New SqlCommand("select Id,SurName,Name1,Name2 From TblClients order by SurName", conn)
            Dim rdr As SqlDataReader = cmd.ExecuteReader()
            With rdr
                While .Read
                    Dim m As DataRow 'строка 
                    m = Dtable.NewRow
                    m("id") = .GetInt32(0)
                    m("SurName") = .GetString(1)
                    m("Name1") = .GetString(2)
                    If .IsDBNull(3) Then
                        m("Name2") = ""
                    Else
                        m("Name2") = .GetString(3)
                    End If

                    Dtable.Rows.Add(m)
                End While
            End With
            rdr.Close()
            rdr = Nothing
            cmd = Nothing
            conn.Close()

        Catch ex As Exception
            MsgAddRow("Ошибка: " & ex.Message.ToString, MsgErr, Err.Number, "RdrSprClients.update")
        End Try

    End Sub
    Public Shared Sub Delete(ByVal arg As String)
        Try
            If Show("Действительно удалить ?", My.Application.Info.ProductName, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) _
            = DialogResult.Cancel Then Return
            Dim conn As New SqlConnection(ProjTur.Settings.Default.ConnectionString)
            If conn.State <> ConnectionState.Open Then conn.Open()
            Dim cmd As New SqlCommand("delete From TblClients where id=" & arg, conn)
            cmd.ExecuteNonQuery()
            MsgAddRow("Сведения о клиенте '" & Lookup(arg) & "' удалены!", MsgOk)
            cmd = Nothing
            conn.Close()
        Catch ex As Exception
            MsgAddRow("Ошибка: " & ex.Message.ToString, MsgErr, Err.Number, "RdrSprClients.delete")
        End Try

    End Sub
    '  Public Shared Function ТLookup(ByVal arg As Integer, Optional ByVal mode As Boolean = False) As Object
    ' If IsNothing(arg) Or arg = 0 Then Return ""
    ' Dim DR As DataRow = Dtable.Rows.Find(arg)
    '  If mode = False Then Return
    'Return DR.Item("Surname") & " " & DR.Item("Name1") & " " & DR.Item("Name2")
    'End function
    Public Shared Function Lookup(ByVal arg As Integer, Optional ByVal FField As String = "Name") As String
        Dim conn1 As New SqlConnection(ProjTur.Settings.Default.ConnectionString)
        Dim RetVal As Object = ""
        If conn1.State <> ConnectionState.Open Then conn1.Open()
        Dim cmd As New SqlCommand("Select " & FField & " from TblClients where id=" & arg, conn1)
        cmd.CommandType = CommandType.Text
        Try
            RetVal = cmd.ExecuteScalar
        Catch ex As Exception
            MsgAddRow("Ошибка: " & ex.Message.ToString, MsgErr, Err.Number, "RdrSprClients.Lookup", arg)
        Finally
            conn1.Close()
            cmd = Nothing
        End Try
        Return RetVal

    End Function
End Class

Т.е принцип класса такой:
Реально создается одна DataTable c описанием Shared - Dtable,
но справочнику возвращается через свойство DT - её экземпляр.
Это для того чтобы не транжирить понапрасно память, т.к. справочников по клиентам в данный момент может быть открыто достаточно много и накаждого
создавать свой DataTable не очень считаю желательно.Хотя может я не прав.
Меня интересует.
Можно ли(желательно\нежелательно ) таким образом держать все таблицы бд(около 20)? Куда кэшируются записи таблиц, т.к. я не думаю чтоб они всё это время висели в памяти.
Как обоснован такой подход хранения записей... ресурсоемкость и т.д. слабые места...
Есть ли прощеты в моем коде...
Помагите, поправьте, посоветуйте -без вашей помощи никак
Для наглядности прикладываю картинку
...
Рейтинг: 0 / 0
19.06.2006, 12:27
    #33799329
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
1. Тут нет вообще кода ADO.NET. ДатаРидер - это фактически не ADO.NET, а просто вычитывание данных пожартным курсором.
АДО.NET начинается там, где идет работа с ДатаСетами, с ДатаВью, ДатаРоуВью, сортировки, фильтрации, всякий гимор с сеткми.
Это слишком простое приложение, чтоб тут можно было бы допустить просчеты.

2. Все что считано в хоть ДатаРидером, хоть ДатаАдаптером ВСЕГДА висит в памяти. Именно поэтому так легко грохнуть ЛЮБОЕ АДО.НЕТ приложение - дав ему данные больше размера физической памяти. Впрочем бороться с этим МОЖНО с помошью пейджинга.

3. Сами по себе АДО.НЕТ ничто без реальных контролов, работающих на нем - БиндингСорсе, БиндингНавигатор, ДатаГридВью и тд. - все проблемы применения АДО.НЕТ - именно в ЭТИХ контролах, а не в ДатаСете, как таковом. В этой проге ничего этого нет и просто нечего обсуждать в разделе АДО.НЕТ.

4.Для первого раза - отличная прога.
...
Рейтинг: 0 / 0
19.06.2006, 12:56
    #33799455
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
1. Тут нет вообще кода ADO.NET. ДатаРидер - это фактически не ADO.NET, а просто вычитывание данных пожартным курсором.
АДО.NET начинается там, где идет работа с ДатаСетами, с ДатаВью, ДатаРоуВью, сортировки, фильтрации, всякий гимор с сеткми.
Это слишком простое приложение, чтоб тут можно было бы допустить просчеты.

2. Все что считано в хоть ДатаРидером, хоть ДатаАдаптером ВСЕГДА висит в памяти. Именно поэтому так легко грохнуть ЛЮБОЕ АДО.НЕТ приложение - дав ему данные больше размера физической памяти. Впрочем бороться с этим МОЖНО с помошью пейджинга.

3. Сами по себе АДО.НЕТ ничто без реальных контролов, работающих на нем - БиндингСорсе, БиндингНавигатор, ДатаГридВью и тд. - все проблемы применения АДО.НЕТ - именно в ЭТИХ контролах, а не в ДатаСете, как таковом. В этой проге ничего этого нет и просто нечего обсуждать в разделе АДО.НЕТ.
по-моему полный бред
_______________________________________________________
Never ask users what they want, or they'll tell you.
...
Рейтинг: 0 / 0
19.06.2006, 13:34
    #33799632
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
Лиман Артём
по-моему полный бред

+1

Код: plaintext
 uid  =  S a

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
19.06.2006, 14:25
    #33799821
Vw
Vw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
И всё таки по существу.
Держать скажем 20 объектов DateTable в каждой записей от (10до ну 20000)
При условии что Столбцов не очень много, или даже название+индификатор
Как это отразится на памяти, быстродействии и тд.д?? И вооще схема моего алгоритма имеет право на существование?
...
Рейтинг: 0 / 0
19.06.2006, 16:20
    #33800315
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
20000 х 20 = 400 кб
ну умножьте еще на два для контроля (всякие ТаблеМапинг и прочая ерунда)...
о чем речь?

я на мощные тачки гружу тысяч по пять записей килобайт по 100 каждая смело и без пейджинга - только грузятся минут пять
вы что эту память кому-то налево продавать думаете? - она для того и вставлена в камп, чтоб в ней хранить эти ДатаСеты

А чтоб грузилось быстро и экономно - нужен пейджинг - ну не таких же обьемах как у вас....
Ну а насчет ИЗЪЯНОВ - я уже ответил - тут НЕТ алгоритма, к котором МОГУТ БЫТЬ изьяны - тут имеет место просто вычитывание обьектом CMD нескольких записей.
...
Рейтинг: 0 / 0
19.06.2006, 16:24
    #33800331
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
ЗЫ.
Я так понял ЛиманАртем и SA - достаточно неплохо разбираются в ADO.NET - не будете ли вы так любезны ответить на актуальную для меня проблему -
http://www.sql.ru/forum/actualthread.aspx?tid=305456
...
Рейтинг: 0 / 0
19.06.2006, 16:52
    #33800474
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
sysadm2000ЗЫ.
Я так понял ЛиманАртем и SA - достаточно неплохо разбираются в ADO.NET
имхо, не надо быть семи пядей во лбу, что бы понять, что то, что ты писал - полная охинея с начала и до конца (я про тот пост который цитировал)
...
Рейтинг: 0 / 0
19.06.2006, 17:17
    #33800606
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
Код: plaintext
что ты писал - полная охинея с начала и до конца 
Критикуешь ты уверенно...
Хотелось бы взглянуть насколько уверенно работаешь с данными в своих прогах....Можешь сюда какую-нидь свою форму по работе с данными прицепить?

Вот мне например не проблема, ща вот домучаю очередную форму (в которой сейчас не идет инициализация добавляемой строки) - и готов прямо в этот топик выложить...
...
Рейтинг: 0 / 0
19.06.2006, 17:25
    #33800648
Vw
Vw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
Да ладно вам прирекаться, все мы тут спецы:)
Правда кто в чём.
У меня еще вопросик назрел.
хочу в конструкцию
Код: plaintext
1.
2.
3.
4.
 Dim rdr As SqlDataReader = cmd.ExecuteReader()
            With rdr
                While .Read
                     End While
            End With
Вставлять Значение счетчика, для прогрессбара. Да и наверное его в другом потоке запускать..
Никто не связывался.
Я так понимаю нужно RecordsCount Для начала с сервера считывать ??
или може ещё варианты есть ?
...
Рейтинг: 0 / 0
19.06.2006, 17:25
    #33800649
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
sysadm2000Критикуешь ты уверенно...
констатация фатка не есть критика ;)
ЗЫ: было бы время, разложил бы тебе по полочкам в чём ты не прав, но его, времени, нет.
ЗЫЫ: бросаться кусками кода, того как я работаю с данными я не буду. Во-первых мне это совсем ни к чему; во-вторых, для того, что бы понять как я с ними работаю тебе еще надо многому поучиться Ado.Net ;)
ЗЫЫЫ: извините за скромность
...
Рейтинг: 0 / 0
20.06.2006, 00:35
    #33801346
Mr. GES
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Навагация записей, справочные таблицы, память и т.д.
Автору топика советую взять и прочитать книжку ADO.NET (автор Сеппа)
и всё встанет на свои места
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Навагация записей, справочные таблицы, память и т.д. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]