Выбор места и начало оформления билета.
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);
}
}
Назад