powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Глюки в классах
9 сообщений из 9, страница 1 из 1
Глюки в классах
    #32477751
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала сорцы:
Интерфейс IDatabase
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Property Get Tables(Index) As clsEntry
End Property

Public Property Get TableCount() As Integer
End Property

Public Property Get Views(Index) As clsEntry
End Property

Public Property Get ViewCount() As Integer
End Property

Класс SQLServer
Код: 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.
Implements IDatabase

Private mColTables As Collection
Private mColViews As Collection

Private Sub Class_Initialize()
Dim rsTables As ADODB.Recordset
Dim rsFields As ADODB.Recordset
Dim x As Integer
Dim et As clsEntry
Dim ef As clsEntry
    Set mColTables = New Collection
    Set mColViews = New Collection
    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient
    cn.Open  "dsn="  & DSN
    GetRecordsets  "select Name from sysobjects where xtype='U' order by 1 ", rsTables
    While Not rsTables.EOF
        GetRecordsets  "select top 0  * from " & rsTables( 0 ).Value, rsFields
        Set et = New clsEntry
        et.Name = rsTables( 0 ).Value
        For x =  0  To rsFields.Fields.Count -  1 
            et.AddItem rsFields(x).Name, et
        Next x
        mColTables.Add et, rsTables( 0 ).Value
        rsTables.MoveNext
    Wend
    GetRecordsets  "select Name from sysobjects where xtype='V' order by 1 ", rsTables
    While Not rsTables.EOF
        GetRecordsets  "select top 0  * from " & rsTables( 0 ).Value, rsFields
        Set et = New clsEntry
        et.Name = rsTables( 0 ).Value
        For x =  0  To rsFields.Fields.Count -  1 
            et.AddItem rsFields(x).Name, et
        Next x
        mColViews.Add et, rsTables( 0 ).Value
        rsTables.MoveNext
    Wend
End Sub

Private Sub Class_Terminate()
    Set mColTables = Nothing
End Sub

Private Property Get IDatabase_TableCount() As Integer
    IDatabase_Count = mColTables.Count 'Здесь присваевается реальное кол-во позиций в коллекции
End Property

Private Property Get IDatabase_Tables(Index As Variant) As clsEntry
    Set IDatabase_Tables = mColTables(Index)
End Property

Private Property Get IDatabase_ViewCount() As Integer
    IDatabase_ViewCount = mColViews.Count
End Property

Private Property Get IDatabase_Views(Index As Variant) As clsEntry
    Set IDatabase_Views = mColViews(Index)
End Property


Все вроде бы просто. Но в форме есть процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub optTables_Click()
Dim x As Integer
Dim y As Integer
    TreeView1.Nodes.Clear
    If conn Is Nothing Then
        MsgBox  "No connection!" , vbExclamation
        Exit Sub
    End If

    For x =  1  To conn.TableCount 'ЗДЕСЬ TableCount возвращает ноль, вместо реального кол-ва

        TreeView1.Nodes.Add , ,  "t"  & x, conn.Tables(x).Name
        For y =  1  To conn.Tables(x).Count
            TreeView1.Nodes.Add  "t"  & x,  4 , , conn.Tables(x).Item(y).Name
        Next y
    Next x
End Sub


Причем при работе с ViewCount с количеством все в порядке. В чем проблема?
...
Рейтинг: 0 / 0
Глюки в классах
    #32478047
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как и где объявлена переменная conn?
...
Рейтинг: 0 / 0
Глюки в классах
    #32478060
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И почему в Интерфейсе
Public Property Get

а в классе
Private Property Get?
...
Рейтинг: 0 / 0
Глюки в классах
    #32478715
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переменная conn глобальная, к проблеме отношения не имеет.
А Private Property Get IDatabase_TableCount() As Integer потому что на VB так реализовываются интерфейсы.
...
Рейтинг: 0 / 0
Глюки в классах
    #32478718
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, Dim conn as IDatabase объявлена в форме.
...
Рейтинг: 0 / 0
Глюки в классах
    #32479799
Может и не в кучу, но просто интересно стало :)

Что можно достать строкой типа
select top 0 * from ...
...
Рейтинг: 0 / 0
Глюки в классах
    #32479887
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
А Private Property Get IDatabase_TableCount() As Integer потому что на VB так реализовываются интерфейсы.


А что, если я напишу Public - интерфейс не реализуется, что ли :)?

З.Ы.
Хотя согласен, Private, Public - тут без разницы...
...
Рейтинг: 0 / 0
Глюки в классах
    #32483154
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 пробегавший мимо:
Список филдов рекордсета. Из кода это очевидно.

2Andy154:
Возникнет какая-то ошибка. В верхней части окна редактирования кода есть два комбобокса, в одном объекты, в другом их события. При имплементации интерфейса в списке объектов появляется этот интерфейс, а в списке событий - его свойства и методы. В результате получается что-то среднее между обработчиком события и property. Так уж VB написан...
...
Рейтинг: 0 / 0
Глюки в классах
    #32483325
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) как-то даже грустно разбирать имплементатора "Idataбайса" у которого собственно коннекшн - локальный к конструктору.
Да еще и брошен не закрытым.
то ето я тоже - мимо пробегая...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Глюки в классах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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