SqlLite - как просмотреть все значения возвращенные sqlite3_exec

Тема в разделе "WASM.BEGINNERS", создана пользователем Hirurg, 4 сен 2007.

  1. Hirurg

    Hirurg New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2007
    Сообщения:
    7
    Открываю соединение с базой
    invoke sqlite3_open,ADDR DBName,ADDR datab
    выполняю запрос
    invoke sqlite3_exec,datab,SADD("SELECT NAME,ID FROM FType;"),ADDR CallBack,0,ADDR errMsg

    CallBack - выглядит следующим образом

    CallBack proc not_used:lol: WORD,argc:lol: WORD,argv:lol: WORD,azColName:lol: WORD
    mov eax,argv
    mov eax,[eax]
    invoke MessageBox,NULL,EAX,eax,MB_OK
    ret
    CallBack endp

    Хотелось бы в Callback пройтись по всем значениям (на данный момент MessageBox выводит
    только 1-е значение 1-й колонки).Увеличение eax на длину 1-го значения результата не дает.

    Буду признателен за кусок кода или любую информацию для решения этой проблемы.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1. while(argc--)
    2.   printf("%hs=%hs\n", azColName[argc], argv[argc]);
    3. return 0;
    Выводит все колонки в обратном порядке. Думаю, на асм перевести не составит труда.
     
  3. Hirurg

    Hirurg New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2007
    Сообщения:
    7
    Спасибо. У меня на С написать проблем нет + на сайте http://sqlite.org есть пример.
    Проблема именно с асмом. Если у меня таблица типа
    ID NAME
    1 NM1
    2 NM2
    3 NM3
    при выполнении запроса select name,id from table1 и выполнении кода указанного вами
    я получаю
    ID 1 2 3
    NAME NM1 NM2 NM3
    правильно ли я понял ?
    Как мне каждое значение Name отдельно вывести в MessageBox ? В Ollydebugger в дампе видно только первое
    значение результата, т.е. NM1
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Нет. Твоя функция вызывается для каждой строки результата. А передаются ей колонки и значений одной строки:
    Код (Text):
    1.     invoke sqlite3_open,szdb,hdb
    2.     invoke sqlite3_exec,[hdb],sql,exec_cbk,uid,tmp
    3.     invoke printf,szdone
    4.  
    5. proc exec_cbk c uses ebx esi edi, arg,colc,values,names
    6.    
    7.     mov     edx,[arg]   ; index
    8.     inc     dword[edx]
    9.     invoke printf,sf_idx,dword[edx]
    10.    
    11.     xor     ebx,ebx
    12.     cmp     ebx,[colc]
    13.     jz      .end
    14.  
    15.     mov     esi,[values]
    16.     mov     edi,[names]
    17. @@:
    18.     mov     eax,[esi+ebx*4] ; value[ebx]
    19.     mov     edx,[edi+ebx*4] ; name[ebx]
    20.     invoke printf,sf_cv,edx,eax
    21.     inc     ebx
    22.     cmp     ebx,[colc]
    23.     jb      @B
    24. .end:
    25.     invoke printf,sf_crlf
    26.     xor     eax,eax
    27.     ret
    28. endp
    29.  
    30. szdb        db 'test.db',0
    31. szdone      db 'done',0
    32. sql         db 'select * from t1',0
    33.  
    34. sf_idx      db  "%d. ",0
    35. sf_cv       db '%hs=%hs ',9,0
    36. sf_crlf     db 13,10,0
    37.  
    38. uid         dd 0
    39. hdb         dd ?
    40. tmp         dd ?
    1. id=1 name=NM1
    2. id=2 name=NM2
     
  5. Hirurg

    Hirurg New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2007
    Сообщения:
    7
    Спасибо.Сегодня вечером попробую. Т.е. CallBack вызывается для каждой строки результата ? Странно у меня только 1 раз, хотя в таблице 10 записей.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    у меня только 1 раз, хотя в таблице 10 записей
    Возможно, из callback'a нужно возвращать определенное значение: true или false как индикатор необходимости продолжения вывода для последующих строк?
     
  7. Hirurg

    Hirurg New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2007
    Сообщения:
    7
    Хм, возможно.Спасибо, попробую
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Hirurg
    Невнимательный ты. И доку не читаешь.
     
  9. Hirurg

    Hirurg New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2007
    Сообщения:
    7
    Все работает. Проблема была только в return 0.Спасибо IceStudent и cresta.
    Буду повнимательней.