powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как получить id только-что вставленной записи
25 сообщений из 36, страница 1 из 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
25 сообщений из 36, страница 1 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как получить id только-что вставленной записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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