Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
8-1181992036
Michael L Birnov
2007-06-16 15:07
2008.06.08
Прерисовка в канве "моргает"


15-1209467198
Дмитрий С
2008-04-29 15:06
2008.06.08
Вопрос про VLan-ы


2-1211121472
navigator
2008-05-18 18:37
2008.06.08
липучка для формы


15-1209054886
БарЛог
2008-04-24 20:34
2008.06.08
VBScript дописать файл


3-1199661770
porter
2008-01-07 02:22
2008.06.08
получить несколько столбцов для одного поля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский