Выбор места и начало оформления билета.
private void buMake_Click(object sender, System.EventArgs e)
{
 // соединение с БД Pubs
 SqlConnection conn = new SqlConnection();
 conn.ConnectionString="server=(local);integrated security=SSPI;database=Pubs";
 conn.Open();
 // начало транзакции (режим изоляции по умолчанию READ COMMITTED)
 SqlTransaction trans;
 trans=conn.BeginTransaction();
 // попытка блокирования выбранной записи
 SqlCommand comm = new SqlCommand();
 comm.Connection=conn;
 comm.Transaction=trans;
 comm.Parameters.Clear();
 // текст команды
 comm.CommandText="select SaleDate from TrainSeats(rowlock,updlock,readpast) where SaleDate is null and "+
 "TrainDate=@TrainDate and TrainNumber=@TrainNumber and Carriage=@Carriage and Seat=@Seat";
 // заполнение параметров
 comm.Parameters.Add("@TrainDate",SqlDbType.DateTime,0).Value=txtTrainDate.Text;
 comm.Parameters.Add("@TrainNumber",SqlDbType.VarChar,10).Value=txtTrainNumber.Text;
 comm.Parameters.Add("@Carriage",SqlDbType.TinyInt,0).Value=grFreeSeats[grFreeSeats.CurrentRowIndex,0].ToString();
 comm.Parameters.Add("@Seat",SqlDbType.TinyInt,0).Value=grFreeSeats[grFreeSeats.CurrentRowIndex,1].ToString();
 // выполнение команды блокирования
 SqlDataReader dr=comm.ExecuteReader();
 int i=0;
 // подсчет числа заблокированных записей
 while (dr.Read()) i+=1;
 dr.Close();
 if (i != 1) { // неудачная попытка - откат транзакции
 MessageBox.Show("Место готовится к продаже другим оператором!");
 comm.Transaction.Rollback();
 }
 else { // запись заблокирована
 // работа в экранной форме по оформлению билета к продаже
 frmSeatSale frm = new frmSeatSale();
 // заполняютя public-поля экранной формы
 frm.txtTrainDate.Text=txtTrainDate.Text;
 frm.txtTrainNumber.Text=txtTrainNumber.Text;
 frm.txtCarriage.Text=grFreeSeats[grFreeSeats.CurrentRowIndex,0].ToString();
 frm.txtSeat.Text=grFreeSeats[grFreeSeats.CurrentRowIndex,1].ToString();
 // передается контекст транзакции для отката или подтверждения
 frm.comm=comm;
 frm.ShowDialog(this);
 }
}

Назад