Как узнать id новой записи?(ODBC)

Тема в разделе "WASM.WIN32", создана пользователем Android, 13 окт 2005.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Создаю таблицу CREATE TABLE Tabel1(id AUTOINCREMENT NOT NULL PRIMARY KEY,Val TEXT(15) NOT NULL)

    Добавляю я запись в таблицу INSERT INTO Tabel1(val)VALUES('empty'). Все это при помощи ODBC. После добавления мне нада узнать, какой же id был присвоен новой записи? Единственный способ, какой мне приходит на ум это послать запрос типа SELECT max(id) FROM Tabel1. Но это очень медленно работает когда добавляешь несколько тысяч записей. Существует какой-нибудь другой способ? Что-то вроде SQLGetStmtAttr с каким-то атрибутом или SQLMoreResults(это так, просто мысли вслух), ведь ODBC драйвер должен знать какой id он присвоил.

    Пишите все что есть по этому вопросу. Спасибо.
     
  2. Marsianin

    Marsianin New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    6
    Адрес:
    Russia
    Во первых ODBC может и не знать какой ID присвоен записи, потому что это присвоение осуществляется на сервере,

    А вообще скажем у MSSQL есть переменная, непомню как называется, которая содержит как раз ID последней вставленной записи. ПРосто считываешь ее и усе.



    Если же например, речь идет о FireBird, то считывашь значение соответствующего генератора.



    А еще вопрос в том как ты работаешь с ODBC и какие настройки БД.
     
  3. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Я не хочу зависеть от конкретной БД, существует ли универсальный способ? Мне кажется что это должно быть предусмотренно в ODBC API, т.е. ты посылаешь запрос серверу, а он тебе возвращает di, и еще я так и не нашел универсального способа создавать файл БД на диске.
     
  4. Arvensis

    Arvensis New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2004
    Сообщения:
    72
    Адрес:
    Russia
    Из справки к Access: "Чтобы найти последнее значение, использованное для столбца с автоматическим шагом, можно воспользоваться инструкцией SELECT @@IDENTITY. Название таблицы задать нельзя. Будет получено значение из последней обновленной таблицы, содержащей столбец с автоматическим шагом."

    ('Типы данных SQL') Не зависеть от БД не получится
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Android



    Нет





    Этого способа нет, т.к. разные движки принимают разные параметры для создания базы.
     
  6. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Android

    Используй поле IDENTITY, тогда сможешь получить в переменной @@IDENTITY идентификатор вставленной записи.А с автоинкрементом, придется через SELECT MAX(имя_поля) осуществлять проверку.

    Правда можно и процедуру на TSQL написать, которая будет вставлять запись, а с RETURN возвращать ID вставленной записи. Но тогда поле идентификатора должно быть Integer (по крайней мере в MS SQL 2000 RETURN может вернуть значение не больше Integer).
     
  7. Marsianin

    Marsianin New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    6
    Адрес:
    Russia
    irrona, то что вы написали верно для MS SQL и для ACCESSa и усе :)

    и еще не факт что с момента вставки записи и получения Мах(имя поля), другой клиент не осуществит вставки записи .. :)) так что выводы делайте господа...

    разве что написать хранимую процедуру которая будет вставлять запись и возвращать ее ID.
     
  8. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Всем спасибо за ответы.

    Не пойму, почему не предусмотрена эта простая операция?!