|
|
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Всем привет! Столкнулся с задачей сделать запрос вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. или все тоже, но без алиасов полей, без разницы. Запрос делаю при помощи API, с использованием Objective C для Mac и получаю в структуре sel_sqlda->sqlvar пустые значения для всех полей: Код: plaintext 1. 2. 3. 4. При этом кол-во полей в структуре указано корректно. Подобная проблема появилась только для системной таблицы и отсутствовала для запросов в обычные пользовательские. И именно по этой причине я и решил использовать в запросе алиасы, в прочем это не помогло, как я написал выше. При выполнении запроса в isql на сервере я получаю вот такую структуру SQLDA для запроса без алиасов. Код: plsql 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. В итоге, как мне получить имена полей, типы и алиасы при запросе к системным таблицам? Кто-то может подсказать, есть ли тонкости при работе с системными таблицами при использовании Firebird API? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 12:24 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Игорь П.Запрос делаю при помощи API Код показывай. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 13:02 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Ниже фрагмент кода с isc_dsql_describe на Objective C. Метод prepare описан ниже. Замут с типами (sel_sqlda->sqlvar[i].sqltype == 448) я подправлю, это на время дебага сделано. Под dummyVar*** память выделена. Код: 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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 19:43 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Игорь П.Кто-то может подсказать, есть ли тонкости при работе с системными таблицами при использовании Firebird API? Тонкостей никаких нет. И явных багов в твоём коде я тоже не вижу. Ошибок в логе точно нет? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 19:55 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Вообще-то выходная SQLDA должна заполняться уже при вызове isc_dsql_perepare(). Попробуй вызов isc_dsql_describe() вообще убрать. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 20:13 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Игорь П., а где выделение памяти под собственно sel_sqlda ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 20:16 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovТонкостей никаких нет. И явных багов в твоём коде я тоже не вижу. Ошибок в логе точно нет? Это оч плохо. Было бы лучше, если б они были явными :) Dimitry SibiryakovВообще-то выходная SQLDA должна заполняться уже при вызове isc_dsql_perepare(). Попробуй вызов isc_dsql_describe() вообще убрать. Сейчас попробую. Спасибо! hvladИгорь П., а где выделение памяти под собственно sel_sqlda ? Хотел не перегружать кодом. Вот с момента выделения памяти. Собственно, раньше только коннект. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 20:45 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Игорь П.sel_sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(1)); sel_sqlda->sqln = 2; Выделяешь места под одну переменную, а говоришь, что под две. Нехорошо обманывать. Особенно когда пытаешься засунуть туда сразу восемь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 20:52 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovИгорь П.sel_sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(1)); sel_sqlda->sqln = 2; Выделяешь места под одну переменную, а говоришь, что под две. Нехорошо обманывать. Особенно когда пытаешься засунуть туда сразу восемь. "Семен Семеныч!!.." и правда, я слопушил! в итоге делаю так: Код: plsql 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. То есть добавил проверку, что колонок в запросе более 1. И если это так, то освобождаю память и выделяю ее заново. Но надо сказать, что изменений это не дало в плане изначальной проблемы. Часть полей стали в логах выглядеть так: Column name: \377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377 Column type: 0 Column length: 0 Column alias name Часть вот так: Column name: 23:20:39.913 Column type: 28492 Column length: 24931 Column alias name а половина все равно пуста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 23:25 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Игорь П.[src PLSQL] if(self.connected) { sel_sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(1)); sel_sqlda->sqln = 1; sel_sqlda->sqld = 0; sel_sqlda->version = 1; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 23:27 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Игорь П.в итоге делаю так: Число в sqln должно точно совпадать с числом в предыдущем XSQLDA_LENGTH(). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2014, 23:29 |
|
||
|
isc_dsql_describe и системные таблицы
|
|||
|---|---|---|---|
|
#18+
Все, проблема решена. Нужно более внимательно к параметрам относиться. В моем случае sqln и sqld sqln - Указывает число элементов в массиве sqlvar; приложение должно устанавливать это поле каждый раз, когда оно выделяет память для дескриптора sqld - Указывает число параметров XSQLDA для ввода, или число элементов списка выбора XSQLDA для вывода; устанавливается c помощью isc_dsql_describe (), isc_dsql_describe_bind () или isc_dsql_prepare () Для дескриптора ввода, sqld= 0 указывает, что инструкция SQL не имеет никаких параметров; Для дескриптора вывода, sqld= 0 указывает, что инструкция SQL - не инструкция SELECT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2014, 20:43 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38833656&tid=1563126]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 272ms |
| total: | 527ms |

| 0 / 0 |
