2015-06-06 2 views
0

я делал коды, которые делают DELETE, UPDATE, ВСТАВКУ, ЗЕЬЕСТ в базах данных в школе. Проблема в том, что он может выполнять только один запрос одновременно. Что-то вроде этого:Как выполнять многие SQL-запросы как транзакции?

OleDbConnection con = DAL.GetConnection(); 
con.Open(); 

if (con.State == ConnectionState.Open) //si la conexion esta abierta... 
{ 
    string sql = string.Format(" INSERT INTO lol (...)"); 
    //----->I shortened this above because it's not important <----- 
    OleDbCommand cmd = new OleDbCommand(); 
    cmd.Connection = con; 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = sql; 
    int num = cmd.ExecuteNonQuery(); 
    con.Close(); 

    if (num == 0) 
    { 
     Response.Redirect("register.aspx?err=Error"); 
    } 
    else 
    { 
     Session["id"] = MyDB.GetUserId(uname); 
     Response.Redirect("home.aspx"); 
    } 
} 

После того, как мой учитель сказал мне, что есть что-то, что работает так: вы делаете все запросы SQL, или никто. Я хотел бы знать, как это сделать, было бы очень полезно.

Спасибо!

+3

К какой базе данных вы подключаетесь? Вы отметили как MySQL, так и SQL Server, но это совершенно разные системы. Также, каков ваш вопрос? На данный момент это немного неясно. Я думаю, что ваш учитель ссылается на концепцию, известную как ** транзакции **. Это позволяет запускать несколько команд атомарно, т. Е. Если кто-то не работает, все откатывается. Вы спрашиваете, как использовать транзакции? – JNYRanger

+0

Реляционные базы данных поддерживают транзакции. Вы можете переносить несколько операторов в транзакцию, либо все они выполняются, либо нет. Я думаю, что такая логика должна идти в хранимых процедурах, а не в коде приложения. –

+1

'Как только мой учитель сказал мне, что есть что-то, это работает так: вы делаете все SQL-запросы или никого ... Ваш Учитель говорит о« Транзакции ». Пойдите и прочитайте об этом. – Rahul

ответ

1

Ваш преподаватель имеет отношение к транзакциям. Большинство реляционных баз данных поддерживают транзакции, включая MySQL *. Транзакции допускают атомное поведение нескольких операций CRUD. Это означает, что если одна операция завершится неудачно, база данных откатится от любых изменений, которые были сделаны так, как если бы ни одна из операций не происходила.

Следует помнить, что они работают последовательно, не одновременно. Однако, поскольку они являются атомарными, они чувствуют себя похожими на то, что они запускают все за одну операцию.

Чтобы выполнить транзакцию с использованием класса OleDbConnection, используя C#, вы можете создать транзакцию из своего объекта соединения, считая, что она открыта. Имейте в виду, что в отличие от хранимой процедуры вам необходимо вручную совершить или отменить транзакцию.

Выполнение транзакции делает этот набор операций «постоянным» в базе данных. После фиксации его нельзя отменить.

Откат при перезагрузке базы данных до состояния, которое существовало до начала транзакции.

Ниже приведен пример создания транзакции от объекта OleDbConnection наряду с выполнением коммита и два случая, когда вы можете откатить:

using(OleDbConnection con = DAL.GetConnection()) 
{ 
    OleDbTransaction transaction = null; 
    try 
    { 
     con.Open(); 
     transaction = con.BeginTransaction() 

     string queryString1 = //SQL string 
     OleDbCommand cmd1 = new OleDbCommand(); 
     { 
      Connection = con, 
      CommandType = CommandType.Text, 
      CommandText = queryString1 
     }; 

     string queryString2 = //SQL string 
     OleDbCommand cmd2 = new OleDbCommand(); 
     { 
      Connection = con, 
      CommandType = CommandType.Text, 
      CommandText = queryString2 
     }; 

     int num1 = cmd.ExecuteNonQuery(); 
     int num2 = cmd.ExecuteNonQuery(); 

     if (num1 == 0 || num2 == 0) 
     { 
      //We didn't expect something to return 0, lets roll back 
      transaction.Rollback(); 
      //send error message 
      Response.Redirect("register.aspx?err=Error"); 
     } 
     else 
     { 
      //everything seems good, lets commit the transaction! 
      transaction.Commit(); 
      Session["id"] = MyDB.GetUserId(uname); 
      Response.Redirect("home.aspx"); 
     } 
    } 
    catch(OleDbException ex) 
    { 
     try 
     { 
      //something bad happened, lets roll everything back 
      transaction.Rollback(); 
      Response.Redirect("register.aspx?err=Error"); 
     } 
     catch 
     { 
      //we don't really care about this catch statement 
     } 
    } 
} 

Вот статья MSDN по методу OleDbConnection.BeginTransaction с родовым пример, аналогичный тому, что я написал выше.

EDIT:
* Как @ Заводной-Muse отметил в комментарии способность MySQL для поддержки транзакций зависит от основного двигателя используется. Существует много MySQL-движков, но двумя основными являются InnoDB и MyISAM. InnoDB CAN поддержка сделка, но MyISAM делает NOT.

+1

Ну, MySQL поддерживает только транзакции с некоторыми типами движка хранилища. [MyISAM] (http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html), например, нет, и это раньше использовалось по умолчанию (до версии 5.5. 5) - хотя похоже, что он предупредил бы вас в случае отката ... –

+0

@ Clockwork-Muse Хорошая точка. Я добавлю это предупреждение в свой ответ – JNYRanger

Смежные вопросы