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ó.