|
Получение идентификатора новой строки от базы данных SQL Server
Бывают ситуации, в которых создание идентификатора новой строки в таблице
возлагается на базу данных. С этой целью база данных SQL Server поддерживает поле
IDENTITY и серверную переменную @@IDENTITY, хранящую значение последнего созданного идентификатора. Для того чтобы воспользоваться этой функциональностью
в ADO,NET, необходимо выполнить следующие действия
// Создание объекта DataAdapter.
SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM PRODUCT", conn);
// Создание команды INSERT,
string insQry = "INSERT INTO PRODUCT(Description, Vendor, Cost, Price) VALUES ( @Description, @Vendor, @Cost, @Price) ";
insQry += "SELECT @ProductID = @@IDENTITY";
SqlCoimand insCmd = conn. CreateCoirenand () ;
insCmd.CommandText = insQry;
// Определение переменной для упрощения
// доступа к коллекции параметров.
SqlParameterCollection insParams = insCmd.Parameters;
// Определение параметров.
insParams.Add("@ProductID" , SqlDbType.Int, 0, "ProductlD") ;
insParams["@ProductlD"].Direction = PararameterDirection.Output;
insParams.Add("@Description", SqlDbType.NVarChar, 255, "Description");
insParams.Add("@Vendor", SqlDbType.NVarChar, 255, "Vendor");
insParams-Add("@Cost", SqlDbType.Money, 0, "Cost");
insParams.Add("@Price", SqlDbType.Money, 0, "Price");
// Установка значения свойства InsertCommand
// объекта DataAdapter.
dataAdapter.InsertCommand = insCmd;
// Создание объекта DataSet.
DataSet dataSet = new DataSet();
DataRow delRow = custTable.Rows[1];
delRow.Delete();
// Создание объектов ConmandBuilder для генерирования
// команд вставки, изменения и удаления данных.
SqlCommandBuilder custBldr = new SqlCommandBuilder(custDA);
SqlCommandBuilder invBldr = new SqlCommandBuilder(invDA);
// Обновление базы данных.
SqlTransaction tx = null;
try
(
// Для того чтобы начать транзакцию необходимо, открыть соединение.
conn.Open {) /'
// Создали* транзакции для команды SELECT.
// Объект CommandBuilder распространит
// транаакцию на остальное команд».
tx = conn.BeginTransaction(IeolationLevel.Serializablw);
invDA, SelectConunand. Traneaction = tx;
cuatDA.SeleatCoromand,Transaction = tx;
// Удаление информации из базы данных.
// Используем обратный порядок - сначала
// обновляется дочерняя таблица.
invDA.Update(invTable.GetChanges(DataRowState.Deleted));
custDA.Update(custTable.GetChanges(DataRowState.Deleted));
// Добавление и изменение информации в базе данных.
// Используем прямой порядок - сначала
// обновляется родительская таблица.
custDA.Update(oustTable,GetChanges(DataRowState.Added, DataRowState.Modified));
invDA.Update{invTable.GetChanges{DataRowState.Added, DataRowState,Modified)};
// На данном этапе транзакция можно зафиксировать,
tx.Commit() ;
}
catch (SqlException ex)
{
Console.WriteLine("Sql Error: {0}", ex.Message);
// Отменить транзакцию при возникновении ошибки,
if (tx != null) tx.Rollback();
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close ();
}
}
|
Предыдущая стр.   
Оглавление   
Следующая стр.
Средняя оценка:     (0 - 0 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
|
|