Текущий архив: 2003.06.05;
Скачать: CL | DM;
Вниз
Access violation при sql-запросе Найти похожие ветки
← →
Lamer (2003-05-16 12:41) [0]Мастера.
Собсьвенно запрос
query1.SQL.Clear;
query1.SQL.add ("select distinct(ПОЛЕ) as CBfield from "base.db" where word="""+stimul+"""");
query1.execsql;
В таблице есть несколько полей. Запрос работает нормально по всем, кроме одного. Выдаёт "access violation". Почему это может быть.
← →
Наталия (2003-05-16 12:43) [1]Может, query.open тебя спасёт?
← →
Lamer (2003-05-16 12:47) [2]Нет. Не спасает. Да и не должен бы.
Дополнения (может поможет):
1) Read of adress 00000004
2) Остальные столбцы почти целиком заполнены, а в этом почти все ячейки пусты.
← →
Anatoly Podgoretsky (2003-05-16 12:51) [3]у тебя же возвращается курсор, так какой к черту execsql
и что такое word и stimul
← →
Lamer (2003-05-16 12:58) [4]Word - столбец, а stimul - переменная (string).
Смысл запроса: отобрать те записи (без повторов) из столбца "ПОЛЕ" в которых в содержимое столбца "WORD" равно переменной stimul.
← →
Lamer (2003-05-16 13:00) [5]И почему, если подставить в "поле" имя любого другого столбца, то всё нормально и при execsql?
← →
dash78 (2003-05-16 13:02) [6]2 Lamer
может стоит обратить внимание на использование параметров в запросе?
код уже приводился :((
когда ты интересовался вставкой переменной stimul
← →
Наталия (2003-05-16 13:03) [7]Приведи полностью текст неработающего запроса с РЕАЛЬНЫМИ именами полей. И вместо execSQL надо однозначно использовать open. Смотри help.
← →
Lamer (2003-05-16 13:11) [8]if radiobutton1.checked then
begin
combobox1.clear;
query1.SQL.Clear;
query1.SQL.add ("select distinct(Value) as CBfield from "base.db" where word="""+stimul+"""");
query1.execsql;
with Query1 do
begin
Close;
Open;
while not Eof do
begin
ComboBox1.Items.Add(FieldByName("CBfield").AsString);
Next;
end;
end;
end;
query1.sql.clear;
combobox1.itemindex:=0;
Form1.table1.first;
end;
Если вместо Value вставить любое другое (Tipe, Sex), то всё работает.
А стимул задаётся ранее при щелчке на одной из radiobutton(на их ONClick код: stimul:="слово";). Stimul определён точно.
← →
Johnmen (2003-05-16 13:17) [9]АП рекомендовал тебе сменить ник на "chainik".
Ты этого не сделал... Похоже это правильное решение...
:)))
← →
Anatoly Podgoretsky (2003-05-16 13:20) [10]Ну опять ExecSQL, что же ты не веришь такому количеству народу, у тебя запрос возвращает курсор.
← →
Наталия (2003-05-16 13:23) [11]А называть поля "Value" - совершенно бесперспективно и,я бы даже сказала, безнравственно.
← →
Соловьев (2003-05-16 13:25) [12]
> query1.execsql;
заменить на
query1.Open;
> query1.SQL.add ("select distinct(Value) as CBfield from
> "base.db" where word="""+stimul+"""");
это лучше преобразовать так.
в Query1.SQL(дизайн-тайм):
select distinct(Value) as CBfield
from "base.db" where word=:word
а в коде проги написать:
with Query1 do
begin
Close;
ParamByName("word").AsString := stimul;
if not Prepared then Prepare;
Open;
end;
← →
Chainik (2003-05-16 13:30) [13]Сейчас сменил на open. И всё то же.
"Access violation at address 4C5EE67E in module Idsql32.dll. Read of address 00000004".
Только стрелка теперь ставится не после
query1.SQL.add ("select distinct(Value) as CBfield from "base.db" where word="""+stimul+"""");
query1.execsql;
->with Query1 do, а после
Application.CreateForm(TForm7, Form7);
Application.Run;
->end.
← →
Chainik (2003-05-16 13:52) [14]Переделал по "Соловьев ©". То же.
Ну почему это РАБОТАЕТ с другими полями?????????
← →
Соловьев (2003-05-16 13:58) [15]
> Переделал по "Соловьев ©". То же.
код.
← →
Соловьев (2003-05-16 14:00) [16]
> Переделал по "Соловьев ©". То же.
код.
select distinct(t1."Value") as CBfield
from "base.db" t1 where t1."word"=:word
← →
KoluChi (2003-05-16 14:03) [17]Сделай код вот таким, запусти
if radiobutton1.checked then
begin
combobox1.clear;
with Query1 do
begin
Close();
SQL.Clear;
SQL.add ("select distinct(Value) as CBfield from "base.db" where word="""+stimul+"""");
Open;
end;
Если все пройдет нормально, добавь строки обратно.
Если нет - смотри может у тебя глючный обработчик на DataSet какой висит.
← →
KoluChi (2003-05-16 14:12) [18]поле у тебя какой тип имеет?
← →
Chainik (2003-05-16 14:13) [19]Теперь он пишет:
"Paramert "word" not found".
Вот как написано
select distinct(form1.table1."Value") as CBfield from "base.db" form1.table1 where form1.table1."word"=:word
а в коде:
with Query1 do
begin
Close;
ParamByName("word").AsString := stimul;
if not Prepared then Prepare;
Open;
end;
← →
Соловьев (2003-05-16 14:14) [20]
> form1.table1
тебе же написали t1
> Теперь он пишет:
> "Paramert "word" not found".
пробел после t1."word" = :word
← →
Chainik (2003-05-16 14:30) [21]>Соловьев ©
Я уже скопировал отсюда весь ваш код. Вместе с "пробел после t1."word" = :word";
Реакция "Paramert "word" not found".
select distinct(t1."Value") as CBfield
from "base.db" t1 where t1."word" = :word
with Query1 do
begin
Close;
ParamByName("word").AsString := stimul;
if not Prepared then Prepare;
Open;
end;
← →
Соловьев (2003-05-16 14:42) [22]кликни на свойсво Query.Params если параметра там нет - прпробуй поновой положить компоненту и переделать все. Надо добиться чтобы параметр там появился.
← →
Chainik (2003-05-16 14:50) [23]Параметр там есть:
0-word.
Вы знаете, я переделал поле в таблице с Value на Value2(для эксперимента). Прощёл старый код c соответствующими изменениями.
Очевидно Наталия © права, дело в названии поля. Как это можно победить?
← →
WarLord (2003-05-16 18:44) [24]Не надо использовать зарезервированные слова для названий полей - типа Value, Word, Date и пр.
Страницы: 1 вся ветка
Текущий архив: 2003.06.05;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.009 c