Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > SqlCommand INSERT и INTO....


Автор: Pankon 11.7.2006, 17:41
Создаю запись с помощью SqlConnection, SqlCommand, SQL = "INSERT INTO...."
А как узнать то какой ID у записи то  smile  ? 

Автор: Дрон 11.7.2006, 17:49
Легко smile

Код

INSERT INTO ....; SELECT SCOPE_IDENTITY()

Ну и дальше вызывай ExecuteScalar() для твоего SqlCommand. 

Автор: Ignat 11.7.2006, 17:51
Дрон, а это для какой БД? 

Автор: DemoCode 11.7.2006, 17:53
Какая БД?

Можно так:
Код

SELECT MAX(ID) AS MAXID FROM YOURTABLE
 

Автор: Ignat 11.7.2006, 17:57
Цитата(DemoCode @  11.7.2006,  18:53 Найти цитируемый пост)
Можно так:

Так нельзя. Не факт, что максимальный ИД будет последним. 

Автор: Pankon 11.7.2006, 18:01
Дрон, спасибо за подсказку..

Прочитал про ExecuteScalar.

Осталось не понятным SELECT SCOPE_IDENTITY(). Это для чего?(Что это?) 

Автор: DemoCode 11.7.2006, 18:01
Цитата(Ignat @  11.7.2006,  18:57 Найти цитируемый пост)
Так нельзя. Не факт, что максимальный ИД будет последним.  

Чаще всего записи добавляются с ID равным NULL, поэтому максимальный ID будет последним.
Но если известно, что в приложении записи добавляются с ID отличным от NULL, тогда да нельзя, а если нет - то этот способо будет универсальным для любой БД. 

Автор: Дрон 11.7.2006, 18:09
Цитата(Pankon @  11.7.2006,  19:01 Найти цитируемый пост)
Осталось не понятным SELECT SCOPE_IDENTITY().

Пользуемся поиском smile
http://forum.vingrad.ru/index.php?showtopic=96271
А в двух словах именно этим запросом мы и получаем последний сгенерированный ID-шник smile
ExecuteScalar нужен только для того, чтобы иметь возможность вернуть его тебе. Обычно ведь INSERT выполняется методом ExecuteNonQuery.
Можно, конечно, ещё возвращать через output параметр и часто так и приходится делать, но в простом случае сойдёт и ExecuteScalar.

Цитата(Ignat @  11.7.2006,  18:51 Найти цитируемый пост)
Дрон, а это для какой БД?  

Поскльку вопрос про SqlCommand -- то и сервер будет MS SQL Server smile
  

Автор: Softaz 13.7.2006, 07:59
Цитата(Дрон @  11.7.2006,  18:09 Найти цитируемый пост)
Поскльку вопрос про SqlCommand -- то и сервер будет MS SQL Server 

Если применяешь MSSQL лучше в качестве ID-шника брать тип UNIQUEIDENTIFIER. Имхо удобней.
А там и хранимку написать не проблема.
Код

--...
DECLARE @guid uniqueidentifier
SET @guid = NewID()
--...
INSERT INTO VALUES (@guid, @param)
SELECT @guid
 

Автор: Дрон 13.7.2006, 08:46
Softaz, да ну?!?! Где ты такое нашёл?

Во-первых, если это будет Primary Key, то при каждом инсерте будет переколбашиваться вся таблица, т.к. новый гуид не обязательно больше предыдущего.
Во-вторых, guid занимает больше места в памяти и его сравнение сложнее, следовательно join с такой таблицей будет работать медленее.
В-третьих, зачем изобретать велосипед, если есть нормальные identity поля и нормальная функция SCOPE_IDENTITY()?
  

Автор: Softaz 13.7.2006, 14:10
Цитата(Дрон @  13.7.2006,  08:46 Найти цитируемый пост)
т.к. новый гуид не обязательно больше предыдущего.

Обходится быстро и легко.

Цитата(Дрон @  13.7.2006,  08:46 Найти цитируемый пост)
guid занимает больше места в памяти 

Индекс строится по ключевому полю, т.е. по Guid, а он длиннее. Следовательно, ДПС будет больше работать. Память здесь ни при чем.

Цитата(Дрон @  13.7.2006,  08:46 Найти цитируемый пост)
следовательно join с такой таблицей будет работать медленее.

Ага. Только заметно это будет где-то с миллиона записей. А если идет выборка из 20 таблиц с 10 млрд. строк из пары БД. Бедный int smile (загнул, конечно, но смысл ясен)

Цитата(Дрон @  13.7.2006,  08:46 Найти цитируемый пост)
зачем изобретать велосипед

Он изобретен M$, значит, оным не является. Все же уникальность в 2^64 неплохая. И в DataSet можно спокойно его записать, не боясь, что на сервере уже есть такой и возникнет исключение.
И синхронизация с репликацией проще.
 

Автор: Дрон 13.7.2006, 14:51
Цитата(Softaz @  13.7.2006,  15:10 Найти цитируемый пост)
И синхронизация с репликацией проще

С этим согласен. Ну, и естественно 32-битного int на долго тоже не хватит smile
Но использование гуида для обычных таблиц -- это, на мой взгляд, редкостное извращение.
 

Автор: Softaz 13.7.2006, 15:13
Цитата(Дрон @  13.7.2006,  14:51 Найти цитируемый пост)
Но использование гуида для обычных таблиц -- это, на мой взгляд, редкостное извращение

Да. Для хранения настроек программы типа "последние файлы" - это очень редкостное извращение smile  

Автор: Pankon 14.7.2006, 14:03
Всем спасибо. 

Автор: starostin 4.11.2011, 16:44
а как быть если субд firebird?

Автор: CYBERDREAM 5.11.2011, 12:50
Приветствую starostin, 
Судя поhttp://www.firebirdfaq.org/faq243/ если юзать тригеры для генерации ключей, то можно воспользоваться оператором returning. Вообще насколько я понимаю, немного муторно с ключами в FireBird. С этой СУБД не работал, так что надо тебе попробовать.

Так же встречал решение, что генерируют сначала ключ, и его уже пихают в таблицу и возвращают. Знатоки надеюсь поправят.
Можешь http://firebirdsql.su/doku.php?id=returningпочитать, может поможет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)