powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / как получить Auto Incerment Value?
37 сообщений из 37, показаны все 2 страниц
как получить Auto Incerment Value?
    #33036149
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте все!

У меня вот такая проблемка:

есть таблица в которой Primery Key автоматически инкрементируется при INSERTe.
в эту таблицу я делаю инсерт при помощи

Код: plaintext
1.
2.
3.
Dim cmd As New SqlCommand(sqlinsert)
cmd.Connection() = strConn
cmd.ExecuteNonQuery()

как мне получить только что сгенерировашийся ID? Функции Last или Max не подоходят, потому что база данных мульиюзерская.

Заранее благодарен!
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036203
Стр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
судя по всему у тебя СУБД это MS SQL
наверное, нужно выполнить батч по ExecuteScalar
Код: plaintext
1.
INSERT INTO ... VALUES(...);
SELECT SCOPE_IDENTITY();

подробнее в MSDN
Retrieving Identity or Autonumber Values
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036276
-=LL=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй...
Dim i As Integer = cmd. ExecuteScalar()
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036342
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=LL=-Попробуй...
Dim i As Integer = cmd. ExecuteScalar()

и что по твоему должно вернуться?
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036387
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=LL=-Попробуй...
Dim i As Integer = cmd. ExecuteScalar()

не работает
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036391
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стрсудя по всему у тебя СУБД это MS SQL
наверное, нужно выполнить батч по ExecuteScalar
Код: plaintext
1.
INSERT INTO ... VALUES(...);
SELECT SCOPE_IDENTITY();

подробнее в MSDN
Retrieving Identity or Autonumber Values

это нужно с DataSet оперировать, как я понял... в моем случае это не очень к месту.
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036408
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторФункции Last или Max не подоходят, потому что база данных мульиюзерская.
Какая база???
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036426
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT SCOPE_IDENTITY(); - можно выполить отдельной командой сразу после вставки, если в однлм баче сложно
_______________________________________________________
Господи, сколько ещё не сделано... А сколько ещё предстоит не сделать...!
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036481
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig авторФункции Last или Max не подоходят, потому что база данных мульиюзерская.
Какая база???

MS SQL Server 2000
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036500
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторMS SQL Server 2000
А почему "Функции Last или Max не подоходят"???
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036525
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig авторMS SQL Server 2000
А почему "Функции Last или Max не подоходят"???

наврено потомучто транзакции могут быть, блокировки там всякие:)
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036548
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig авторMS SQL Server 2000
А почему "Функции Last или Max не подоходят"???

потому что пока я вожусь с макс value этот value может уже быть совсем другим value если другие юзера присоеденили data.
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036558
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быть может по всякому - хочется услышать от автора: в чём затруднения?...
P.S. SCOPE_IDENTITY() - на это блокировки и транзакции не распространяются???
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036572
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ищи по запросу - две строки не могут же быть одинаковыми (различия только в id)... Сделал инсерт и выполнил запрос на выборку вставленной строки строки?
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036600
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrigБыть может по всякому - хочется услышать от автора: в чём затруднения?...
P.S. SCOPE_IDENTITY() - на это блокировки и транзакции не распространяются???

BOL
SCOPE_IDENTITY and @@IDENTITY will return last identity values generated in any table in the current session. However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.


тоесть мы видим только то, что сами вставили, а как уже правильно говорил avoda, пока мы через max или last будем пытаться вытащить значение, в это же время кто-то быстрее успеет вставить еще одну строку, и эту функции вернут неверные значения. Мультиюзерная среда однако;)
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036641
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так чего у него не получается???
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036656
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrigТак чего у него не получается???
я так понимаю не знает как получить SCOPE_IDENTITY или @@IDENTITY
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036683
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я незнаю - объясни нам пожалуйста...
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036698
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стрсудя по всему у тебя СУБД это MS SQL
наверное, нужно выполнить батч по ExecuteScalar
Код: plaintext
1.
INSERT INTO ... VALUES(...);
SELECT SCOPE_IDENTITY();

подробнее в MSDN
Retrieving Identity or Autonumber Values

может дашь примерчик? Чет в микисофтском прмере не разберусь, тем более что никогда не делал бачи.

Спасибо!
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036710
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrigИ я незнаю - объясни нам пожалуйста...
объясняю: как получить Value от только что присоеденёного датасет.
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036754
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторобъясняю: как получить Value от только что присоеденёного датасет.Не зацикливайся под вечер... то что хочешь ты я уже понял...

Лиман Артёмя так понимаю не знает как получить SCOPE_IDENTITY или @@IDENTITYИ я незнаю - объясни нам пожалуйста...
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036757
Angello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему бы процедуру не использовать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE Procedure ИмяПроцедуры
(
    @Name   nvarchar( 50 ),
    @RecordID int OUTPUT
)
AS
INSERT INTO ИмяТаблицы
(
    Name
)

VALUES
(
    @Name,
)
SELECT
    @RecordID = @@Identity
GO
Или такой вариант тоже не подходит по неизвестным нам соображениям? Если так поделитесь ими ...
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036769
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelloА почему бы процедуру не использовать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE Procedure ИмяПроцедуры
(
    @Name   nvarchar( 50 ),
    @RecordID int OUTPUT
)
AS
INSERT INTO ИмяТаблицы
(
    Name
)

VALUES
(
    @Name,
)
SELECT
    @RecordID = @@Identity
GO
Или такой вариант тоже не подходит по неизвестным нам соображениям? Если так поделитесь ими ...

подходит. Как мне его считать в VB.NET application?
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036793
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrigИ я незнаю - объясни нам пожалуйста...
объясняю на примере
Код: plaintext
1.
2.
3.
4.
5.
Dim cmd As New SqlClient.SqlCommand("insert into Test(data) values('bla bla')", con)
        cmd.ExecuteNonQuery()
        cmd.Cancel()
        cmd.CommandText = "select SCOPE_IDENTITY()"
        Dim id$ = cmd.ExecuteScalar
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036802
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angello
Код: plaintext
1.
    @RecordID = @@Identity

это конечно тоже вариант, только я бы все же советовал использовать вместо @@Identity SCOPE_IDENTITY() так как при инсерте может сработать триггер, который в свою очередь также проведет вставку, соответсвенно @@Identity вернет не наш Identity, а чужой. Эта один из подводных камней при программировании на TSql, так как на момент написания хранимки такого триггреа может и не быть и всё будет работать хорошо. И хорошо еще если мы одни программируем базу, а если коллективная разработка - я добавлю триггер, ты ничего о не знать не будешь, но логика твоей хранимки испортится...
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036827
Angello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avoda AngelloА почему бы процедуру не использовать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE Procedure ИмяПроцедуры
(
    @Name   nvarchar( 50 ),
    @RecordID int OUTPUT
)
AS
INSERT INTO ИмяТаблицы
(
    Name
)

VALUES
(
    @Name,
)
SELECT
    @RecordID = @@Identity
GO
Или такой вариант тоже не подходит по неизвестным нам соображениям? Если так поделитесь ими ...

подходит. Как мне его считать в VB.NET application?
Добавляете функцию, которая принимает необходимые параметры и возвращает ID в случае успешного добавления записи
Код: plaintext
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.
Public Function ИмяФункции(ByVal Name As String) As Integer
            Dim myConnection As New SqlConnection(connectionString)
            Dim myCommand As New SqlCommand("ИмяПроцедуры", myConnection)

            myCommand.CommandType = CommandType.StoredProcedure

            ' Добавляем параметр в процедуру
            Dim parameterFullName As New SqlParameter("@Name", SqlDbType.NVarChar,  50 )
            parameterFullName.Value = Name
            myCommand.Parameters.Add(parameterFullName)

            Dim RecordID As New SqlParameter("@RecorID", SqlDbType.Int)
            RecordID.Direction = ParameterDirection.Output
            myCommand.Parameters.Add(RecordID)

            Try
                myConnection.Open()
                myCommand.ExecuteNonQuery()
            Catch err As Exception
                ' Ошибка :)
                Return - 1 
            Finally
                If myConnection.State = ConnectionState.Open Then
                    myConnection.Close()
                End If
            End Try
            Return CInt(RecordID.Value)
        End Function
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036851
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лиман Артём Angello
Код: plaintext
1.
    @RecordID = @@Identity

это конечно тоже вариант, только я бы все же советовал использовать вместо @@Identity SCOPE_IDENTITY() так как при инсерте может сработать триггер, который в свою очередь также проведет вставку, соответсвенно @@Identity вернет не наш Identity, а чужой. Эта один из подводных камней при программировании на TSql, так как на момент написания хранимки такого триггреа может и не быть и всё будет работать хорошо. И хорошо еще если мы одни программируем базу, а если коллективная разработка - я добавлю триггер, ты ничего о не знать не будешь, но логика твоей хранимки испортится...

Большое спасибо!
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036854
avoda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angello avoda AngelloА почему бы процедуру не использовать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE Procedure ИмяПроцедуры
(
    @Name   nvarchar( 50 ),
    @RecordID int OUTPUT
)
AS
INSERT INTO ИмяТаблицы
(
    Name
)

VALUES
(
    @Name,
)
SELECT
    @RecordID = @@Identity
GO
Или такой вариант тоже не подходит по неизвестным нам соображениям? Если так поделитесь ими ...

подходит. Как мне его считать в VB.NET application?
Добавляете функцию, которая принимает необходимые параметры и возвращает ID в случае успешного добавления записи
Код: plaintext
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.
Public Function ИмяФункции(ByVal Name As String) As Integer
            Dim myConnection As New SqlConnection(connectionString)
            Dim myCommand As New SqlCommand("ИмяПроцедуры", myConnection)

            myCommand.CommandType = CommandType.StoredProcedure

            ' Добавляем параметр в процедуру
            Dim parameterFullName As New SqlParameter("@Name", SqlDbType.NVarChar,  50 )
            parameterFullName.Value = Name
            myCommand.Parameters.Add(parameterFullName)

            Dim RecordID As New SqlParameter("@RecorID", SqlDbType.Int)
            RecordID.Direction = ParameterDirection.Output
            myCommand.Parameters.Add(RecordID)

            Try
                myConnection.Open()
                myCommand.ExecuteNonQuery()
            Catch err As Exception
                ' Ошибка :)
                Return - 1 
            Finally
                If myConnection.State = ConnectionState.Open Then
                    myConnection.Close()
                End If
            End Try
            Return CInt(RecordID.Value)
        End Function


Большое спасибо!!!!!!!!!!!!!!!!!!!!!!!!! Супер
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33036978
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<off>
из-за чего весь сыр-бор разгорелся ???

извините за плохой стиль, но это всего 3 строки без ХП
Код: plaintext
1.
2.
SqlCommand cmd=new SqlCommand("INSERT INTO T4 (nm) VALUES(@Name); SELECT SCOPE_IDENTITY();", cn);
cmd.Parameters.Add("@Name", "привет");
decimal res=(decimal)cmd.ExecuteScalar();
</off>
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #33037152
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, пришёл Кузя и, как всегда, всё расставил на свои места...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
как получить Auto Incerment Value?
    #34879572
cunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кузя<off>
из-за чего весь сыр-бор разгорелся ???

извините за плохой стиль, но это всего 3 строки без ХП
Код: plaintext
1.
2.
SqlCommand cmd=new SqlCommand("INSERT INTO T4 (nm) VALUES(@Name); SELECT SCOPE_IDENTITY();", cn);
cmd.Parameters.Add("@Name", "привет");
decimal res=(decimal)cmd.ExecuteScalar();
</off>

А с Oracle-ом так вероятно?
INSERT INTO T4 (nm) VALUES(?) returning ID;
cmd.Parameters.Add("привет");
А с MsAccess?
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #34880206
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор MsAccess?
там вроде тоже можно
Код: plaintext
@@identity
получить
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #34880275
cunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, там такого понятия нету.
Есть последовательности, из которых берутся значения триггерами Before Insert
Но результат тот же)
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #34880333
_logic_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cuntНе, там такого понятия нету.
Есть последовательности, из которых берутся значения триггерами Before Insert
Но результат тот же)
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q232144
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #34880404
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cuntНе, там такого понятия нету.
Есть последовательности, из которых берутся значения триггерами Before Insert
Но результат тот же)
в аксессе? триггерами?!!
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #34907236
cunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не не.
Чего все испугались. я имел ввиду Oracle.
Если будет интерестно, способ нашел:
(Единственный - надежный для Oracle)

Надо
начать транзакцию
вставить строку
извлечть max(id) from mytable
прокоммитеть транзакцию

может быть тормозно будет (для кого-то) но в некоторых случаях лучше уж так, чем совсем никак.
...
Рейтинг: 0 / 0
как получить Auto Incerment Value?
    #34907289
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cuntДа не не.
Чего все испугались. я имел ввиду Oracle.
Если будет интерестно, способ нашел:
(Единственный - надежный для Oracle)

Надо
начать транзакцию
вставить строку
извлечть max(id) from mytable
прокоммитеть транзакцию

может быть тормозно будет (для кого-то) но в некоторых случаях лучше уж так, чем совсем никак.
че-то ваш способ не алё.
я с ораклом не работал, но вроде читал/слышал, что аналог идентити там можно получить перед вставкой, а не после, как в скуль-сервере. ораклисты, так ли?
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / как получить Auto Incerment Value?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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