Получение значения индекса. ADO.NET
От: Starpom Россия  
Дата: 07.06.07 09:32
Оценка:
Есть база вида:
Id(i), naim(c100), tmp(i)
Основной ключ в базе по id.
При добавлении новой записи идет инкрементация id через deault по хранимой (в базе ) процедуре. Что бы не вдаваться в алгоритм этой процед. будем считать, что она инкрементирует id на 1.
После добавления в базу мне нужно узнать ее id. Причем naim может быть не уникальным.

Мне пришлось вводить tmp и туда вписывать случайное число.
// DA - DataAdaptor
// DT - DataTable
// Сохраняем запись + получает id
this.m_DA_Cargo.Update(this.m_DTcargo);

// Т.к. в базу id автоматом не приходит, приходится перезагружать данные.
this.m_DTcargo.Clear();
this.m_DA_Cargo.Fill(this.m_DTcargo);

// Получаем id
foundRows = this.m_DTcargo.Select("tmp = 777"); //случайное число
id = (int)foundRows[0]["ID"];

Может у когото есть другой способ это реализовать. И хотоелось бы отказаться от Clear и Fill, уж больно долгие они.
ФЛАГ!
Re: Получение значения индекса. ADO.NET
От: Green_A  
Дата: 07.06.07 10:04
Оценка: -1
Здравствуйте, Starpom, Вы писали:

S>Есть база вида:

S>Id(i), naim(c100), tmp(i)
S>Основной ключ в базе по id.
S>При добавлении новой записи идет инкрементация id через deault по хранимой (в базе ) процедуре. Что бы не вдаваться в алгоритм этой процед. будем считать, что она инкрементирует id на 1.
S>После добавления в базу мне нужно узнать ее id. Причем naim может быть не уникальным.

S>Мне пришлось вводить tmp и туда вписывать случайное число.

S>
S>// DA - DataAdaptor
S>// DT - DataTable
S>// Сохраняем запись + получает id
S>this.m_DA_Cargo.Update(this.m_DTcargo);

S>// Т.к. в базу id автоматом не приходит, приходится перезагружать данные.
S>this.m_DTcargo.Clear();
S>this.m_DA_Cargo.Fill(this.m_DTcargo);

S>// Получаем id
S>foundRows = this.m_DTcargo.Select("tmp = 777"); //случайное число
S>id = (int)foundRows[0]["ID"];
S>

S>Может у когото есть другой способ это реализовать. И хотоелось бы отказаться от Clear и Fill, уж больно долгие они.

А чем тебе select max(Id) не угодил?
Re: Получение значения индекса. ADO.NET
От: kisel Украина  
Дата: 07.06.07 10:05
Оценка:
Здравствуйте, Starpom, Вы писали:

S>Есть база вида:

S>Id(i), naim(c100), tmp(i)
S>Основной ключ в базе по id.
S>При добавлении новой записи идет инкрементация id через deault по хранимой (в базе ) процедуре. Что бы не вдаваться в алгоритм этой процед. будем считать, что она инкрементирует id на 1.
S>После добавления в базу мне нужно узнать ее id. Причем naim может быть не уникальным.

Добавь новый параметр в ХП, @ID int(твой тип) OUTPUT ...
в самой ХП после вставки записи в таблицу узнаём значение ID(SET @ID = @@identity) ...
в C# после вставки записи вытягиваем значение OUTPUT параметра @ID
Re[2]: Получение значения индекса. ADO.NET
От: kisel Украина  
Дата: 07.06.07 10:17
Оценка:
K>Добавь новый параметр в ХП, @ID int(твой тип) OUTPUT ...
K>в самой ХП после вставки записи в таблицу узнаём значение ID(SET @ID = @@identity) ...
@@identity — СУБД SQL Server, если используешь другую нужно найти аналогичную функцию
K>в C# после вставки записи вытягиваем значение OUTPUT параметра @ID
Так как ты используешь TableAdapter, то руками значение вытягивать не нужно а достаточно ностроить SqlParametr ... код +- будет выглядеть так:

SqlParameter localParameters = new SqlParameter("@Id", DbType.Int32, 8, "id");
localParameters.Direction = ParameterDirection.Output;
adapter.InsertCommand.Parameters.Add(localParameters);
Re[2]: Получение значения индекса. ADO.NET
От: Pavel_Agurov Россия  
Дата: 07.06.07 11:39
Оценка:
G_A>А чем тебе select max(Id) не угодил?

max нельзя, т.к. если пользователей много, то у двоих-троих этот max будет одинаковый.
Re[2]: Получение значения индекса. ADO.NET
От: Starpom Россия  
Дата: 07.06.07 12:56
Оценка:
Здравствуйте, Green_A, Вы писали:


G_A>А чем тебе select max(Id) не угодил?


В ХП выдается не по возрастанию, а по опр. рассчету, поэтому max не подходит.
ФЛАГ!
Re[3]: Получение значения индекса. ADO.NET
От: Starpom Россия  
Дата: 07.06.07 12:58
Оценка:
Здравствуйте, kisel, Вы писали:

K>>Добавь новый параметр в ХП, @ID int(твой тип) OUTPUT ...

K>>в самой ХП после вставки записи в таблицу узнаём значение ID(SET @ID = @@identity) ...
K>@@identity — СУБД SQL Server, если используешь другую нужно найти аналогичную функцию
K>>в C# после вставки записи вытягиваем значение OUTPUT параметра @ID
K>Так как ты используешь TableAdapter, то руками значение вытягивать не нужно а достаточно ностроить SqlParametr ... код +- будет выглядеть так:

K>SqlParameter localParameters = new SqlParameter("@Id", DbType.Int32, 8, "id");

K>localParameters.Direction = ParameterDirection.Output;
K>adapter.InsertCommand.Parameters.Add(localParameters);

Спасибо за быстрый ответ. Для SQL подошло... а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать adapter.OnRowUpdated — буду испытывать.
ФЛАГ!
Re[4]: Получение значения индекса. ADO.NET
От: kisel Украина  
Дата: 07.06.07 13:07
Оценка:
Здравствуйте, Starpom, Вы писали:

S>а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать S>adapter.OnRowUpdated — буду испытывать.

а что используется в качестве СУБД?
Re[5]: Получение значения индекса. ADO.NET
От: Starpom Россия  
Дата: 07.06.07 13:29
Оценка:
Здравствуйте, kisel, Вы писали:

K>Здравствуйте, Starpom, Вы писали:


S>>а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать S>adapter.OnRowUpdated — буду испытывать.

K>а что используется в качестве СУБД?
FoxPro 9
ФЛАГ!
Re[6]: Получение значения индекса. ADO.NET
От: kisel Украина  
Дата: 07.06.07 13:55
Оценка:
Здравствуйте, Starpom, Вы писали:

S>Здравствуйте, kisel, Вы писали:


K>>Здравствуйте, Starpom, Вы писали:


S>>>а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать S>adapter.OnRowUpdated — буду испытывать.

K>>а что используется в качестве СУБД?
S>FoxPro 9
Вроде как FoxPro поддерживает Хранимые процедуры ...
зачем что то менять, в ХП по прежнему можно вернуть значение нового ID ...
ID Вы генерируете по какому то алгоритму или ID генерирует FoxPro и Вы не знаете функцию аналочичную функции @@identity SQL Server-а?
Re[7]: Получение значения индекса. ADO.NET
От: Starpom Россия  
Дата: 08.06.07 14:39
Оценка:
Здравствуйте, kisel, Вы писали:

K>Здравствуйте, Starpom, Вы писали:


S>>Здравствуйте, kisel, Вы писали:


K>>>Здравствуйте, Starpom, Вы писали:


S>>>>а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать S>adapter.OnRowUpdated — буду испытывать.

K>>>а что используется в качестве СУБД?
S>>FoxPro 9
K>Вроде как FoxPro поддерживает Хранимые процедуры ...
K>зачем что то менять, в ХП по прежнему можно вернуть значение нового ID ...
K>ID Вы генерируете по какому то алгоритму или ID генерирует FoxPro и Вы не знаете функцию аналочичную функции @@identity SQL Server-а?

Да потдерживает, но есть ограничения и я действительно не знаю функцию @@identity (помоему её просто нет), но первичное решение такое:
        this.m_DA_Cargo.RowUpdating += new OleDbRowUpdatedEventHandler(OnRowUpdating);

вот и обработчик.
        protected void OnRowUpdating( object sender, OleDbRowUpdatingEventArgs args)
        {
            int newId = 0;
            
            if(args.StatementType == StatementType.Insert )
            {
                newId = common_proc.cp_GetCurID(m_con, "CARGO");  // Статик функция вызова ХП для получения id
                args.Row["ID"] = newId;
            }
        }

Это помогло избавиться от clear и fill и потери установки курсора в BindingSource.
ФЛАГ!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.