Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32

Записать в RAGrid (RadAsm) данные, полученные из базы данных при помощи MySql API

01.05.2018, 09:06. Показов 2056. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил одну проблему, появилась новая.
База данных MySql.
При помощи Mysql API, пишу в базу, читаю из базы.
А вот записать, RaGrid полученные из базы данные, не получается
Голову уже сломал, и мозг вывихнул. Есть примеры заполнение Gridа данными
Но они сделаны для ODBC.
Может кто подскажет, в каком направлении копать ?????
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.05.2018, 09:06
Ответы с готовыми решениями:

Увеличить высоту заголовка компонента RAGrid (RadAsm)
Подскажите, кто знает. Как можно увеличить высоту заголовка в RAGrid_e

Кэшировать данные полученные из API
Здравствуйте. Делаю следующий функционал. На сайте выводятся трансляции (twich и т.д.) через ихний API. Поскольку их много, то...

Реализация базы данных при помощи структур
Помогите написать программу!! 1.Создать базу данных для хранения следующей информации: – Ф.И.О., – должность, – оклад, ...

22
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
03.05.2018, 13:25  [ТС]
Что то не видно желающих, что то сказать по этому поводу.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.05.2018, 15:34
Цитата Сообщение от cain52 Посмотреть сообщение
При помощи Mysql API, пишу в базу, читаю из базы.
Я рад за Вас.
Цитата Сообщение от cain52 Посмотреть сообщение
А вот записать, RaGrid полученные из базы данные, не получается
У меня тоже иногда много чего, не получается.


Mysq и ODBC, это только надстройки над Базами. По своему функционалу они почти одинаковы.

В ODBС хххх делает уууу, а что в Mysq делает уууу, вот Вы найдете свой zzzz.
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
03.05.2018, 15:48  [ТС]
Вот и сижу разбираюсь.
Только ODBC это своего рода прокладка, между пользовательской программой и базой.
А API - работает напрямую с клиентом базы.
Но ничего подвижки уже есть.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.05.2018, 16:00
Цитата Сообщение от cain52 Посмотреть сообщение
А API - работает напрямую с клиентом базы.
Ага, конечно. API ещё большая прокладка, которая вызванная пользовательской программой, передает запрос своему системному аналогу, и только потом, что-то происходит.
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
03.05.2018, 17:40  [ТС]
Да конечно.
Но ODBC это так называемый драйвер, который принимает свои API функции и преобразут их в последовательность,
Опять же API функций конкретного клиента, будь то MySql, MSSql и т.д.
Так что убрав лишнюю прокладку, выигрыш в производительности.
Конечно немного геморно, но думаю игра стоит свеч
Просто приходится немного поломать голову , но это только на пользу.

Добавлено через 4 минуты
Эту дискуссию можно продолжать долго, упражняясь в эпистолярном жанре.
Скажи пожалуйста, у тебя есть какая то конкретика, хотя бы указать направление куда копать.
Направление на х.. отвергается изначально.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
03.05.2018, 21:04
Цитата Сообщение от cain52 Посмотреть сообщение
Скажи пожалуйста, у тебя есть какая то конкретика, хотя бы указать направление куда копать.
Смотрю на код, а там такая конкретика, так, что давай продалжаем заниматся
Цитата Сообщение от cain52 Посмотреть сообщение
в эпистолярном жанре
1
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
04.05.2018, 14:04  [ТС]
Если уж хочешь взглянуть на код, то особых проблем не вижу.
MySql server 5.6.21
База данных из пакета - world
Таблица - country
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
invoke mysql_init,addr MYSQL 
    .if eax==0
    mov lMySQLError, SQL_ERROR_INIT
        mov eax, MAUVAISE_EXECUTION
        ret
    .endif
    mov hConn,eax                               ; Дискриптор соединения с MySql
    ; соединение с базой ( world )
    invoke mysql_real_connect,GpMySQL,addr lpHost,addr lpUser,addr lpPasswd,addr lpDb,0,NULL,0
    .if eax==0
        invoke mysql_close,GpMySQL              
        mov GpMySQL,0
        mov lMySQLError, SQL_ERROR_CONNECT
        mov eax, MAUVAISE_EXECUTION
        ret
    .endif
Выполнить запрос (SELECT * FROM country)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    
    invoke mysql_ping, GpMySQL
    .if eax!=0
        mov lMySQLError, SQL_ERROR_PING         
        mov eax, MAUVAISE_EXECUTION
        ret
    .endif
 
    invoke lstrlen,lpRequete                
    invoke mysql_real_query,GpMySQL,lpRequete,eax
    .if eax!=0
        mov lMySQLError, SQL_ERROR_QUERY        ; Ошибка выполнения запроса
        mov eax, MAUVAISE_EXECUTION
        ret
    .endif
    ; Получить результирующий набор
     invoke mysql_store_result,GpMySQL
    .if eax==0
        mov lMySQLError, SQL_ERROR_STORE_RESULT     
        mov eax, MAUVAISE_EXECUTION
        ret
    .endif
    mov pMyRES,eax
Получить количество столбцов в результирующем наборе
Получить имена столбцов и тип данных.
Нужно для формирования RAGrida.
Имена столбцов нужны для заполнения заголовков, а тип данных для колонок
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
invoke mysql_num_fields,pMyRES                  ; Ïîëó÷èòü êîëè÷åñòâî ïîëåé â íàáîðå äàííûõ
    mov dwNombre,eax
     .while dwNombre!=0
        mov eax,dwNombre
        dec eax
        mov dwNombre,eax
        invoke mysql_fetch_field,pMyRES
        .if eax==0
            invoke mysql_free_result, pMyRES
            mov eax, MAUVAISE_EXECUTION
            ret
        .endif
        mov ebx,eax                 
        mov eax,MYSQL_FIELD.name_ [ebx]         
        mov dwDepartBuffer, eax
        mov eax,MYSQL_FIELD.type_ [ebx]                         
        mov Typefield,eax
    .endw
Все это получаем и создаем сетку.
Все работает нормально.
Теперь пытаюсь прочитать данные из таблицы
И вот тут появляется затык.
Согласно примеров получения колонок и Получения данных
(автор KetilO)
Assembler
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
ODBCGetColumns proc uses edi,lpTable:DWORD
    LOCAL   hStmt:DWORD
    LOCAL   hStmt2:DWORD
    LOCAL   len:DWORD
    LOCAL   nInx:DWORD
    LOCAL   nCol:DWORD
    LOCAL   buffer[256]:BYTE
 
    mov     edi,offset dbCols           
    mov     ecx,sizeof dbCols/4
    xor     eax,eax
    mov     nCol,eax
    mov     nInx,eax
    rep stosd
    mov     edi,offset dbCols
    invoke SQLAllocHandle,SQL_HANDLE_STMT,hConn,addr hStmt
    .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
        invoke SQLAllocHandle,SQL_HANDLE_STMT,hConn,addr hStmt2
        .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
            invoke lstrcpy,addr buffer,offset szSql
            invoke lstrcat,addr buffer,lpTable
            invoke lstrcat,addr buffer,offset szSemi
            invoke lstrlen,addr buffer
            invoke SQLExecDirect,hStmt2,addr buffer,eax             
            .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
                invoke lstrlen,lpTable
                invoke SQLColumns,hStmt,NULL,0,NULL,0,lpTable,eax,NULL,0  
                .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
                  @@:
                    invoke SQLBindCol,hStmt,4,SQL_CHAR,addr [edi].SQLCOL.szName,sizeof SQLCOL.szName,addr len
                    invoke SQLBindCol,hStmt,5,SQL_SMALLINT,addr [edi].SQLCOL.wType,sizeof SQLCOL.wType,addr len; mys
                    invoke SQLFetch,hStmt                       
                    .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
                        movzx   eax,[edi].SQLCOL.wType          
                        .if eax==SQL_CHAR || eax==SQL_VARCHAR || eax==SQL_INTEGER || eax==SQL_SMALLINT || eax==SQL_REAL || eax==SQL_NUMERIC || eax==SQL_DOUBLE || eax==SQL_TYPE_TIMESTAMP || eax==65535 || eax==65529
                            mov     eax,nCol
                            mov     [edi].SQLCOL.nCol,eax
                            inc     nCol
                        .else
                            ;Unknown data type
                            PrintDec eax
                            mov     [edi].SQLCOL.nCol,-1
                        .endif
                        inc     nInx
                        invoke SQLColAttribute,hStmt2,nInx,SQL_COLUMN_NULLABLE,NULL,NULL,NULL,addr [edi].SQLCOL.nulls
                        invoke SQLColAttribute,hStmt2,nInx,SQL_COLUMN_UPDATABLE,NULL,NULL,NULL,addr [edi].SQLCOL.update
                        invoke SQLColAttribute,hStmt2,nInx,SQL_COLUMN_AUTO_INCREMENT,NULL,NULL,NULL,addr [edi].SQLCOL.autoinc
                        lea     edi,[edi+sizeof SQLCOL]
                        jmp     @b
                    .endif
                .else
                    Err 'Unable to get columns.'
                .endif
            .else
                Err "Failed to execute query."
            .endif
            invoke SQLFreeHandle,SQL_HANDLE_STMT,hStmt2
        .else
            Err 'Unable to allocate statement handle.'
        .endif
        invoke SQLFreeHandle,SQL_HANDLE_STMT,hStmt
    .else
        Err 'Unable to allocate statement handle.'
    .endif
    ret
 
ODBCGetColumns endp
 
ODBCGetData proc uses ebx esi edi,lpTable:DWORD,lpCols:DWORD
    LOCAL   hStmt:DWORD
    LOCAL   buffer[256]:BYTE
    LOCAL   rowdta[256]:DWORD
    LOCAL   nInx:DWORD
    LOCAL   len:DWORD
    LOCAL   ninx:DWORD
    LOCAL   nmemo[32]:DWORD
    LOCAL   pmemo[32]:DWORD
 
    invoke RtlZeroMemory,addr nmemo,sizeof nmemo
    invoke SQLAllocHandle,SQL_HANDLE_STMT,hConn,addr hStmt
    .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
        invoke SQLSetStmtAttr,hStmt,SQL_ATTR_CONCURRENCY,SQL_CONCUR_ROWVER,0
        invoke SQLSetStmtAttr,hStmt,SQL_ATTR_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN,0
        invoke lstrcpy,addr buffer,offset szSql
        invoke lstrcat,addr buffer,lpTable
        invoke lstrcat,addr buffer,offset szSemi
        invoke lstrlen,addr buffer
        invoke SQLExecDirect,hStmt,addr buffer,eax          
        .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
            invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,64*1024
            mov     edi,eax             
            push    edi
            mov     nRows,0             
            mov     nInx,0              
            lea     ebx,rowdta          
            mov     esi,lpCols          
            mov     ninx,0
            .while [esi].SQLCOL.szName
                inc     nInx
                movsx   eax,[esi].SQLCOL.wType
                .if eax==SQL_CHAR || eax==SQL_VARCHAR
                    invoke SQLBindCol,hStmt,nInx,SQL_CHAR,edi,256,addr len
                    mov     [ebx],edi
                    add     ebx,4
                    add     edi,256
                .elseif eax==SQL_INTEGER
                    invoke SQLBindCol,hStmt,nInx,SQL_INTEGER,ebx,4,addr len
                    add     ebx,4
                .elseif eax==SQL_SMALLINT
                    invoke SQLBindCol,hStmt,nInx,SQL_SMALLINT,ebx,2,addr len
                    add     ebx,4
                .elseif eax==SQL_REAL
                    invoke SQLBindCol,hStmt,nInx,SQL_REAL,ebx,4,addr len
                    add     ebx,4
                .elseif eax==SQL_NUMERIC
                    invoke SQLBindCol,hStmt,nInx,SQL_NUMERIC,edi,8,addr len
                    mov     [ebx],edi
                    add     ebx,4
                    add     edi,8
                .elseif eax==SQL_DOUBLE
                    invoke SQLBindCol,hStmt,nInx,SQL_DOUBLE,edi,8,addr len
                    mov     [ebx],edi
                    add     ebx,4
                    add     edi,8
                .elseif eax==SQL_TYPE_TIMESTAMP
                    invoke SQLBindCol,hStmt,nInx,SQL_TYPE_TIMESTAMP,edi,8,addr len
                    mov     [ebx],edi
                    add     ebx,4
                    add     edi,8
                .elseif eax==SQL_LONGVARCHAR
                    ;Memo
                    mov     ecx,ninx
                    mov     pmemo[ecx*4],edi
                    mov     eax,nInx
                    mov     nmemo[ecx*4],eax
                    mov     [ebx],edi
                    add     ebx,4
                    add     edi,4096
                    inc     ninx
                .elseif eax==SQL_BIT
                    invoke SQLBindCol,hStmt,nInx,SQL_BIT,ebx,1,addr len
                    add     ebx,4
                .endif
                lea     esi,[esi+sizeof SQLCOL]
            .endw
          @@:
            lea     ebx,rowdta
            mov     esi,lpCols
            .while [esi].SQLCOL.szName
                movsx   eax,[esi].SQLCOL.wType
                .if eax==SQL_CHAR || eax==SQL_VARCHAR
                    mov     edi,[ebx]
                    mov     byte ptr [edi],0
                    add     ebx,4
                .elseif eax==SQL_INTEGER
                    mov     dword ptr [ebx],0
                    add     ebx,4
                .elseif eax==SQL_SMALLINT
                    mov     dword ptr [ebx],0
                    add     ebx,4
                .elseif eax==SQL_REAL
                    mov     dword ptr [ebx],0
                    add     ebx,4
                .elseif eax==SQL_NUMERIC
                    mov     edi,[ebx]
                    mov     dword ptr [edi],0
                    mov     dword ptr [edi+4],0
                    add     ebx,4
                .elseif eax==SQL_DOUBLE
                    mov     edi,[ebx]
                    mov     dword ptr [edi],0
                    mov     dword ptr [edi+4],0
                    add     ebx,4
                .elseif eax==SQL_TYPE_TIMESTAMP
                    mov     edi,[ebx]
                    mov     dword ptr [edi],0
                    mov     dword ptr [edi+4],0
                    add     ebx,4
                .elseif eax==SQL_LONGVARCHAR
                    mov     edi,[ebx]
                    mov     byte ptr [edi],0
                    add     ebx,4
                .elseif eax==SQL_BIT
                    mov     dword ptr [ebx],0
                    add     ebx,4
                .endif
                lea     esi,[esi+sizeof SQLCOL]
            .endw
            invoke SQLFetch,hStmt
            .if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
                lea     ebx,nmemo
                lea     edi,pmemo
                .while dword ptr [ebx]
                    invoke SQLGetData,hStmt,[ebx],SQL_C_CHAR,[edi],256,addr len
                    add     ebx,4
                    add     edi,4
                .endw
                invoke SendMessage,hGrd,GM_ADDROW,0,addr rowdta
                inc     nRows
                cmp     nRows,32700
                jne     @b
            .endif
            pop     edi
            invoke GlobalFree,edi
        .else
            Err "Failed to execute query."
        .endif
        invoke SQLFreeHandle,SQL_HANDLE_STMT,hStmt
    .else
        Err 'Unable to allocate statement handle.'
    .endif
    ret
 
ODBCGetData endp
Читаю данные.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 invoke mysql_num_fields,GpMySql
    mov dwNombre,eax
    ; ×òåíèå äàííûõ èç òàáëèöû
    .while TRUE
        invoke mysql_fetch_row,pMyRES
        mov ebx,eax
        .if eax==0
            invoke mysql_free_result, pMyRES        ; Âûáðàíû âñå ñòðîêè íàáîðà
            mov eax, BONNE_EXECUTION
            ret
        .endif
        invoke mysql_num_fields,pMyRES          
        mov dwNombre,eax
        .while dwNombre!=0
            mov eax,dwNombre
            dec eax
            mov dwNombre,eax
            mov eax,MYSQL_FIELD.name_ [ebx]     
 
            add ebx,4
        .endw
        
    .endw
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
04.05.2018, 20:28
cain52, затрудняюсь с ответом на ваш вопрос. У меня лишь соображение.

Как я понял, у вас проблема не столько в заполнении RAGrid, сколько в получении данных для этого заполнения.
Т.к. вся работа с БД выполняется через API MySQL, то программа на C/Delph/VB с правильной последовательностью этих вызовов должна суметь вывести эти данные в консоль.

Я предлагаю вам попробовать реализовать такую тестовую программку для проверки правильности последовательности и параметров вызова API MySQL.
И тогда перенести всё в ассемблер.

Просто пока неясно, что неправильно. И на языке высокого уровня можно легче проверять успех вызова функций (на ассемблере для упрощения часто игнорируют анализ кода возврата).
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
05.05.2018, 07:37  [ТС]
Да я все так и делаю.
Я сделал две простенькие тестовые программы, одна на С и вторая на ассемблере,
которые выводят полученные из базы данные на консоль. Также есть вывод в файл.
И все работает нормально.
Проблема именно в заполнении RaGrid_a, т.к там нужна привязка столбцов по типу данных.
В гриде, формируются столбцы, соответствующие типу данных, которые в них выводятся.
Смотрите примеры :
ODBCGetColumns - Получение имени и типа столбца. Для формирования сетки.
В результате работы формируются столбцы с именами в заголовке и соответствующего типа данных.
И это все работает. Сетку создаю, заголовки заполняю.

ODBCGetData - Получить данные из таблицы и разместить их в сетке.
И вот здесь затык.
Примеров заполнения сетки, кроме этих, я не нашел.

Добавлено через 1 минуту
А анализ выполнения функций работает нормально.

Добавлено через 1 час 8 минут
Попробую поковырять исходники RAGrida, может там что нарою.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
05.05.2018, 16:59
Цитата Сообщение от cain52 Посмотреть сообщение
Все это получаем и создаем сетку.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
invoke mysql_num_fields,pMyRES;получили количество столбцов
    mov dwNombre,eax
     .while dwNombre!=0;пока столбцы больше нуля посторяем
        mov eax,dwNombre;уменбшаем счетчик столбцов
        dec eax
        mov dwNombre,eax
        invoke mysql_fetch_field,pMyRES;получили данные следующего поля таблицы
        .if eax==0;обработали ошибку
            invoke mysql_free_result, pMyRES
            mov eax, MAUVAISE_EXECUTION
            ret
        .endif
        mov ebx,eax
        mov eax,MYSQL_FIELD.name_ [ebx]
        mov dwDepartBuffer, eax;получили имя поля и записали его
        mov eax,MYSQL_FIELD.type_ [ebx]
        mov Typefield,eax;получили тип поля и записали его
    .endw
Итого пока dwNombre больще нуля, т.е. в цикле получается и записывается имена полей в одни и теже переменные. Другими словами, когда цикл закончится, там будут данные последнего проочитанного поля.
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
05.05.2018, 18:45  [ТС]
Да все именно так.
И в данном случае, мы читаем имена полей и их тип.
Для того что бы прочитать содержимое таблицы,
мы должна выполнить функцию последовательность функций, а это
mysql_store_result - получить данные
mysql_num_fields - получить количество столбцов
mysql_num_row - Получить количество строк
И выполняя в цикле mysql_feth_row (цикл вложенный) заполнить переменную.
Но для того чтобы эту переменную можно было записать в сетку нужно каждый столбец
привязать по типу данных.
В общем поковыряв сегодня исходники RaGrid.dll, я определился с тем,
Что надо найти соответствие для переменных MySql и переменных для ODBC.
Это надо для привязки данных таблицы, к столбцам сетки.
Таблицу аналогов типов данных для MSSQL и Fierbirda нашел.
Частично есть подобная таблица для MSSQL и MySql.
Так что копаю дальше.

Добавлено через 7 минут
А через API работает шустрее.
Сделал тест-прогу
Все что у меня работает через API и то же самое через ODBC
Через API шустрее, через ODBC проще. Меньше заморочек.
Вот что значит лишняя прокладка. Хоть она и Olvis но не .............

Добавлено через 6 минут
Извини за вопрос.
Из всех кто смотрел эту тему, ты единственный кто ответил, не считая модераторов.
Тебе это тоже интересно или ..........
А то у меня есть еще проблемы, например бесконтактные карты.
У меня тут жена получила карту сбербанка "МИР".
Я ее проверил так она вооще фуфа. Карта полность открыта, пиши на нее что хочешь и куда хочешь.
Даже не умудрились поменять, стандартные транспортные ключи.
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
05.05.2018, 19:55
Цитата Сообщение от cain52 Посмотреть сообщение
Из всех кто смотрел эту тему, ты единственный кто ответил, не считая модераторов.
У племянника интернет магазин с более 2000 наименований. От дилеров приходят обновленные прайсы в таблицах Ексель, а база магазина, как обычная база данных. обновлять таблицу руками долго и нудно. Выгружаю базу в Ексель, а написанноая приблуда(Delphi), сравнивает XLS- файлы по артикулям и формирует запрос "UPDATE ... ...". Сформированный запрос загружается в базу и выполняется. На все уходит минут 10-15. Основное время занимают копи-пасты-сайвы.

Вот так я подсел на базы.


Тут некоторая справка по MySQL.
Цитата Сообщение от cain52 Посмотреть сообщение
Для того что бы прочитать содержимое таблицы, мы должна выполнить функцию последовательность функций, а это . . .
Я думал несколько другой алгоритм:
mysql_num_fields - получаем количество столбцов;
в цикле формируем массив название поля-тип поля=длина поля в байтах
mysql_fetch_field - получаем данные одного поля;
и заполняем массив название-длина

прочитав одну строку mysql_fetch_row() начинаем её разбирать по байтам, как на минифтюре.
Миниатюры
Записать в RAGrid (RadAsm) данные, полученные из базы данных при помощи MySql API  
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
06.05.2018, 07:07  [ТС]
Да все примерно так и происходит.
Получаем количество строк
Получаем количество столбцов, а затем во вложенном цикле
разбираем каждую строку по столбцам.
И если все это выводить в консоль, то все ОК.
Но в RAGrid, такое не пролазит. В нем есть механизм сортировки,
и для правильной работы он требует еще и тип поля.
А отсюда и проблемы.

Добавлено через 4 минуты
Спасибо за ссылку, но это я уже прочитал и не один раз
не пробовал читать, разве что по диагонале.

Добавлено через 8 минут
Я пришел к выводу, надо найти соответствие типов данных,
между C SQL и MySql.
Assembler
1
2
3
4
5
6
7
8
.while [esi].SQLCOL.szName
                inc     nInx
                movsx   eax,[esi].SQLCOL.wType
                .if eax==SQL_CHAR || eax==SQL_VARCHAR
                    invoke SQLBindCol,hStmt,nInx,SQL_CHAR,edi,256,addr len
                    mov     [ebx],edi
                    add     ebx,4
                    add     edi,256
При разборе строки проверяется тип данных и привязка к конкретному типу столбца
invoke SQLBindCol,hStmt,nInx,SQL_CHAR,edi,256,a ddr len

Смотри выше ODBCGetData.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
06.05.2018, 10:16
Цитата Сообщение от cain52 Посмотреть сообщение
И если все это выводить в консоль, то все ОК. Но в RAGrid, такое не пролазит.
Тогда я не понимаю, в чем пробдема. Приведите RAGrid к строковому типу, на консоль Вы же выводите строку. Длину поля считайте как длину строкового представления максимального значения этого типа.
1
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
06.05.2018, 12:28  [ТС]
Я же уже пытался объяснить в чем разница, вывод на консоль и вывод в грид.
Если выводить в грид по принципу вывода на консоль, то получается какая то хрень.
Для вывода в грид, нужно сформировать специальный массив.
Примерно по такому принципу:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rdta                ROWDATA <0,offset szText1,1001,(HOTKEYF_CONTROL shl 8) or VK_A,0,0,offset szButton1,147090,3600,01020341h,offset szButton1>
                    ROWDATA <1,offset szText2,1002,(HOTKEYF_CONTROL shl 8) or VK_B,1,1,offset szButton2,147091,3601,01020342h,offset szButton2>
                    ROWDATA <2,offset szText3,1003,(HOTKEYF_CONTROL shl 8) or VK_C,0,2,offset szButton3,147092,3602,01020304h,offset szButton3>
                    ROWDATA <3,offset szText4,1004,(HOTKEYF_CONTROL shl 8) or VK_D,1,3,offset szButton4,147093,3603,01020304h,offset szButton4>
                    ROWDATA <4,offset szText1,1005,(HOTKEYF_CONTROL shl 8) or VK_E,0,4,offset szButton1,147094,3604,01020304h,offset szButton1>
                    ROWDATA <5,offset szText2,1006,(HOTKEYF_CONTROL shl 8) or VK_F,1,5,offset szButton2,147095,3605,01020304h,offset szButton2>
                    ROWDATA <6,offset szText3,1007,(HOTKEYF_CONTROL shl 8) or VK_G,0,6,offset szButton3,147096,3606,01020304h,offset szButton3>
                    ROWDATA <7,offset szText4,1008,(HOTKEYF_CONTROL shl 8) or VK_H,1,7,offset szButton4,147097,3607,01020304h,offset szButton4>
                    ROWDATA <0,offset szText1,1009,(HOTKEYF_CONTROL shl 8) or VK_I,0,0,offset szButton1,147098,3608,01020304h,offset szButton1>
                    ROWDATA <1,offset szText2,1010,(HOTKEYF_CONTROL shl 8) or VK_J,1,1,offset szButton2,147099,3609,01020304h,offset szButton2>
                    ROWDATA <2,offset szText3,1011,(HOTKEYF_CONTROL shl 8) or VK_K,0,2,offset szButton3,147100,3610,01020304h,offset szButton3>
                    ROWDATA <3,offset szText4,1012,(HOTKEYF_CONTROL shl 8) or VK_L,1,3,offset szButton4,147101,3611,01020304h,offset szButton4>
                    ROWDATA <4,offset szText1,1013,(HOTKEYF_CONTROL shl 8) or VK_M,0,4,offset szButton1,147102,3612,01020304h,offset szButton1>
                    ROWDATA <5,offset szText2,1014,(HOTKEYF_CONTROL shl 8) or VK_N,1,5,offset szButton2,147103,3613,01020304h,offset szButton2>
                    ROWDATA <6,offset szText3,1015,(HOTKEYF_CONTROL shl 8) or VK_O,0,6,offset szButton3,147104,3614,01020304h,offset szButton3>
                    ROWDATA <7,offset szText4,1016,(HOTKEYF_CONTROL shl 8) or VK_P,1,7,offset szButton4,147105,3615,01020304h,offset szButton4>
Это массив для грид на 11 столбцов
и каждый столбец имеет свой тип данных. сетка на конкретное количество столбцов.
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
06.05.2018, 12:51  [ТС]
В архиве есть 2 примера работы с RaGrid
Исходный текст там же
RaGrig.7z
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
06.05.2018, 12:52  [ТС]
Посмотри, для наглядност Демо8 работает с базой mdb
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
06.05.2018, 18:58
cain52, скачал, буду смотреть завтра, по дороге с дома на работу и обратно, ксати Вы так и не показали свой RaGrid, как Вы сним работаете.
0
3 / 3 / 1
Регистрация: 10.08.2017
Сообщений: 32
07.05.2018, 06:31  [ТС]
Я специально выслал примеры
У меня все тоже самое, за исключением того, что
в примерах работают через драйвер ODBC.
Я пытаюсь все это сделать при помощи MySql API.
Сегодня попытаюсь выслать свою версию.

Добавлено через 1 минуту
У вас есть IDE RADASM ?
Т.к. этот RAGrid, является контролом этого IDE.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2018, 06:31
Помогаю со студенческими работами здесь

Как из базы access извлечь данные для последующей обработки при помощи математических функций ?
Люди добрые помогите начинающим.... Есть база на access как мне, из нее достать эти данные чтобы можно было математические функции с...

Вывод таблицы базы данных на форму при помощи ADO
Хай, у меня не получается вывести данные на форму. Т.е я создал ADOConnection, подключение к базе осуществляется, далее не пойму как...

Как выводить данные по условию из базы данных mysql
Из базы данных запросы выводятся в таблицу,как выводить по условию только если &gt;0;т.е если Пример: Коэффициент паров 1 Коэффициент...

Не хочет удалять и редактировать данные из базы данных (MySQL + PHP)
Всем привет, у меня возникла такая проблема. Почему-то перестало удалять данные из базы данных. Хотя пару часов назад всё работало. ...

Как при помощи триггера записать информацию о входе в базу данных
Как при помощи триггера записать информацию о входе в базу данных, user_id пользователей которые зашли я понял как записать, а которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru