Форум: "Базы";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];
ВнизОшибка, связанная с неверным типом значения Найти похожие ветки
← →
bagira (2008-01-05 03:48) [0]Здравствуйте.
У меня есть такой код программы:
//я смотрю, есть ли в таблице ответов ответ, написанный в edit"е
ADOCommand1.CommandText:="SELECT answer_id FROM answers WHERE answer = :ANS";
ADOCommand1.Parameters.ParamByname("ANS").Value := Listbox1.Items[i];
MyRec:=adocommand1.Execute;
// если такой ответ есть в таблице, то
if MyRec.RecordCount>0 then
begin
MyRec.MoveFirst;
for j:=0 to MyRec.RecordCount-1 do
begin
//мы записываем в переменную answer_id идентификационный номер этой записи
answer_id:=strtoint(MyRec.Fields.Item[0].Value);
MyRec.MoveNext;
end;
end
//если такого ответа в таблице нету, то мы заносим этот ответ в базу данных
else begin
ADOCommand1.CommandText:="INSERT INTO answers (answer) VALUES (:ANS)";
ADOCommand1.Parameters.ParamByname("ANS").Value := Listbox1.Items[i];
ADOCommand1.Execute;
//находим этот ответ, чтобы записать его идентификационный номер в переменную
ADOCommand1.CommandText:="SELECT answer_id FROM answers WHERE answer = :ANS";
ADOCommand1.Parameters.ParamByname("ANS").Value := Listbox1.Items[i];
MyRec:=adocommand1.Execute;
if MyRec.RecordCount>0 then
begin
MyRec.MoveFirst;
for j:=0 to MyRec.RecordCount-1 do
begin
answer_id:=strtoint(MyRec.Fields.Item[0].Value);
MyRec.MoveNext;
end;
end;
end;
//получается, что у нас есть переменная, в которую записан идентификационный номер ответа. Также в предыдущем юните мы получили в переменную question_id идентификатор номера вопроса для этих ответов. Так как Таблицы ответов и вопросов имеют связь многие ко многим, в базе они связаны через вспомогательную таблицу question_answer_relation, имеющую только 2 поля - question_id и answer_id. Пытаемся записать в эту таблицу то, что, например к 1-ому вопросу подходят 2-ой и 4-ый ответы:
ADOCommand1.CommandText:="INSERT INTO question_answer_relation (question_id, answer_id) VALUES (:Q, :ANS)";
ADOCommand1.Parameters.ParamByname("Q").Value := inttostr(question_id);
ADOCommand1.Parameters.ParamByname("ANS").Value := inttostr(answer_id);
ADOCommand1.Execute;
при добавлении такой записи (к примеру, что вопросу 1 соответствует 2-ой вариант ответа) приложение выскакивает на ошибку. Ошибка возникает при выполнении 4-ой от конца из приведенных строк ( ADOCommand1.CommandText:="INSERT INTO question_answer_relation (question_id, answer_id) VALUES (:Q, :ANS)";). Ошибка следующая: Project Project1.exe raised exception class EOleException with message "Приложение использует для текущей операции значение неверного типа"
Подскажите, пожалуйста. Может у кого какие соображения по этому поводу есть? Заранее списабо!
← →
sniknik © (2008-01-05 11:35) [1]многабукафф ниасилил...
не знаю может и не связано, но нафига преобразовывать параметры к строке?
> ADOCommand1.Parameters.ParamByname("Q").Value := inttostr(question_id);
ведь судя по имени поля в запросе question_id запись идет в числовое поле...
одно из преимуществ параметров, как раз в возможности оперировать/передавать типизированные значения...
зачем сводить преимущество на нет?
← →
Anatoly Podgoretsky © (2008-01-05 12:47) [2]А даже если и строка, то тоже преобразовывать не надо.
Value это variant
← →
MsGuns © (2008-01-05 14:26) [3]А зачем вот этот "карамболь", да еще два раза ?
if MyRec.RecordCount>0 then
begin
MyRec.MoveFirst;
for j:=0 to MyRec.RecordCount-1 do
begin
answer_id:=strtoint(MyRec.Fields.Item[0].Value);
MyRec.MoveNext;
end;
end
Да и вообще весь код ;)
← →
bagira (2008-01-05 16:13) [4]Первый раз мы проходим по базе и смотрим, есль ли запись с указанным значением. Если есть, то находим ее id. (это первый раз) а если такой записи не найдено - то мы ее заносим в базу и еще раз выполняем то, что ты написал, чтобы найти id только что занесенной записи. Может правда я что-то не так делаю и можно на много легче, но я пока только начинаю в этом разбираться и поэтому многое сразу не получается
← →
sniknik © (2008-01-05 20:45) [5]> Первый раз мы проходим по базе и смотрим, есль ли запись с указанным значением.
> Если есть, то находим ее id. (это первый раз) а если такой записи не найдено - то мы ее
> заносим в базу и еще раз выполняем то, что ты написал, чтобы найти id только что занесенной записи.
опля... так это ты получается два раза тащишь всю таблицу на клиента ради одного значения?...
чудеса все чудесатее... ;о)
sql для того и придумали чтобы сервер тебе отдал только нужное. учи sql!
а кстати, смысл всего этого действа, простыми словами можеш написать? так чтобы можно было понять "а что делаешь то"?
тока не надо расписывать, что ты выполняешь заказ по написанию учебно образовательного комплекса, и т.д. и т.п. и др. подобная лабуда.
просто конкретный смысл конкретного (приведенного) кода.
есть мысль что все укладывается в 1 довольно простой запрос, но "боюсь попасть пальцем в небо"...
← →
bagira (2008-01-05 22:16) [6]Смысл этого кода - нам надо занести в базу значение, если его там нет. Нужно так же значение поля id этой записи для того чтобы использовать его далее. Если это можно как-то оптимизировать - очень буду рада, т.к. таких мест в коде у меня уже несколько
← →
sniknik © (2008-01-05 23:11) [7]> занести в базу значение, если его там нет
ну, чтото типа этого и подозревал...
вот, все что тебе нужноSET NOCOUNT ON
DECLARE @St VarChar(50)
DECLARE @ID INT
SET @St=:St
SELECT TOP 1 @ID=ID FROM Table1 WHERE Name=@St
IF @@ROWCOUNT=0
BEGIN
INSERT INTO Table1 (Name) VALUES (@St)
SET @ID=@@IDENTITY
END
SELECT @IDAS ID
SET NOCOUNT OFF
вносишь в ADODataSet все как есть, после адаптации к своим именам естественно, задаешь значение параметру, открываешь... готово, на выходе будет рекордсет с ID.
(в принципе можно тоже вернуть через out параметр и обойтись ADOCommand-ом. но нафиг..., сам если хочеш попробуй)
← →
sniknik © (2008-01-05 23:17) [8]упс... опечатка, пробел не поставил, так надо
SELECT @ID AS ID
если еще где ошибся извини.
← →
bagira (2008-01-05 23:58) [9]Спасибо огромное! Сейчас буду пробовать
← →
MsGuns © (2008-01-06 00:46) [10]>sniknik © (05.01.08 23:11) [7]
Мрак
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.391 c