Поиск
 

ADO.NET

Работа с базами данных в приложениях .NET

Cи Шарп это просто Simple C#
Логин Пароль Вход Регистрация
Главная
Изучаем C#
Web-приложения
Win-приложения
Web-сервисы
ADO.NET
FrameWork
Алгоритмы
Исходники
Классы
Среда разработки
Статьи
Форум
FAQ
О Проекте
Обратная связь
Отблагодарить
Rambler's Top100

Обработка нарушений параллелизма

Неприятности иногда случаются. К примеру, вы хотите изменить строку в таблице,
но оказывается, что после извлечения из базы данных она уже была изменена. В таком случае необходимо либо обработать нарушение параллелизма, либо отменить изменения объекта DataSet. Рассмотрим, как это реализовать на практике.
В процессе обновления базы данных объект DataAdapter подсчитывает количество
добавленных, измененных или удаленных строк. Если результат выполнения хотя бы
одной из указанных операций равен нулю (обычно этого не происходит из-за того,
что не нашлось строки, соответствующей предложению WHERE, которая была изменена после своего извлечения из базы данных), объект DataAdapter генерирует исключение DBConcurrencyException. Как правило, это свидетельствует о нарушении параллелизма.



// Определение переменной для упрощения доступа к таблице.
DataTable custTable = dataSet.Tables["Customers"];
// Внесение изменений в информацию о клиенте.
DataRow oldRow = custTable.Rows[0];
oldRow["MiddleName"] = "Andrew";
// Имитация внесения изменений в базу данных.
SqlCommand changeCmd = conn.CreateCommand();
changeCmd.CommandText = "UPDATE Customer SET Zip = '{O}1" +
" WHERE CustomerlD = '{!}'";
// Определение параметров (идентификационного номера клиента и
// ZIF-кода) команды changeCmd.
changeCmd.CommandText =
string.Format(changeCmd.CommandText,
Convert.Tolnt32(oldRow["Zip"]) + 1,
oldRow["CustomerID"]);
// Внесение изменений в базу данных.
conn.Open();
changeCmd.ExecuteNonQuery();
conn.Close();

updParams . Add ( "@ Zip" , SqlDbType . NVarChar , 10 , "Zip" } ;
updParams ["@Zip"] . IsNullable = true;
updParams. Add ("@HomePhone", SqlDbType. NVarChar, 14,
"HomePhone") ;
updParams ["@HoinePhone"] . IsNullable = true;
updParams. Add ("^Business Phone", SqlDbType. NVar Char, 14,
"BusinessPhone") ;
updParams ["@BusinessPhone"] . IsNullable = true;
updParams . Add ( "@DOB" , SqlDbType . DateTime , 0 , "DOB" ) ;
updParams ["@DOB"] .IsNullable = true;
updParams. Add ("@ Discount", SqlDbType. Float, 8, "Discount") ;
updParams ["(^Discount"] . IsNullable = true;
updParams .Add ("@Stamp", SqlDbType. Times tamp, 0, "Stamp") ;
updParams [ "@Stamp"] . SourceVersion = DataRowVersion. Original;
updParams { "@ Stamp"] . Direction ~
ParameterDirection . InputOutput ;
// Установка значения свойства UpdateCommand
// объекта DataAdapter.
dataAdapter. UpdateCommand = updCmd;
// Создание объекта DataSet
DataSet dataSet = new DataSet ();
// Использование объекта DataAdapter
// для заполнения объекта DataSet.
dataAdapter. Fill (dataSet, "Customers") ;
// Определение переменной для упрощения доступа к таблице.
DataTable custTable = dataSet . Tables { "Customers" ];
// Добавление сведений о новом клиенте.
DataRow newRow = custTable .NewRow ();
newRow.BeginEdit 0 ;
newRow ["CustomerlD"] = Guid.NewGuid ( ) ;
newRow [ "Las tName"] = "Remlinger" ;
newRow ["FirstName"] = "Mike";
newRow ["Address" ] = "10 Aaron Way-";
newRow ["City"] = "Atlanta";
newRow ["State"] ~ "GA";
newRow["Zip"] = "30307";
newRow ["HomePhone"] = "(404) 543-9765";
newRow. EndEdit () ;
custTable. Rows .Add (newRow) ;
// Удаление клиента.
DataRow delRow = custTable .Rows [ 1] ;
delRow. Delete ( ) ;
// Изменение информации о клиенте.
DataRow oldRow = custTable. Rows [0] ;
oldRow["MiddleName"] = "Andrew";
try
// Обновление базы данных,
dataAdapter. Update (custTable) ;
Console. Write ("Successfully Updated the Database");
// Определение параметров.
delParams.Add("@CustomerID", SqlDbType.Uniqueldentifier, 0,
"CustomerlD");
delParams.Add{"@Stamp", SqlDbType.Timestamp, 0, "Stamp");
delPararas["@Stamp"].SourceVersion = DataRowVersion,Original.
// Установка значения свойства DeleteCommand
// объекта DataAdapter.
dataAdapter.DeleteCommand - delCmd;

// Создание команды UPDATE.
string updQry =
updQry - @"UPDATE CUSTOMER SET
CustomerlD = SCustomerlD,
FirstName = SFirstName,
LastName = @LastName,
MiddleName = @MiddleName,
Address = @Address,
Apartment = SApartment,
City = ecity.
State - @State, Zip = @Zip,
HomePhone = SHomePhone,
BusinessPhone = OBusinessPhone,
DOB = @DOB,
Discount - @Discount
WHERE Stamp = @Stamp AND CustomerlD =
@CustomerID
SELECT @Stamp = Stamp FROM CUSTOMER
WHERE CustomerlD = @CustomarID";
SqlCommand updCmd = conn.CreateCommand();
updCmd.CommandText = updQry;
// Определение переменной для упрощения
// доступа к коллекции параметров.
SqlParameterCollection updparams = updCmd.Parameters;
// Определение параметров.
updParams.Add("@CustomerID", SqlDbType.Uniqueldentifier, 0,
"CustomerlD");
updParams.Add("SFirstName", SqlDbType.NVarChar, 50,
"FirstName");
updParams.Add{"@MiddleName", SqlDbType.NVarChar, 50,
"MiddleName");
updParams["@MiddleName"].IsNullable = true;
updParams.Add("@LastName", SqlDbType.NVarChar, 50,
"LastName");
updParams["@LastName"].IsNullable = true;
updParams.Add("@Address", SqlDbType.NVarChar, 50,
"Address");
updParams["@Addres3"].IsNullable = true;
updParams.Add{"^Apartment", SqlDbType.NVarChar, 50,
"Apartment");
updParams["@Apartment"].IsNullable = true;
updParams.Add("@City", SqlDbType.NVarChar, 50, "City");
updParams["@City"].IsNullable = true;
updParams.Add("@State", SqlDbType.NChar, 2, "State");
updParams["@State"].IsNullable = true;
SqlCommand insCmd = conn.CreateCommand();
insCmd.CommandText = insQry;
// Создание переменной для упрощения
// доступа к коллекции параметров.
SqlParameterCollection insParams = insCmd.Parameters;
// Определение параметров.
insParams.Add("@CustomerID", SqlDbType.UniqueIdentifier, 0,
"CustomerlD");
insParams.Add("@FirstName", SqlDbType.NVarChar, 50,
"FirstName");
insParams,Add("@MiddleName", SqlDbType.NVarChar, 50,
"MiddleName");
insParams["@MiddleName"].IsNullable = true;
insParams.Add("@LastName", SqlDbType.NVarChar, 50,
"LastName");
insParams["SLastName"].IsNullable = true;
insParams.Add("@Address", SqlDbType.NVarChar, 50,
"Address");
insParams["@Address"].IsNullable = true;
insParams. Add ("@Apartmerit", SqlDbType.NVarChar, 50,
"Apartment");
insParams["@Apartment"].IsNullable = true;
insParams.Add("@City", SqlDbType.NVarChar, 50, "City");
insParams["@City"].IsNullable = true;
insParams.Add("@State", SqlDbType.NChar, 2, "State");
insParams["SState"].IsNullable = true;
insParams.Add("@zip", SqlDbType.NVarChar, 10, "Sip");
insParams["@Zip"].IsNullable = true;
insParams.Add("@HomePhone", SqlDbType.NVarChar, 14,
"HomePhone");
insParams["SHomePhone"].IsNullable = true;
insParains.Add( "gBusinessPhone", SqlDbType.NVarChar, 14,
"BusinessPhone");
insParams["SBusinessPhone"].IsNullable = true;
insParams.Add("@DOB", SqlDbType.DateTime, 0, "DOB");
insParams{"@DOB"].IsNullable = true;
insParams.Add("@Discount", SqlDbType.Float, 8, "Discount");
insParams["©Discount"].IsNullable = true;
// Установка значения свойства InsertCommand
// объекта DataAdapter.
dataAdapter.InsertCommand = insCmd;
// Создание команды DELETE.
string delQry
delQry = @"DELETE FROM CUSTOMER
WHERE CustomerlD = @CustomerID AND
Stamp = @Stamp";
SqlCommand delCmd = conn.CreateCommandO;
delCmd.CommandText = delQry;
// Определение переменной для упрощения
//•доступа к коллекции параметров.
SqlParameterCollection delPararns = delCmd. Parameters;
updParams["^Apartment"].IsNullable = true;
updParams.Add("@city", SqlDbType.NVarChar, 50, "City");
updParams["@City"].IsNullable - true;
updParams.Add("estate", SqlDbType.NChar, 2, "State"};
updParams["QState"].IsNullable = true;
updParams.Add("@Zip", SqlDbType.NVarChar, 10, "Zip");
updParams["8Zip"].IsNullable = true;
updParams.Add("@HomePhone", SqlDbType.NVarChar, 14,
"HomePhone");
updParams["RHomePhone"].IsNullable = true;
updParams.Add("^BusinessPhone", SqlDbType.NVarChar, 14,
"BusinessPhone"};
updParams["^BusinessPhone"].IsNullablu = true;
updParams. Add ("@DOB", SqlDbType . DateT;.me, 0, "DOB") ;
updParams["@DOB"].IsNullable = true;
updParams.Add("@Discount", SqlDbType.Float, 8, "Discount");
updParams["@Discount"].IsNullable = true;
updParams.Add("@Stamp", SqlDbType.Timestamp, 0, "Stamp"};
updParams["@Stamp"].SourceVersion = DataRowVersion.Original;
updParams["@Stamp"].Direction =
PararaeterDirection.InputOutput;
// Установка значения свойства UpdateCommand
// объекта DataAdapter.
dataAdapter.UpdateCommand = updCmd;



В свойствах параметра sstamp указано не только то, что необходимо использовать
первоначальную версию строки, но и что этот параметр должен быть входным-
выходным (ParameterDirection. InputOutput). Таким образом, параметр @Stamp
будет возвратен базой данных и его значение будет равно текущему значению столбца
stamp. Необходимость иметь новое значение поля stamp обусловлена требованием
иметь самую "свежую" метку времени создания/изменения строки при каждом вызове
метода DataAdapter.Update {} с целью обеспечения оптимистического параллелизма.

Предыдущая стр.    Оглавление    Следующая стр.
Средняя оценка: (2 - 1 голосов)
Для оценки необходимо зарегистрироваться


Только зарегистрировавшиеся пользователи могут оставлять комментарии