zutt Ответов: 3

Транзакции MySQL в C#


Привет,

Я использую вашу библиотеку DLL для использования databaseMySQL в моем проекте C#.
Обновление: Я основываю это на следующей статье
Подключение C# к MySQL[^]

Я пытаюсь выполнить транзакцию, но она никогда не откатывает мой запрос. Вот вам пример:
using (MySqlConnection db = new MySqlConnection(connectionString))
           {
               MySqlTransaction transaction;

               db.Open();
               transaction = db.BeginTransaction();

               new MySqlCommand("UPDATE t_adresse SET `nomAdresse`='forbl' WHERE idAdresse=8;",db, transaction).ExecuteNonQuery();

               transaction.Rollback();}


Что я уже пробовал:

Вот мой UnitTest для этого (имя адреса в начале-test):
using (MySqlConnection db = new MySqlConnection(connectionString))
            {
                MySqlTransaction transaction;

                db.Open();
                transaction = db.BeginTransaction();

                new MySqlCommand("UPDATE t_adresse SET `nomAdresse`='forbl' WHERE idAdresse=8;",db, transaction).ExecuteNonQuery();
               
                transaction.Rollback();

                MySqlCommand cmdUpdateAdresse = new MySqlCommand("SELECT nomAdresse FROM t_adresse WHERE idAdresse=8", db);
                MySqlDataReader data = cmdUpdateAdresse.ExecuteReader();
                while (data.Read())
                {
                    Assert.AreEqual("test", (string)data["nomAdresse"]);
                }
                db.Close();
            }
И этот тест возвращает, что ожидаемое значение ("тест") не соответствует фактическому значению ("forbl")

Richard MacCutchan

- Я использую твою библиотеку DLL."
Кому должно быть адресовано это послание?

zutt

Извините, что я поверил, что спросил автора ^^'
https://www.codeproject.com/articles/43438/connect-c-to-mysql

3 Ответов

Рейтинг:
4

zutt

Я нашел решение.

Мои таблицы использовали MyISAM, а MyISAM не реализует транзакцию. Так что теперь я использую InnoDB


Рейтинг:
2

MadMyche

Я использую вашу библиотеку DLL для использования databaseMySQL в моем проекте C#
Какую библиотеку DLL вы используете и откуда она взялась? Если вы нашли прикрепленную к статье, которая была размещена здесь, то лучше всего связаться с автором статьи с помощью Comments / Discussions виджет в нижней части статьи.

Тем не менее, глядя на ваш код, я не вижу ничего, что не является частью MySql connector Oracle, так что документация там будет в значительной степени хорошим наброском, чтобы следовать.
Класс MySqlTransaction[^]

Для вашего кода я не вижу ничего плохого в коде как таковом; вы на 100% уверены, что ваши данные отличаются до и после?
Если nomAdresse адрес уже был forbl или нет idAdresse=8 представьте, что вы не увидите изменений при запуске этого скрипта.

Я бы предложил, чтобы для тестирования вы расширили свой запрос и лучше квалифицировали предложение or WHERE. Обратите внимание в следующем блоке, что я добавил И к самому запросу, а также присвоил значение методу без запроса. Если RowsAffected равно 0 то откатывать нечего
using (MySqlConnection db = new MySqlConnection(connectionString)) {
	MySqlTransaction transaction;

	db.Open();
	transaction = db.BeginTransaction();

	string qry = "UPDATE t_adresse SET `nomAdresse`='forbl' WHERE idAdresse=8 AND `nomAdresse` <> 'forbl';"; // only change if that value isn't already set
	MySqlCommand cmd = new MySqlCommand(qry, db, transaction);

	int RowsAffected = cmd.ExecuteNonQuery(); // this will show many rows were changed

	transaction.Rollback();}


MadMyche

Я объединил это в ваш первоначальный вопрос

zutt

О прости я не видел

Рейтинг:
1

OriginalGriff

Вероятно, вы имеете в виду, что он не обновляется - потому что вы не фиксируете транзакцию в этом коде, - поэтому независимо от того, вызывает ли ваш код откат или нет, транзакция немедленно откатится, когда объект соединения выйдет из области действия.

Тщательно проверьте свою БД - я подозреваю, что вы не смотрите на "правильную" БД, когда проверяете.


zutt

Я хочу откатить обновление, но его применить изменение