Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать ID при вставке в таблицу БД, SQL Server 2000 
:(
    Опции темы
MasterOfCode
Дата 13.8.2008, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Как при вставке в таблицу БД узнать сгенерированный ID поля?
Юзаю SQLCommand.


--------------------
user posted image
PM ICQ   Вверх
1stain
Дата 13.8.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



Код

    string connectionString = @"Server=(local)\SQLEXPRESS; Database=Northwind; Trusted_Connection=yes";
    Int32 id = -1;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        string sqlCommandText = @"INSERT INTO Categories (CategoryName, Description) Values(@CategoryNameParam, @DescriptionParam);
        SET @IdParam = CAST(SCOPE_IDENTITY() as INT);";
        SqlCommand command = new SqlCommand(sqlCommandText, connection);

        command.Parameters.AddWithValue("@CategoryNameParam", "Test category");
        command.Parameters.AddWithValue("@DescriptionParam", "Test category description");
        SqlParameter idParameter = command.Parameters.Add("@IdParam", System.Data.SqlDbType.Int);
        idParameter.Direction = System.Data.ParameterDirection.Output;

        try
        {
            if (connection.State != System.Data.ConnectionState.Open)
            {
                connection.Open();
            }
            command.ExecuteNonQuery();
            id = (Int32)idParameter.Value;
            Console.WriteLine("New category created successfully. Id = {0}", id);
        }
        catch
        {
            throw;
        }
    }



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
MasterOfCode
Дата 13.8.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Спасибо!


--------------------
user posted image
PM ICQ   Вверх
vretsky
Дата 14.8.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



да только SCOPE_IDENTITY(), @@IDENTITY,IDENT_CURRENT()
не возвращают uniqueidentifier, очень жаль...

PM MAIL   Вверх
1stain
Дата 14.8.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



vretsky, что мешает задать значение Id для uniqueidentifier прямо к коде, например в конструкторе класса и вставлять его в БД?
но если есть стремление к мазохизму, можно сделать так:
Код

string connectionString = @"Server=(local)\SQLEXPRESS; Database=Northwind; Trusted_Connection=yes";
            Guid id = Guid.Empty;
            using (SqlConnection connection = new SqlConnection(connectionString))
            {

                string sqlCommandText = @"IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Table_1]') AND type in (N'U'))
                                            DROP TABLE [dbo].[Table_1]

                                        CREATE TABLE [dbo].[Table_1](
                                        [ID] [uniqueidentifier] PRIMARY KEY,
                                        [NAME] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL);

                                        SET @IdParam = NEWID();
                                        INSERT INTO [Table_1] (
                                            [ID],
                                            [NAME]
                                        ) VALUES ( 
                                            @IdParam,
                                            @Name) ";
                SqlCommand command = new SqlCommand(sqlCommandText, connection);

                command.Parameters.AddWithValue("@Name", "Test name");
                SqlParameter idParameter = command.Parameters.Add("@IdParam", System.Data.SqlDbType.UniqueIdentifier);
                idParameter.Direction = System.Data.ParameterDirection.Output;

                try
                {
                    if (connection.State != System.Data.ConnectionState.Open)
                    {
                        connection.Open();
                    }
                    command.ExecuteNonQuery();
                    id = (Guid)idParameter.Value;
                    Console.WriteLine("New category created successfully. Id = {0}", id);
                }
                catch
                {
                    throw;
                }
            }



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Idsa
Дата 14.8.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



1stain, думаю, если уж извращаться подобным образом, то нужно использовать не NewId, а NewSequantialId() (доступен с Sql Server 2005). Тогда индексы на базе Guid'ов будут практически равносильны индексам на базе int'ов.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
vretsky
Дата 14.8.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



можно брать еще например из inserted

Добавлено через 59 секунд
 smile 
PM MAIL   Вверх
MasterOfCode
Дата 15.8.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Цитата(1stain @ 13.8.2008,  11:01)
Код

    string connectionString = @"Server=(local)\SQLEXPRESS; Database=Northwind; Trusted_Connection=yes";
    Int32 id = -1;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        string sqlCommandText = @"INSERT INTO Categories (CategoryName, Description) Values(@CategoryNameParam, @DescriptionParam);
        SET @IdParam = CAST(SCOPE_IDENTITY() as INT);";
        SqlCommand command = new SqlCommand(sqlCommandText, connection);

        command.Parameters.AddWithValue("@CategoryNameParam", "Test category");
        command.Parameters.AddWithValue("@DescriptionParam", "Test category description");
        SqlParameter idParameter = command.Parameters.Add("@IdParam", System.Data.SqlDbType.Int);
        idParameter.Direction = System.Data.ParameterDirection.Output;

        try
        {
            if (connection.State != System.Data.ConnectionState.Open)
            {
                connection.Open();
            }
            command.ExecuteNonQuery();
            id = (Int32)idParameter.Value;
            Console.WriteLine("New category created successfully. Id = {0}", id);
        }
        catch
        {
            throw;
        }
    }

не сработал че то. Выдал ошибку:
The variable name '@IdParam' has already been declared. Variable names must be unique within a query batch or stored procedure.
че то я не чего не понимаю... Где я ее объявлял, не пойму...

Добавлено через 1 минуту и 50 секунд
Сорри....  smile 
не брать во внимание предидущее сообщение.


--------------------
user posted image
PM ICQ   Вверх
jorikdima
Дата 10.1.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Назрел вопрос по этой теме.
И все же... наверное многие используют autoincrement поля для идентификаторов. И вот если представить ситуацию, что в отсоединенном DataSet в какой то из таблиц добавилось несколько строк данных, или даже одна. Я вызываю метод Update адаптера (использую типизированные адаптеры и DataSet сгенеренные студией.. но думаю непринципиально), который в свою очередь вызывает команды INSERT СУБД. INSERT благополучно проходит, сколько то строк обновляется, но в отсоединенном DataSet никаких изменений поля автоинкремента не происходит. По идее только СУБД знает какое оно для каждой из строк. 
И как в таком случае мне обновить поля автоинкремента для отсоединенной сущности (DataSet или DataTable)? Вычитать только те строки которые я вставил??? Но как я вычитаю именно их? Уникального идентификатора то я их не знаю. Вычитать все из БД? Но это бред ибо ради обновления 2-3 строк вычитывать 1000 не хочется. Как быть?
PM MAIL   Вверх
jorikdima
Дата 12.1.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Что-то тут вымер форум...
PM MAIL   Вверх
1stain
Дата 12.1.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



jorikdima, как ни прискорбно, но придется поработать руками:
создаешь хранимую процедуру с OUTPUT параметром ID как описано выше, ставишь ее для InsertCommand в TableAdapter, руками прописываешь параметры и т.д. вобщем смотри аттачмент


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  WindowsFormsApplication1.zip 193,16 Kb


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
jorikdima
Дата 13.1.2009, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 18.1.2008
Где: Там, где Зенит

Репутация: нет
Всего: нет



Цитата(1stain @ 12.1.2009,  21:45)
jorikdima, как ни прискорбно, но придется поработать руками:
создаешь хранимую процедуру с OUTPUT параметром ID как описано выше, ставишь ее для InsertCommand в TableAdapter, руками прописываешь параметры и т.д. вобщем смотри аттачмент

Спасибо за ответ! Но хранимая процедура не катит, у меня MSSQL Compact Edition а там их нету :(
ОК ну тогда буду обновлять базу каждый раз smile она у меня не большая.
PM MAIL   Вверх
1stain
Дата 13.1.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



Цитата(jorikdima @  13.1.2009,  09:51 Найти цитируемый пост)
хранимая процедура не катит


Меняешь тип InsertCommand у TableAdapter'a на Text, в конструктор формы пишешь
Код

string sqlString = @"INSERT INTO [Categories] (
                                    [CategoryName],
                                    [Description],
                                    [Picture]
                                ) VALUES ( 
                                    @CategoryName,
                                    @Description,
                                    @Picture );
                                 
                                SELECT @CategoryID = CAST(SCOPE_IDENTITY() AS INT);";
            categoriesTableAdapter.Adapter.InsertCommand.CommandText = sqlString;



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.