Saltar al contenido

ExecuteNonQuery requiere que el comando tenga un error de transacción en mi código

Mantén la atención porque en este post vas a hallar el hallazgo que buscas.Este post ha sido probado por nuestros expertos para garantizar la calidad y exactitud de nuestro post.

Solución:

Necesitas cambiar esta línea

SqlCommand cmd = new SqlCommand("update Contact_Info set CustInfo=" + ds.GetXml() + 
                                " WHERE Customer_ID=" + a + "", scon);

De este modo

SqlCommand cmd = new SqlCommand("update Contact_Info set CustInfo=" + ds.GetXml() + 
                  " WHERE Customer_ID=" + a + "", scon, sqlTrans);

El mensaje de error indica exactamente el problema. Antes de que el código llegue a esa línea, ha abierto una transacción y todavía está abierta en el punto de error

.....
scon.Open();       
SqlTransaction sqlTrans = scon.BeginTransaction();
.....       

Ahora, cada SqlCommand ejecutado cuando la conexión tiene una transacción abierta debe ser informado de esto. Framework no establece automáticamente la transacción.

Puede usar el constructor SqlCommand, como se explicó anteriormente, o puede configurar el cmd.Transaction propiedad antes de ejecutar el comando.

Advertencia La necesidad de configurar la transacción para el comando actual es true incluso si crea SqlCommand directamente desde la propia conexión.

   SqlCommand cmd = scon.CreateCommand();
   cmd.Transaction = sqlTrans; // Required when inside a transaction 

Nota: Evite a toda costa el uso de string concatenación cuando se utiliza texto de consulta para actualizar/insertar/eliminar/seleccionar en una base de datos. Usar parámetros. Esto evitará problemas con caracteres extraños o no válidos y, lo que es más importante, evitará ataques SqlInjection.

string sqlText = "update Contact_Info set [email protected] WHERE [email protected]";
SqlCommand cmd = new SqlCommand(sqlText, scon, sqlTrans);  
cmd.Parameters.AddWithValue("@info", ds.GetXml());
cmd.Parameters.AddWithValue("@id",a);
cmd.ExecuteNonQuery();  

Además, otra recomendación es NO usar AddWithValue, aunque es útil, este método tiene muchos problemas como se explica en mi respuesta aquí.

Ha iniciado una transacción que no está confirmada antes de llamar cmd.ExecuteNonQuery().

solo escribe cmd.Transaction = sqlTrans; justo antes cmd.ExecuteNonQuery();

se asegurará de que Ahora ExecuteNonQuery() se ejecutará en la misma transacción y también podrá ver todas las modificaciones realizadas a la base de datos en la misma transacción.

Te mostramos comentarios y calificaciones

Recuerda algo, que te concedemos valorar esta división si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *