|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Добрый день, коллеги! Получаю список компьютеров из Active Directory при помощи TADOConnection и TADOQuery. По тексту все элементы создаются и в конце работы освобождаются. Сам список компьютеров из AD также удается получить, но есть две проблемы: 1). при каждом выполнении кода получаю ошибку Код: sql 1.
Она происходит на строке присвоения текста AdoQuery.SQL.Text:= vSQL; Но данные запроса при этом приходят. При этом и AdoQuery парой строчек выше создан и vSQL это существующая строковая переменная. 2). если крутить код чтения списка в приложении по таймеру, то через некоторое количество выполнении происходит out of memory. Я предполагаю, что причина в этой самой AV, из-за нее память утекает. Прошу совета, как бороть такую проблему? Код программы такой: Код: pascal 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 15:45 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShield, Если на присвоении текста исключение, то до открытия собственно запроса дело доходить не должно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 15:52 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Vlad F, у меня при запуске под отладчиком ошибка вываливалась на этой строке vAdoQuery.SQL.Text:=vSQL; но потом продолжает дальше выполняться... и память утекает, хоя в finally есть освобождение компонент... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:10 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShieldПрошу совета, как бороть такую проблему? Начать хоть немного думать мозгом о том как твой код работает не предлагать?.. Код: sql 1.
Закрывается запрос который никогда не открывался. Код: sql 1.
Возврат к первой записи набора данных, который никогда с неё и не сходил. Код: sql 1. 2. 3.
Резервируется место по числу RecordCount, а заполняется пока не надоест. Естественно массив переполняется, затирая всё, чему не повезло оказаться в куче после него. Код: sql 1. 2. 3. 4. 5. 6. 7.
Значения всех полей заносятся в одну переменную, которая потом в большинстве случаев не используется. О FieldByName ты когда-нибудь слышал?.. Код: sql 1.
Проверка переменной на значение, которое ей никогда никем не присваивалось. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:12 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShield и память утекает, хоя в finally есть освобождение компонент... Однако нет SetLength(PCMas, 0). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:23 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, благодарю за замечания. Я их учту. Тем не менее close и first для ADOQuery в данном коде просто избыточны (т.к. компоненты создаются и разрушаются), но к ошибке они не приведут. Переменных при разборе запроса больше берется (точнее, используются все, какие в query были), я при выкладке на форум код сократил. можно по имени брать, а можно и просто перечислить. так или иначе все поля разбираются. if (vAdoQuery <> nil) значение nil может быть, если подключение ADOCon не прошло успешно. Поэтому такая проверка ИМХО выглядит нужной. Код: pascal 1.
тут все равно выберется не больше чем есть в выборке. Согласен, правильнее или динамически массив увеличивать внутри while или вместо while использовать for j:= 0 to vAdoQuery.RecordCount-1 do Но если бы дело было в разном количестве элементов массива, то ошибка бы другая была. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:47 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Vlad F, Вы имеете ввиду зануление массива в начале процедуры или в finally? данный массив PCMas подается на вход процедуры с параметром out. Он используется в коде, вызывающем процедуру и там же после использования и зануляется. хотя его зануление в начале процедуры можно поставить. но по коду дальше, размер массива все равно будет сделан равным RecordsCount нового запроса... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:54 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShieldзначение nil может быть, если подключение ADOCon не прошло успешно. Откуда? Если нет явного присвоения - значение переменной не определено и может быть любым. Исключение составляют переменные типа интерфейс и строка. SilverShieldтут все равно выберется не больше чем есть в выборке. А вот тут ты глубоко заблуждаешься. RecordCount не обязано возвращать реальное количество записей в выборке, допускается возвращение -1 или текущего отфетченного батча. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 17:15 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, про nil принято. Правильнее будет if assign использовать? для проверки, что компонента создана. > RecordCount не обязано возвращать реальное количество записей в выборке Принято, это переделаю на увеличение массива внутри цикла while not vAdoQuery.eof do ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 20:29 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
По поводу Access violation эти действия не помогли. Оно также происходит на строке vAdoQuery.SQL.Text:=vSQL; при этом код также как и раньше продолжает выполняться дальше и возвращается результат запроса. что за чудеса, откуда может расти AV на ровном месте... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 21:11 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Не нравится мне вот это SilverShield Код: pascal 1.
И еще вопрос - приложение, случайно, не многопоточное? А если да, то где объявлено vAdoQuery? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 21:54 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShieldПравильнее будет if assign использовать? Нет. Это то же самое. Переменные надо всегда инициализировать. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 22:10 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShield ...переделаю на увеличение массива внутри цикла while not vAdoQuery.eof do Ты эта, - уже ослабь фантазию маленько. Перед .RecordCount вызови .FetchAll, ну а если его там нет, то .Last/.First, как вариант замены. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 22:58 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
_Vasilisk_, приложение в котором тестирую, однопоточное. Компоненты ADOConnection и ADOQuery обявлены в var той процедуры, где дальше с ними идет работа. Т.е. они по сути локальные. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 09:22 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Vlad F, благодарю. Действительно, можно и так. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 09:23 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShield, код программы не полный, нужно видеть все объявления переменных, помести все в дпр и запости сюда. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 09:25 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Zelius, прикрепил юнит с процедурой. Код основной программы в упрощенном виде: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 11:03 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 11:51 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Zelius, изменил ее объявление на функцию. К сожалению, на AV это не влияет... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 12:29 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShield, А не попробовали? Что-то меня смущает присвоение прямо в .Text (взято из справки по Delphi). Просто выполнить один Add(vSQL). Код: pascal 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 12:32 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Belotsky Serge Что-то меня смущает присвоение прямо в .Text Зря смущает ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 13:01 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
авторОна происходит на строке присвоения текста AdoQuery.SQL.Text:= vSQL; Почему бы перед присвоением не вывести текст запроса на экран ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 13:33 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
SilverShield, проверил код у себя на Д7, у меня AV не выпадает. имхо, попробуй вынести сам в отдельный проект где больше ничего нет. если не поможет, то возможно проблемы с установкой дельфи. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 13:38 |
|
AV на присвоении текста в AdoQuery.SQL.Text Delphi7
|
|||
---|---|---|---|
#18+
Delphi Rio - работает ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 14:15 |
|
|
start [/forum/topic.php?fid=58&msg=40127360&tid=2036680]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 147ms |
0 / 0 |