• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Автоинкрементное поле

  • Автор темы Elfik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
E

Elfik

Работаю с моделью Briefcase. Есть база данных Access (включает 3 таблицы), которая через ADO подключается к моей програме и посредством запросов 'SELECT *...' сохраняется локально в ADODataSet'ах (по одному на каждую таблицу), которые затем полностью отключаются от физической базы и работают локально:

ADOConnection.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+TestBaseName+';Persist Security Info=False';
ADOConnection.Connected:=true;
DS.Connection:=ADOConnection;
DS.CommandText:=SQLText;
DS.Open;
DS.Connection:=nil;
ADOConnection.Connected:=false;

Так вот - в одной из таблиц есть индекс - автоинкрементное поле. Когда я питаюсь вставить какое-то новое значение:

DS.Append;
DS.FieldValues['SectionName']:=sName;
DS.Post;

потом сделать:

if DS.Locate('SectionName',SectionListBox.Items[SectionListBox.ItemIndex],[]) then
s:=DS.FieldByName('SectionID').AsString;

где SectionID и есть, собственно, автоинкрементное поле, то на последнем участке видно, что индекс не определён (s=''):blink:((
Вопрос: Что сделать, чтобы индекс автоматически автоинкрементно увличивался при добавлении новой записи?
P.S. Нашёл свойство AutoGenerateValue, но так и не разобрался как его использовать.
 
B

Barmutik

Это стандартная проблема... значения в этих полях не будут назначены до тех пор пока Вы не произведёте Post в базу данных.

Клиентская программа не может знать алгоритмов по какие производится вычисления значений автоинрементных полей у сервера баз данных... отсюда такая ситуация...

В этом случае есть простое решение (сам использую): занимайтесь генерацией значений первичных ключей самостоятельно .. всё будет нормально...
 
E

Elfik

<!--QuoteBegin-Barmutik+13:10:2005, 09:27 -->
<span class="vbquote">(Barmutik @ 13:10:2005, 09:27 )</span><!--QuoteEBegin-->В этом случае есть простое решение (сам использую): занимайтесь генерацией значений первичных ключей самостоятельно .. всё будет нормально...
[snapback]25775" rel="nofollow" target="_blank[/snapback]​
[/quote]

Не получается.
Делаю:
SectionsDS.IndexFieldNames:='SectionID';
SectionsDS.FieldValues['SectionID']:=SectionsCnt;
inc(SectionsCnt);
а оно мне Runtime Error 'Field SectionID cann't be modified':blink:((
Как присвоить этому полю значение?
 
B

Barmutik

Дело в том что конечно Вы не можете сами присваивать значения полю с типом автоинкремент.

Сделайте это поле обычным int, primaer key и сами создавайте значения...

Коллизии с несколкими клиентами и одинаковыми ИД , будете решать на посте в базу данных...
 
G

Guest

Наверно так и сделаю. Напряжно, всё-таки. Я думал, в Делфе можна замутить, чтобы датасэт обновлял автоинкремент автоматически по правилу, аналогичному с оригинальной базой.
Но всё-равно - спасибо за помощь!
 
B

Barmutik

Она не может знать тех правил !

Удачи!
 
H

Hetman

стоп! а разве при добавлении записи в базу (поле с автоинкрементом при этом не трогать) инкремент автоматически не производиться?

и ошибка Runtime Error 'Field SectionID cann't be modified' потаму, что это поле не нужно трогать при записи вовсе. :(
 
B

Barmutik

При олдбавлении в базу оно как раз и будет производится .. тут вопрос в том что человеку надо сразу после добавления обратится к этому полю .. что бы прочитать его значение .. а там пусто ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!