powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как получить id только-что вставленной записи
36 сообщений из 36, показаны все 2 страниц
Как получить id только-что вставленной записи
    #37721648
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!
Помогите, пожалуйста, с такой задачей :
Есть такой код :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
string query = "INSERT INTO Categories(ParentId, nameCategory)VALUES(0, @newCategory)";
        SqlCommand cmd = new SqlCommand(query, conn);

        SqlParameter param = new SqlParameter();
        param.ParameterName = "@newCategory";
        param.Value = nameCategory.Text;
        param.SqlDbType = SqlDbType.NVarChar;        
        cmd.Parameters.Add(param);

        SqlDataReader r = cmd.ExecuteReader();
        int id = Convert.ToInt32(r["IdCategory"].ToString());
        nameCategory.Text = Convert.ToString(id);



Происходит вставка новой записи в базу. Всё вставляется нормально, но мне нужно заодно вернуть id этого только-что вставленного элемента.
Ошибка такая :
Код: c#
1.
2.
Ошибка сервера в приложении Shop.
Недопустимая попытка чтения при отсутствии данных. 


Буду признателен за помощь!
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721662
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получаем ид последней вставленной записи как-то так: SELECT @@IDENTITY as ID
и кстати, инсерт выполняй при помощи ExecuteNonQuery
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721711
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYS@@IDENTITY
На свалку )
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721734
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYSполучаем ид последней вставленной записи как-то так: SELECT @@IDENTITY as ID
и кстати, инсерт выполняй при помощи ExecuteNonQuery
Почти так, но лучше scope_identity .
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721869
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeSanSYSполучаем ид последней вставленной записи как-то так: SELECT @@IDENTITY as ID
и кстати, инсерт выполняй при помощи ExecuteNonQuery
Почти так, но лучше scope_identity .
Спасибо, буду иметь ввиду

msdnФункции SCOPE_IDENTITY и @@IDENTITY возвращают последние значения идентификатора, созданные в таблицах во время текущего сеанса. Однако функция SCOPE_IDENTITY возвращает значения, вставленные только в рамках текущей области, тогда как действие функции @@IDENTITY не ограничивается никакими областями.

МСУSanSYS@@IDENTITY
На свалку )
Действительно
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721877
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYS,

Например, если у тебя в базе имеется триггер, который чего-то тоже инсертит (например, лог или ещё чего). то результат в @@identity будет кривой. Он возьмётся из той другой таблицы, которая была последняя.
ПС. А вообще-то, имхо, идентити можно на гуиды заменить. Я сейчас, когда базы криэйчу, их и использую. С ними проблем гораздо меньше, особенно если вдруг нужна репликация, или просто в справочник записей добавить.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721894
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeSanSYS,

Например, если у тебя в базе имеется триггер, который чего-то тоже инсертит (например, лог или ещё чего). то результат в @@identity будет кривой. Он возьмётся из той другой таблицы, которая была последняя.
Да я полностью понял ошибку :)
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721906
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В T-SQL же появился OUTPUT . Может его стоит использовать?
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721910
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeПС. А вообще-то, имхо, идентити можно на гуиды заменить. Я сейчас, когда базы криэйчу, их и использую. С ними проблем гораздо меньше
uniqueidentifier занимает 16 байтов, int - 4 байта. Возьмем для примера таблицу из 10 млн записей. 160 Мб против 40 Мб на кластерый индекс - весьма существенная разница, так или иначе поиск будет медленнее. А теперь внимание вопрос - нафига оно нужно? Во-вторых, не существенно, но всё же - читабельность тоже играет некоторую положительную роль в сопровождении системы.
ShSergeособенно если вдруг нужна репликация, или просто в справочник записей добавить.
"Вдруг" репликация не возникает. Её планируют, причем весьма тщательно. Это как "вдруг" родить, минуя саму беременность :)
Репликация (если речь о мерж-репликации или о репликации транзакций, а не о простом снапшоте) сама создаст гуид для синхронизации. Ну и еще между Publisher(s) и Subscriber(s) нужно сделать непересекающееся множество значений под кластерный интовый индекс.
Так что идти на такие жертвы (по поводу гуидов) ради того, "а вдруг появится репликации" - безумие.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721933
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Какие нафиг "мерж-репликации или о репликации транзакций"? Я про "мерж" говорил, что совершенно очевидно из контекста. Вы сами это слово выдумали? Если где-то нахватались, то хотя бы к месту используйте.
ПС. Да, гуиды - лучше. Я даже спорить на этот счёт не собираюсь. Лучше и всё! На миллионах записей отлично работают.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721936
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeМСУ, Какие нафиг "мерж-репликации или о репликации транзакций"? Я про "мерж" говорил, что совершенно очевидно из контекста. Вы сами это слово выдумали? Если где-то нахватались, то хотя бы к месту используйте.
RTFM Merge Replication Overview
Transactional Replication Overview
Snapshot Replication Overview
ShSergeПС. Да, гуиды - лучше. Я даже спорить на этот счёт не собираюсь. Лучше и всё! На миллионах записей отлично работают.
Ну что ж, отличный аргумент. Не поспоришь, блин
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721985
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно что guid занимает больше места, дольше строится индекс, нечитабелен, но при этом поиск по нему в рамках того или иного сервера будет хорошим

Следует помнить что GUID это именно http://ru.wikipedia.org/wiki/GUID] Globally Unique Identifier и далеко не для каждой сущности действительно необходим глобально уникальный идентификатор, имхо
http://msdn.microsoft.com/ru-ru/library/ms190215.aspx
Тип данных uniqueidentifier имеет несколько недостатков.

Значения являются длинными и непонятными. Поэтому пользователям сложно вводить их без ошибок и еще сложнее запоминать.


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


Не существует способа определить, в какой последовательности были созданы значения типа uniqueidentifier. Они не приспособлены для использования существующими приложениями, полагающимися на последовательное возрастание ключей в последовательности.


Занимая 16 байт, тип данных uniqueidentifier является относительно большим по сравнению с другими типами данных (например с 4-байтовыми целыми). Индексы, построенные на ключах типа uniqueidentifier, могут работать медленнее по сравнению с индексами, где используются ключи типа int.

Если глобальная уникальность не требуется или нужен ключ с последовательно возрастающими значениями, рекомендуется использовать свойство IDENTITY.

К примеру - ид пользователя можно сделать гидом "особенно если вдруг" нужно будет слить две базы пользователей (о боже, не дай бог конечно), + если пользователю отправляется какое-то письмо для подтверждения чего-то (регистрация, покупка и многое другое) лучше использовать гид (хотя и это не значит что нужно использовать его в качестве ключевого поля пользователя), а не число, чтобы пользователь не перебирал иды в урле

из-за товарищей МСУ & ShSerge чувствую я подсяду на этот форум :)
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721990
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУuniqueidentifier занимает 16 байтов, int - 4 байта. Возьмем для примера таблицу из 10 млн записей. 160 Мб против 40 Мб на кластерый индекс - весьма существенная разница, так или иначе поиск будет медленнее. А теперь внимание вопрос - нафига оно нужно? Во-вторых, не существенно, но всё же - читабельность тоже играет некоторую положительную роль в сопровождении системы.

Я бы внес поправочку: в MSSQL при последовательной вставке мы будем иметь не 160 Мб для uniqueidentifier, а больше 1 ГБ... Против все тех же 40 Мб для монотонно нарастающего int.
И это если рассматривать обычные индексы... Если начать рассматривать кластерные индексы - цифры будут выглядеть внушительнее, хотя и с примерно тем же соотношением...

ShSergeМСУ,
ПС. Да, гуиды - лучше. Я даже спорить на этот счёт не собираюсь. Лучше и всё! На миллионах записей отлично работают.
GUID в, например, кластерном первичном индексе? Да, уж... Действительно "лучше"... Даже для "всего миллионов записей"...

А это ничего ничего, что из-за "размазывания" такого индекса размер базы будет "в-среднем" примерно раз в восемь больше, чем объем хранимых в базе данных?
И этот действительно ничего, что для выборки любых данных по ПК диск начнет шерстить весь файл данных в абсолютно случайном порядке размещения страниц?
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37721996
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeДа, гуиды - лучше. Я даже спорить на этот счёт не собираюсь. Лучше и всё! На миллионах записей отлично работают.
да не, не лучше, у вас просто сервер хороший, видимо, ну право :)
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722001
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYSОчевидно что guid занимает больше места, дольше строится индекс, нечитабелен, но при этом поиск по нему в рамках того или иного сервера будет хорошим

Идентификация записи по такому типу индекса будет хорошей, но вот ЗАПРОСЫ с участием связей по такому типу индекса ХОРОШИМИ быть не могут... :-(
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722004
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYSShSergeДа, гуиды - лучше. Я даже спорить на этот счёт не собираюсь. Лучше и всё! На миллионах записей отлично работают.
да не, не лучше, у вас просто сервер хороший, видимо, ну право :)
А вот это дело поправимое - с ростом объема данных все станет аккурат на свои места...
Хотя, если это не "их" сервер и не "их" база данных - им будет все равно...
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722061
Фотография tsyselsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722089
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bigint ограничен, и через пару десятков миллионов лет - базе конец :)
А пока, если глобальность не нужна - гуид в топку )
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722132
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел C:\Windows\Microsoft.NET\Framework\ v4.0.30319 \InstallCommon.sql и прочие:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  CREATE TABLE [dbo].aspnet_Users (
    ApplicationId    uniqueidentifier    NOT NULL FOREIGN KEY REFERENCES [dbo].aspnet_Applications(ApplicationId),
    UserId           uniqueidentifier    NOT NULL PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),
    UserName         nvarchar(256)       NOT NULL,
    LoweredUserName  nvarchar(256)	     NOT NULL,
    MobileAlias      nvarchar(16)        DEFAULT NULL,
    IsAnonymous      bit                 NOT NULL DEFAULT 0,
    LastActivityDate DATETIME            NOT NULL)

   CREATE UNIQUE CLUSTERED INDEX aspnet_Users_Index ON [dbo].aspnet_Users(ApplicationId, LoweredUserName)
   CREATE NONCLUSTERED INDEX aspnet_Users_Index2 ON [dbo].aspnet_Users(ApplicationId, LastActivityDate)
END

  CREATE TABLE dbo.aspnet_Roles (
        ApplicationId    uniqueidentifier    NOT NULL FOREIGN KEY REFERENCES dbo.aspnet_Applications(ApplicationId),
        RoleId           uniqueidentifier    PRIMARY KEY  NONCLUSTERED DEFAULT NEWID(),
        RoleName         nvarchar(256)       NOT NULL,
        LoweredRoleName  nvarchar(256)       NOT NULL,
        Description      nvarchar(256)       )
 CREATE UNIQUE  CLUSTERED  INDEX aspnet_Roles_index1 ON  dbo.aspnet_Roles(ApplicationId, LoweredRoleName)
END

  CREATE TABLE dbo.aspnet_Paths (
        ApplicationId    UNIQUEIDENTIFIER    NOT NULL FOREIGN KEY REFERENCES dbo.aspnet_Applications(ApplicationId),
        PathId            UNIQUEIDENTIFIER   PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),
        Path              NVARCHAR(256)      NOT NULL,
        LoweredPath       NVARCHAR(256)      NOT NULL)
  CREATE UNIQUE CLUSTERED INDEX aspnet_Paths_index ON dbo.aspnet_Paths(ApplicationId, LoweredPath)

Как видим гид используется для идентификации базовых сущностей
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722176
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYSКак видим гид используется для идентификации базовых сущностей
Осталось понять, что такое не базовые сущности :) По поводу мембершипа - это как-раз универсальная и расширяемая архитектура безопасности с уникальными идентификаторами не только уровня таблиц.
А по поводу бизнес схем могу посоветовать глянуть на более или менее реалистичную AdventureWorks.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722179
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uniqueidentifier нужем только там, где есть конкретное требование использовать его. Точно так же, как и datetime, bit и т.д. Разбрасываться им направо и налево - параноя, граничащая с эмбицилизмом.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722184
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYS
Код: sql
1.
        RoleName         nvarchar(256) 



Да они там вообще не мелочатся )
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722193
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУuniqueidentifier нужем только там, где есть конкретное требование использовать его. Точно так же, как и datetime, bit и т.д. Разбрасываться им направо и налево - параноя, граничащая с эмбицилизмом.
+1
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722195
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонSanSYS
Код: sql
1.
        RoleName         nvarchar(256) 



Да они там вообще не мелочатся )

норм, главное что не nchar )
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722438
st_st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На веб-страницах часто используется id записи (id новости, id юзера и прочее), как в самих тегах - <div id="s_id_элемента"></div>, так и в ссылках - <a href="page.aspx?id=1"></a>. С гуидами это всё превратится в длинный нечитаемый набор символов (плохо при разработке/отладке) + возрастание трафика.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722635
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_stНа веб-страницах часто используется id записи (id новости, id юзера и прочее), как в самих тегах - <div id="s_id_элемента"></div>, так и в ссылках - <a href="page.aspx?id=1"></a>. С гуидами это всё превратится в длинный нечитаемый набор символов (плохо при разработке/отладке) + возрастание трафика.
Почти все верно, за исключением "id новости, id юзера и прочее" - вместо ида в урле я предпочитаю использовать текстовое (понятное человеку) представление, например: /news/hello-world/ или /users/st_st и вам того советую, так ведь нагляднее :)
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722715
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это тоже, смотря как сделать. Например, в качестве айдишника юзера часто (не всегда) можно использовать его логин.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722723
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или имейл ...
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722744
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или номер телефона :)
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722746
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYSили номер телефона :)
Не годится. Телефонов может быть много.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722906
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeSanSYSили номер телефона :)
Не годится. Телефонов может быть много.
ну... логинов и емейлов тоже :)
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37722941
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYS(понятное человеку) представление

Это больше для сео, имхо, человеков вообще не должно интересовать что там после адресса, в Хроме оно все серое например.
/news/123/ и /users/15/ прекрасно индексируется, остальное для красоты и продвижения, но красота пропадает, когда ник содержит разные символы, после url encoding. Разве что, безопаснее не светить id.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37723104
st_st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SanSYSПочти все верно, за исключением "id новости, id юзера и прочее" - вместо ида в урле я предпочитаю использовать текстовое (понятное человеку) представление, например: /news/hello-world/ или /users/st_st и вам того советую, так ведь нагляднее :)

В урле при желании и рерайтить можно в чпу только на продакшене. Мне просто при разработке быстрее поменять параметры прям в урле браузера, http://www.sql.ru/forum/actualthread.aspx?tid=929058, последнюю восьмёрку меняешь и побежал по темам, чем к примеру печать вот это - /threads/Raskryvajuscheesja-menjuhtml-css, но это уже индивидуальные предпочтения.
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37723182
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПарамонSanSYS(понятное человеку) представление

Это больше для сео, имхо, человеков вообще не должно интересовать что там после адресса
Для сео конечно это гуд, но мне лично больше нравится когда не куча параметров, а красивый урл, это же эстетично :)
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37739593
softilium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+1

Там еще есть такие грабли для любителей гуидов - кластерный индекс по первичному ключу, который гуид. Это вынос мозга для сервера полный будет.

МСУ,
...
Рейтинг: 0 / 0
Как получить id только-что вставленной записи
    #37740573
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softilium+1

Там еще есть такие грабли для любителей гуидов - кластерный индекс по первичному ключу, который гуид. Это вынос мозга для сервера полный будет.

МСУ,

а подробнее можно про "вынос мозга"?
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как получить id только-что вставленной записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]