Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу MS SQL не удается найти строку для обновления
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Виталик Виталик вне форума
Member
 
Сообщений: 333
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.03.2006
По умолчанию MS SQL не удается найти строку для обновления - 02.08.2006, 13:35

здравствуйте!

проблема такая:

написал в Билдере оболочку для работы с данными, хранящимися в MS SQL. программа простая - несколько человек заполняют в программе анкеты, которые потом добавляются в БД. в каждой анкете в базе есть поле id, которое является ключевым. при начале добавления анкеты, в базу сразу вставляется пустая запись с заполненным этим полем, сохраняется, а потом уже открывается для модификации (я так сделал для того, чтобы при паралельной работе нескольких человек с программой не возникало записей с одинаковыми полями id - посоветовали просто сделать автоинкремент, в ближайшем будущем так и сделаю). так вот суть проблемы - время от времени при сохранении введенной анкеты высвечивается ошибка "не удается найти строку для обновления". я с MS SQL начал работать впервые и потому не знаю за что взяться в первую очередь. можете посоветовать на что стоит обратить внимание и вообще как выявить в чем ошибка?

код программы

функции set_inactive() и set_active() вызываются для предотвращения возможности ввода данных до нажатия кнопки добавить..

добавление новой записи. DBText1 отображает результат запроса select MAX (id) from table1.

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        ADODataSet1->Insert();
        if(DBText1->Caption != "")
                curr_id->Text=IntToStr(StrToInt(DBText1->Caption)+1);
        else
                curr_id->Text="0";
        set_inactive();
        ADODataSet1->Post();
        ADODataSet1->Edit();
}
сохранение записи.
Код:
void __fastcall TForm1::Button9Click(TObject *Sender)
{

        ADODataSet1->Post();
        set_active();
}
Ответить с цитированием
  (#2 (permalink)) Старый
Sikorsky Sikorsky вне форума
Member
 
Сообщений: 171
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2004
По умолчанию 02.08.2006, 19:28

Цитата:
при начале добавления анкеты, в базу сразу вставляется пустая запись с заполненным этим полем, сохраняется, а потом уже открывается для модификации (я так сделал для того, чтобы при паралельной работе нескольких человек с программой не возникало записей с одинаковыми полями id - посоветовали просто сделать автоинкремент, в ближайшем будущем так и сделаю).
1. Если поле id ключевое, то инкрементировать его надо на сервере для MS SQL это identity(1,1), ну или просто в Interprise Manager выбери соответствующий пункт, при редактировании таблицы.
2. ИМХО: перед добавлением записи сразу вносить ее в таблицу, не лучшее решение, а если пользователь решил добавить, а потом передумал добавлять.... надо удалять запись ?. Кроме того другие пользователи могут увидеть эту пустую запись, решить например что она некорректна(так как пустая) и удалить, и пользователь который добавлял получит как раз "не удается найти строку для обновления".

Так что меняй концепцию и все будет ОК.
Ответить с цитированием
  (#3 (permalink)) Старый
Виталик Виталик вне форума
Member
 
Сообщений: 333
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.03.2006
По умолчанию 03.08.2006, 12:21

Цитата:
2. ИМХО: перед добавлением записи сразу вносить ее в таблицу, не лучшее решение, а если пользователь решил добавить, а потом передумал добавлять.... надо удалять запись ?.
В программе используется флажок, который при добавлении новой записи устанавливается в 1, а при изменении - в 0. При нажатии на кнопку "Отмена" в зависимости от значения флажка запись удаляется.

Цитата:
Кроме того другие пользователи могут увидеть эту пустую запись, решить например что она некорректна(так как пустая) и удалить, и пользователь который добавлял получит как раз "не удается найти строку для обновления".
Действительно, об этом я как-то не подумал.. Хотя у нас пользователи всего лишь добавляют данные..

Цитата:
Так что меняй концепцию и все будет ОК.
Дальнейшие действия:
1. Поле id сделать автоинкрементом.
2. Насчет концепции - наверно лучше будет предварительно вводить данные, а потом sql- запросом сразу добавлять всю запись. Да? Или может есть какие-нибудь другие методы?

и еще насчет инкремента.. можешь, плиз, подробнее рассказать, как сделать поле int автоинкрементом? в опциях полях есть параметр identity.. это его надо изменять? и на какое значение? база уже просто рабочая, не хочется особо экспериментировать

и еще.. сообщение "не удается найти строку для обновления" возникает не всегда при добавлении новой записи.. довольно часто эта ошибка происходит просто при изменении некоторых полей в уже готовой записи..
Ответить с цитированием
  (#4 (permalink)) Старый
Sikorsky Sikorsky вне форума
Member
 
Сообщений: 171
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.04.2004
По умолчанию 04.08.2006, 09:45

Цитата:
и еще.. сообщение "не удается найти строку для обновления" возникает не всегда при добавлении новой записи.. довольно часто эта ошибка происходит просто при изменении некоторых полей в уже готовой записи..
У меня складывается впечатление, что твое ключевое поле не primary key поле ? Потому как у меня такая ошибка как-то вылезала, когда я в таблице забыл установить primary key.
У тебя он установлен ?
Внизу, где идут установки поля надо поставить:
Identity поставить Yes
Identity Seed поставить в 1, тогда от 1 начнет инкрементировать
Identity Increment поставить в 1, тогда на 1 будет инкриментировать

Тип поля должен быть int, ну или другой целочисленнный

Цитата:
В программе используется флажок, который при добавлении новой записи устанавливается в 1, а при изменении - в 0. При нажатии на кнопку "Отмена" в зависимости от значения флажка запись удаляется.
Так делать не гуд.
Во-первых, если ключевое поле автоинкрементируемое, то будет пробел в номерах, так как автоинкремент только прибавляет номера, и когда запись добавилась, номер тоже, когда удалилась получился пробел в номере.
Во-вторых я уже описывал проблемму с пользователями.

Цитата:
2. Насчет концепции - наверно лучше будет предварительно вводить данные, а потом sql- запросом сразу добавлять всю запись. Да? Или может есть какие-нибудь другие методы?
Можно и так делать, хотя ты ведь пользуешься Builder'ом так что все как обчно делаешь
Код:
ADODataSet1->Insert();
//А здесь вводишь данные...
ADODataSet1->Post();
Ответить с цитированием
  (#5 (permalink)) Старый
Виталик Виталик вне форума
Member
 
Сообщений: 333
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.03.2006
По умолчанию 04.08.2006, 11:18

спасибо.. как сделаю все, скажу о результатах..
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Виталик Виталик вне форума
Member
 
Сообщений: 333
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.03.2006
По умолчанию 04.08.2006, 11:59

и еще.. обязательно ли делать в каждой таблице ключевые поля? у меня есть несколько таблиц, в которых просто хранятся возможные значение, которые потом пользователь выбирает при заполнении некоторох полей записи.. надо ли в этих таблицах тоже делать ключевые поля?
Ответить с цитированием
  (#7 (permalink)) Старый
Nightmareterrible Nightmareterrible вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.07.2014
По умолчанию 15.07.2014, 15:50

Решение проблемы найдено.
После Post нужно сделать переокрытие DataSet. Плюс не забыть Locate('ID', OldID, []).
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти последную позицую вхождения символа в строку bernard Prolog 1 21.04.2012 18:43
После архивации windows 7 появилась ошибка: "Не удается найти указанный файл". troyn61 Любые вопросы от новичков 13 29.06.2011 17:09
Найти количество строк, похожих на первую строку данной матрицы Саломон Pascal 1 14.06.2011 22:21
Не удается найти установленный антвирус Avast. 4eburashka Любые вопросы от новичков 4 15.03.2011 18:53
Не удается найти services.msc Slanativ Любые вопросы от новичков 1 11.03.2011 22:01
После ус тановки Windows 7 не удается найти драйвера к видеокарте Radeon 9600 AGP 256 zffni Любые вопросы от новичков 2 03.03.2011 22:25
Не удается найти "index.html" в программе Macromedia Flash Player 8.5 Zheny@86 Любые вопросы от новичков 4 22.07.2008 02:52
как найти по условию нужную строку D_e_n_n Visual Basic 2 24.01.2008 16:03
Какие причины "не удается найти строку для обновления" Виталик MSSQL Server 2 27.07.2006 12:04
Не удается найти строку для обновления SergeyV MSSQL Server 3 30.03.2006 15:00
Не удается найти поле как исправить idont_denver Другие СУБД 0 10.08.2005 11:46
как сделать чтобы при нажатии на строку грида ,был вывод записи на строку Laime-oz C++ Builder 94 26.05.2005 01:17



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов