SqlTransaction en la transacción de inicio de C # primero elimina la tabla esclava, luego elimina la tabla maestra

Introducción a los principios básicos de los asuntos.

Explicación en msdn:
https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqltransaction?view=netframework-4.8 la
transacción es ejecutar una serie de operaciones como una unidad, o tener éxito, Si falla, regrese al estado original. Mientras un participante no pueda hacer esta garantía, la transacción completa fallará. Todos los cambios de datos dentro del alcance de la transacción se revertirán a un punto de ajuste específico. La transacción vincula estrechamente múltiples operaciones, de modo que se pueda garantizar la coherencia de las dos operaciones vinculadas y la integridad de los datos.
Además, al confirmar la transacción, todos los participantes deben asegurarse de que cualquier cambio en los datos sea permanente De
Inserte la descripción de la imagen aquí
Pasos para iniciar una transacción:
(1) Usar SqlConnection para iniciar una transacción
(2) Usar SqlCommand para ejecutar la transacción, asignar el objeto de transacción y la conexión al objeto de comando
(3) Proceso de ejecución
(4) Enviar la transacción
(5) Captura de excepción, si ocurre Anormal, luego revierta la transacción desde el estado suspendido trans.Rollback ();

using (SqlConnection conn =new SqlConnection(SqlHelper.connString))
{
    //事务启动是通过conn来开启
    conn.Open();
    SqlTransaction trans = conn.BeginTransaction();//开启一个事务
    SqlCommand cmd = new SqlCommand(); //利用SqlCommand执行事务
    //为挂起的本地事务将事务对象和连接都分配给命令对象
    cmd.Connection = conn;
    cmd.Transaction = trans;
    try
    {                         
        foreach (int id in listIds)
        {
           //执行过程 
            cmd.CommandText = "update StudentInfo set IsDeleted=1 where StuId=@stuId";
            SqlParameter para = new SqlParameter("@StuId",id);
            cmd.Parameters.Clear();
            cmd.Parameters.Add(para);
            cmd.ExecuteNonQuery()
        }
        trans.Commit();//提交事务,代表所有的事务已经提交到数据库
        Console.WriteLine("Both records are written to database.");
    }
    catch (SqlException ex)
    {
        trans.Rollback();//catch特定用法,从挂起状态滚回事务
        MessageBox.Show(ex.Message, "异常信息捕捉", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
}

Ejemplos de proyectos:

Tomemos un ejemplo en un proyecto, hay dos tablas en la base de datos, la tabla del estudiante y la tabla de la clase, las dos tablas están conectadas por el número de clase ClassId, luego, al ingresar información, primero debe ingresar el ClassId en la tabla de clase y luego Ingrese la información en la tabla del alumno; de manera similar, al eliminar la información de la clase, primero elimine la tabla esclava (información del alumno relacionada con la clase) y luego elimine la tabla maestra (información de la clase en la tabla de la clase)

Elimine primero la tabla esclava (clase en la tabla del alumno), luego elimine la tabla maestra (tabla de la clase)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Proceso de implementación:
la transacción de ejecución se encapsula en un método, porque una instrucción solo se puede ejecutar una vez, por ejemplo, ahora desea eliminar la información del alumno relacionada con la clase en la tabla del alumno, y luego eliminar la información de la clase en la tabla de la clase.
Generalmente, se usan dos declaraciones, pero aquí lo encapsulamos en un método. Al ejecutar varias declaraciones SQL, solo necesita pasar los parámetros y llamar al método una vez:
1. Primero, obtenga el classId en datagridview, escriba la declaración SQL y agregue los parámetros

int ClassId = int.Parse(dr["classId"].ToString());
//删除该班级对应的学生信息
string sqlDelStudent = "update StudentInfo set IsDeleted=1 where ClassId=@classId";
//删除班级信息
string sqlDelClass = "update ClassInfo set IsDeleted=1 where ClassId=@classId";
SqlParameter[] para = {new SqlParameter ("@ClassId", ClassId) };

2. Luego definimos una clase responsable del paso de parámetros

public class CommandInfo
{
   public string CommandText;//sql 或者存储过程名
   public DbParameter[] parameters;//参数列表
   public bool IsProc;//是否存储过程
   public CommandInfo(string comText, bool isProc, DbParameter[] para)
     {
        this.CommandText = comText;//sql语句
        this.IsProc = isProc;//是否存储过程
        this.parameters = para;//参数列表
     }
}

3. Luego almacene la información en la tabla del alumno y la tabla de la clase por separado en una Lista genérica

List<CommandInfo> listComs = new List<CommandInfo>();
CommandInfo comStudent = new CommandInfo()
{
    CommandText = sqlDelStudent,                         
    parameters = para
};
listComs.Add(comStudent);//添加学生表的sql语句和参数
CommandInfo comClass = new CommandInfo()
{
    CommandText = sqlDelClass,                       
    parameters = para
};
listComs.Add(comClass);//添加班级表的sql语句和参数

4. Después de que todas las adiciones son exitosas, solo necesita llamar a la transacción de ejecución una vez, el método devuelve un valor bool, el éxito es verdadero, de lo contrario, genera una excepción

bool bl = SqlHelper.ExcuteTrans(listComs);

5. El método de encapsulación es el siguiente, simplemente reemplace el proceso de ejecución en la figura
Inserte la descripción de la imagen aquí
6. Reemplace con lo siguiente:

 int count = 0;
 for (int i = 0; i < comList.Count;i++)//遍历list中所有的变量
 {
     cmd.CommandText = comList[i].CommandText;//获取sql语句   或者存储过程
     if(comList[i].IsProc)//若是存储过程
     {
         cmd.CommandType = CommandType.StoredProcedure;//获取存储过程的名称
     }
     else
     {
         cmd.CommandType = CommandType.Text;//获取sql语句文本
     }
     if(comList[i].parameters.Length>0)//若泛型中的参数列表长度不为0
     {
         cmd.Parameters.Clear();//每次循环都先清空
         cmd.Parameters.AddRange(comList[i].parameters);//再添加
     }
     count += cmd.ExecuteNonQuery();//执行事务过程,并返回受影响 的行数
     cmd.Parameters.Clear();
 }

Hasta ahora, las funciones requeridas se han completado y la demostración es la siguiente:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Publicado 18 artículos originales · elogiado 0 · visitas 233

Supongo que te gusta

Origin blog.csdn.net/qq_39217004/article/details/105472693
Recomendado
Clasificación