Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
1

Добавление строки в таблицу

15.03.2015, 18:16. Показов 3470. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Никак не могу разобраться с добавлением строки в таблицу, имеется база MSSQL , в таблице всего 2 поля ID и NAME , билдер гворит, либо нулевое значение у ID , либо повторяющиеся, хотя оно и не повторяется, помогите пожалуйста разобраться. Спасибо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
void __fastcall TForm3::Button1Click(TObject *Sender)
{
int i;
MaxQuery->Close();
MaxQuery->SQL->Clear();
MaxQuery->SQL->Add("SELECT max(id) AS ID FROM T_NAME_MODEL");
MaxQuery->Open();
i = MaxQuery->FieldByName("ID")->AsInteger;
MaxQuery->Close();
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text = "INSERT INTO T_NAME_MODEL ([ID],[NAME]) VALUES(:ID, :NAME)";
ADOQuery1->Parameters->ParamByName("ID")->Value=i++;
ADOQuery1->Parameters->ParamByName("NAME")->Value=Edit1->Text;
ADOQuery1->ExecSQL();
}
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2015, 18:16
Ответы с готовыми решениями:

Добавление строки в таблицу
Некорекктно работает добавление строк в таблицу, вот мой код: http://jsfiddle.net/Aa2ek/269/ Не...

Добавление строки в таблицу
Добрый день,нужно добавить новую строку в таблицу..работаю с аксесом.. клавиши навигации не...

Добавление строки таблицу БД
Привет! Есть пример из msdn о том как добавить данные в таблицу БД...

Добавление строки в таблицу
народ извените за ламерский вопрос есть таблица reg и еть форма после заполнения формы нажимаю...

19
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.03.2015, 19:25 2
Если поле ID является счётчиком, то зачем ему вручную увеличивать на единицу, если оно само увеличится на единицу...
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 19:26  [ТС] 3
если его не трогать, то ругается на пустое значение
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 21:59 4
Цитата Сообщение от Sasha Посмотреть сообщение
Если поле ID является счётчиком
Хм-м... А разве где-то прозвучало, что поле ID - счетчик?
fnt7, а ты проверял, чему равно значение переменной i после выполнения запроса MaxQuery? Правильно показывает?
А-а-а-а вот где косячек...
Цитата Сообщение от fnt7 Посмотреть сообщение
ADOQuery1->Parameters->ParamByName("ID")->Value=i++;
Догадался? Ты сначала присваиваешь параметру значение переменной i, которая в настоящий момент равна последнему значению ID, и только потом увеличиваешь его значение на 1. Понятное дело, что будет ругань, что такой номер уже присутствует в БД.
Чтобы этого избежать, вот так напиши:
C++
1
ADOQuery1->Parameters->ParamByName("ID")->Value = ++i;
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 22:19  [ТС] 5
не получается, ошибка : ограничение первичного ключа, невозможно вставить повторяющийся ключ в объект .
А значение i проверял, там все правильно, однако всё равно говорит о повторении
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 22:24 6
Тогда возвращаемся к первоначальному вопросу:
Цитата Сообщение от D1973 Посмотреть сообщение
чему равно значение переменной i после выполнения запроса MaxQuery? Правильно показывает?
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 22:29  [ТС] 7
да, правильно, в базе последнее id=9, а i=10

Добавлено через 52 секунды
точнее и там и там 9, ошибся
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 22:42 8
Цитата Сообщение от fnt7 Посмотреть сообщение
i = MaxQuery->FieldByName("ID")->AsInteger;
Когда ты выполнил вот эту строку, i у тебя должно быть 9, правильно?
Попробуй так еще:
C++
1
2
3
4
5
6
7
8
9
i = MaxQuery->FieldByName("ID")->AsInteger;
i++;
MaxQuery->Close();
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text = "INSERT INTO T_NAME_MODEL ([ID],[NAME]) VALUES(:ID, :NAME)";
ADOQuery1->Parameters->ParamByName("ID")->Value = i;
ADOQuery1->Parameters->ParamByName("NAME")->Value = Edit1->Text;
ADOQuery1->ExecSQL();
И, кстати, а ID - действительно счетчик? Если да, то можно еще так попробовать...
C++
1
2
3
ADOQuery1->SQL->Text = "INSERT INTO T_NAME_MODEL ([NAME]) VALUES(:NAME)";
ADOQuery1->Parameters->ParamByName("NAME")->Value = Edit1->Text;
ADOQuery1->ExecSQL();
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 22:51  [ТС] 9
у ID тип данных ID:int и это счетчик, я все пересмотрел, там указан шаг и начало отсчета, вроде все нормально.
И этот вариант тоже выдает аналогичную ошибку:
ADOQuery1->SQL->Text = "INSERT INTO T_NAME_MODEL ([NAME]) VALUES(:NAME)";
ADOQuery1->Parameters->ParamByName("NAME")->Value = Edit1->Text;
ADOQuery1->ExecSQL();
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 22:59 10
Черт его знает... Ну, для очистки совести, попробуй еще вот такой код выполнить и посмотреть, чему i будет равно.
C++
1
2
3
4
5
6
MaxQuery->Close();
MaxQuery->SQL->Clear();
MaxQuery->SQL->Add("SELECT id FROM T_NAME_MODEL");
MaxQuery->Open();
MaxQuery->Last();
i = MaxQuery->FieldByName("ID")->AsInteger;
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 23:09  [ТС] 11
не, не работает, а i=9

Добавлено через 4 минуты
с другими таблицами в базе такая же беда
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 23:10 12
Лучший ответ Сообщение было отмечено fnt7 как решение

Решение

А если попробовать тупо без параметров сработать, типа так:
C++
1
2
3
4
5
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
String s = String().sprintf(L"INSERT INTO T_NAME_MODEL ([ID],[NAME]) VALUES(%d, %s)", ++i, Edit1->Text);
ADOQuery1->SQL->Add(s);
ADOQuery1->ExecSQL();
Если у тебя BCB6, тогда 3-ю строку запиши вот так:
C++
1
String s = String().sprintf("INSERT INTO T_NAME_MODEL ([ID],[NAME]) VALUES(%d, %s)", ++i, Edit1->Text);
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 23:15  [ТС] 13
вооо, теперь говорит "недопустимое имя столбца"
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 23:16 14
Хотя, если у тебя в таблице всего два этих поля, то и такой конструкции должно хватить:
C++
1
String s = String().sprintf(L"INSERT INTO T_NAME_MODEL VALUES(%d, %s)", ++i, Edit1->Text);
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 23:18  [ТС] 15
строка добавилась, только я буквенные выражения вводить не могу, хотя варчар стоит
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 23:20 16
Попробуй тогда или так
C++
1
String s = String().sprintf(L"INSERT INTO T_NAME_MODEL VALUES(%d, %s)", ++i, QuotedStr(Edit1->Text));
или так
C++
1
String s = String().sprintf(L"INSERT INTO T_NAME_MODEL VALUES(%d, \"%s\")", ++i, Edit1->Text);
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 23:24  [ТС] 17
при 1-ом варианте ничего не происходит,а 2-ой тоже на буквы ругается.
У меня BCB6.
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 23:26 18
И как именно ругается? Для BCB6 букву L перед кавычкой не надо ставить:
C++
1
String s = String().sprintf("INSERT INTO T_NAME_MODEL VALUES(%d, \"%s\")", ++i, Edit1->Text);
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 12
15.03.2015, 23:28  [ТС] 19
ВСЁ, заработало!!! Спасибо большое, вы мне очень помогли!
0
Модератор
9260 / 6038 / 2379
Регистрация: 21.01.2014
Сообщений: 25,801
Записей в блоге: 3
15.03.2015, 23:29 20
Да на здоровье
0
15.03.2015, 23:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2015, 23:29
Помогаю со студенческими работами здесь

Добавление строки в таблицу
Привет. на форме есть кнопка и QTableWidget создал коннект connect(ui->pushButton,...

Добавление строки в таблицу с перезаписью
Здравствуйте, необходима ваша помощь. Такая задача. Имеется таблица с полями, например "Название...

Добавление строки-дубля в таблицу
Необходимо заполнить таблицу в БД1 информацией из из другой таблицы в БД2 (структура таблиц...

Добавление строки в таблицу DataGrid
У меня есть таблица, выведенная на форму, туда можно вписать новые данные в ячейки, и мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru