Есть база вида:
Id(i), naim(c100), tmp(i)
Основной ключ в базе по id.
При добавлении новой записи идет инкрементация id через deault по хранимой (в базе ) процедуре. Что бы не вдаваться в алгоритм этой процед. будем считать, что она инкрементирует id на 1.
После добавления в базу мне нужно узнать ее id. Причем naim может быть не уникальным.
Мне пришлось вводить tmp и туда вписывать случайное число.
// DA - DataAdaptor
// DT - DataTable
// Сохраняем запись + получает idthis.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, уж больно долгие они.
Здравствуйте, 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, уж больно долгие они.
Здравствуйте, 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
K>Добавь новый параметр в ХП, @ID int(твой тип) OUTPUT ... K>в самой ХП после вставки записи в таблицу узнаём значение ID(SET @ID = @@identity) ...
@@identity — СУБД SQL Server, если используешь другую нужно найти аналогичную функцию K>в C# после вставки записи вытягиваем значение OUTPUT параметра @ID
Так как ты используешь TableAdapter, то руками значение вытягивать не нужно а достаточно ностроить SqlParametr ... код +- будет выглядеть так:
Здравствуйте, 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 — буду испытывать.
Здравствуйте, Starpom, Вы писали:
S>а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать S>adapter.OnRowUpdated — буду испытывать.
а что используется в качестве СУБД?
Здравствуйте, kisel, Вы писали:
K>Здравствуйте, Starpom, Вы писали:
S>>а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать S>adapter.OnRowUpdated — буду испытывать. K>а что используется в качестве СУБД?
FoxPro 9
Здравствуйте, Starpom, Вы писали:
S>Здравствуйте, kisel, Вы писали:
K>>Здравствуйте, Starpom, Вы писали:
S>>>а вот для OLE (облегченная версия прогр.) ... не пошло. Тут подсказали попробовать S>adapter.OnRowUpdated — буду испытывать. K>>а что используется в качестве СУБД? S>FoxPro 9
Вроде как FoxPro поддерживает Хранимые процедуры ...
зачем что то менять, в ХП по прежнему можно вернуть значение нового ID ...
ID Вы генерируете по какому то алгоритму или ID генерирует FoxPro и Вы не знаете функцию аналочичную функции @@identity SQL Server-а?
Здравствуйте, 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.