Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как вставить переменную в SQL запрос


Автор: blackDancer 30.1.2009, 16:20
Доброе время суток господа.
У меня вот такая тема сейчас попытаюсь обрисовать ситуацию.
Я пишу клиентское приложение в C++ Builder6  обращаюсь к базе InterBase всё соединяется и замечательно работает. 

Вот кусок кода  нужно что бы значения переменных name_k и adres_k которые я потом буду считывать из TEdit записались в базу данных.

        char name_k[]="25061987", adres_k[]="1987";
        IBQuery1->Close();       
        IBQuery1->SQL->Clear();

        IBQuery1->SQL->Add("INSERT INTO TEMP (ID, NAME, ADRES) VALUES (gen_id(GENERATOR_TEMP,1),"+name_k+", "+adres_k+")");
       
        IBQuery1->Active=true;

Как вставить переменные name_k и adres_k в тело запроса, как показано в примере не работает??????
Если писать вот так: 

       IBQuery1->SQL->Add("INSERT INTO TEMP (ID, NAME, ADRES) VALUES (gen_id(GENERATOR_TEMP,1),'+name_k+', '+adres_k+')");

то записывается в поля базы  как значение +name_k+ и  +adres_k+

Автор: Dmi3ev 30.1.2009, 16:48
Цитата

Вот кусок кода  нужно что бы значения переменных name_k и adres_k которые я потом буду считывать из TEdit записались в базу данных.

Есть несколько способов
Код

IBQuery1->SQL->Add("INSERT INTO TEMP (ID, NAME, ADRES) VALUES (gen_id(GENERATOR_TEMP,1),'"+Edit1->Text+"', '"+Edit2->Text+"');");

Вот так попробуй...


А еще можно через параметры, написать вот такой запрос:
Код

INSERT INTO TEMP (ID, NAME, ADRES) VALUES (gen_id(GENERATOR_TEMP,1), :NAME, :AD)

а потом в программе просто 
IBQuery1->Parameters->ParamByName("NAME")->Value=Edit1->Text;
Я тут пишу, поэтому извиняй, если маленькие неточности...

Автор: Rodman 30.1.2009, 19:43
NAME - зареганое слово...

или убери его или в [] возьми...

Автор: Alca 30.1.2009, 21:35
ParamByName

Автор: Dmi3ev 31.1.2009, 00:34
Цитата

NAME - зареганое слово...

ага! тогда заменить на N или любое другое... суть остается...

Автор: blackDancer 2.2.2009, 11:24
Блин беда какая то?
Я попробовла два способа:

        //способ1-----------------------------------------------------------
        IBQuery1->Close();
        IBQuery1->SQL->Clear();
        IBQuery1->SQL->Add("INSERT INTO TEMP (ID, NAME, ADRES) VALUES (gen_id(GENERATOR_TEMP,1),'"+enter_name->Text+"', '"+enter_adres->Text+"');");
        IBQuery1->ExecSQL();
        //----------------------------------------------------------------

       //способ2----------------------------------------------------------------
        IBQuery1->Close();  //деактивировать предидущий запрос
        if(!IBQuery1->Prepared)
                IBQuery1->Prepare(); //подготовить запрос
        IBQuery1->ParamByName("NAM")->Value= enter_name->Text;
        IBQuery1->ParamByName("ADRES")->Value= enter_adres->Text;

        IBQuery1->Open(); //выполнить команду SQL
        //----------------------------------------------------------------
в свойствах IBQuery соответственно прописал:    
INSERT INTO TEMP (ID, NAME, ADRES) VALUES (gen_id(GENERATOR_TEMP,1), :NAM, :ADRES)


Вроде всё записывает английские символы, цифры только вот русские символы не хочет выдаёт ошибку что делать? 

вот текст ошибки:
Project Project1.exe raised exception class EIBInterBaseError with message 'arithmetic exception,
numeric overflow, or string truncation
Cannot transliterate character between character sets'. Process stopped.Use Step or Run to continue.

Автор: Alca 2.2.2009, 11:34
Если данные изменяются (INSERT, UPDATE, ...) то надо юзать:
Код

IBQuery1->ExecSQL();

а не:
Код

IBQuery1->Open();

Какой билдер?
Цитата

только вот русские символы не хочет выдаёт ошибку что делать

Может юникод надо юзать или где-то в настройках кодировку выставить.
Помню в Paradox-e такое делал, а здесь не в курсах. 

Автор: blackDancer 2.2.2009, 11:43
Цитата(Alca @ 2.2.2009,  11:34)
Если данные изменяются (INSERT, UPDATE, ...) то надо юзать:
Код

IBQuery1->ExecSQL();

а не:
Код

IBQuery1->Open();

Какой билдер?
Цитата

только вот русские символы не хочет выдаёт ошибку что делать

Может юникод надо юзать.

Спасибо за замечание но проблема не решилась как не записывались русские буквы так и не записываются?Почему?

Добавлено через 2 минуты и 51 секунду
Билдер у меня 6 кодировку я везде ставил Win1251 в базе, а вот в билдере чёт не уверен.

Автор: mrbrooks 2.2.2009, 11:47
Цитата(blackDancer @  2.2.2009,  11:43 Найти цитируемый пост)
как не записывались русские буквы так и не записываются?Почему? 

InterBase поддерживает Unicode. В эту сторону и греби.

Автор: Alca 2.2.2009, 12:38
http://www.realcoding.net/article/view/2202
Почитай может чем поможет. smile

Добавлено через 2 минуты и 23 секунды
http://rxlib.ru/faqs/newsd7/bif.htm

Автор: blackDancer 2.2.2009, 18:23
Да всё разобрался теперь и русские буквы записывает.
Я просто в элементе IBDatabase в свойствах которые вызываются двойным щелчком в пункте Charactec Set не поставил мою кодировку т.е Win1251 после этого всё работает.Вот!!!

И теперь такой вопрос как тепреь делать заполнение для связаных таблиц может какой нибудь примерчик кто нибудь даст?
Очень интересно как будут себя вести ключевые поля достаточно сгенерировать значение  для одного ключевого поля, а к полю по которому оно связано заполниться автоматически или надо это предусмотреть????

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)