Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вставить переменную в SQL запрос 
V
    Опции темы
blackDancer
Дата 30.1.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 23.1.2009
Где: Тамбов

Репутация: нет
Всего: нет



Доброе время суток господа.
У меня вот такая тема сейчас попытаюсь обрисовать ситуацию.
Я пишу клиентское приложение в 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+

Это сообщение отредактировал(а) blackDancer - 30.1.2009, 16:29
PM MAIL   Вверх
Dmi3ev
Дата 30.1.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

Вот кусок кода  нужно что бы значения переменных 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;
Я тут пишу, поэтому извиняй, если маленькие неточности...

Это сообщение отредактировал(а) Dmi3ev - 30.1.2009, 16:54


--------------------

PM MAIL   Вверх
Rodman
Дата 30.1.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



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

или убери его или в [] возьми...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Alca
Дата 30.1.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



ParamByName


--------------------
PM WWW ICQ Skype Jabber   Вверх
Dmi3ev
Дата 31.1.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

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

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


--------------------

PM MAIL   Вверх
blackDancer
Дата 2.2.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 23.1.2009
Где: Тамбов

Репутация: нет
Всего: нет



Блин беда какая то?
Я попробовла два способа:

        //способ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.
PM MAIL   Вверх
Alca
Дата 2.2.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Если данные изменяются (INSERT, UPDATE, ...) то надо юзать:
Код

IBQuery1->ExecSQL();

а не:
Код

IBQuery1->Open();

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

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

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

Это сообщение отредактировал(а) Alca - 2.2.2009, 11:42


--------------------
PM WWW ICQ Skype Jabber   Вверх
blackDancer
Дата 2.2.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 23.1.2009
Где: Тамбов

Репутация: нет
Всего: нет



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

IBQuery1->ExecSQL();

а не:
Код

IBQuery1->Open();

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

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

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

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

Добавлено через 2 минуты и 51 секунду
Билдер у меня 6 кодировку я везде ставил Win1251 в базе, а вот в билдере чёт не уверен.
PM MAIL   Вверх
mrbrooks
Дата 2.2.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



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

InterBase поддерживает Unicode. В эту сторону и греби.
PM MAIL   Вверх
Alca
Дата 2.2.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



О работе с русскими буквами в InterBase/Firebird
Почитай может чем поможет. smile

Добавлено через 2 минуты и 23 секунды
Borland Interbase / Firebird FAQ

Это сообщение отредактировал(а) Alca - 2.2.2009, 12:39


--------------------
PM WWW ICQ Skype Jabber   Вверх
blackDancer
Дата 2.2.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 23.1.2009
Где: Тамбов

Репутация: нет
Всего: нет



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

И теперь такой вопрос как тепреь делать заполнение для связаных таблиц может какой нибудь примерчик кто нибудь даст?
Очень интересно как будут себя вести ключевые поля достаточно сгенерировать значение  для одного ключевого поля, а к полю по которому оно связано заполниться автоматически или надо это предусмотреть????
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0843 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.