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

Тема в разделе "Delphi - Базы данных", создана пользователем Elfik, 13 окт 2005.

Статус темы:
Закрыта.
  1. Elfik

    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, но так и не разобрался как его использовать.
     
  2. Barmutik

    Barmutik Гость

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

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

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

    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:((
    Как присвоить этому полю значение?
     
  4. Barmutik

    Barmutik Гость

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

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

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

    Guest Гость

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

    Barmutik Гость

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

    Удачи!
     
  7. Hetman

    Hetman Гость

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

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

    Barmutik Гость

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

Поделиться этой страницей