#c# #asp.net #sqltransaction
#c# #asp.net #sqltransaction
Вопрос:
Всем привет, я написал следующую транзакцию для вставки данных, но когда я получаю исключение, только те данные, которые получили исключение, не вставляются в db, остальные все вставляются
Это то, что я написал
public bool addWhole(SqlTransaction osqlTrans)
{
m_flag = false;
osqlTrans = null;
SqlConnection osqlCon = new SqlConnection(constr);
if (osqlCon.State != ConnectionState.Open)
{
osqlCon.Open();
}
osqlTrans = osqlCon.BeginTransaction();
try
{
if (this.addRisk(osqlTrans, osqlCon))
{
if (this.addEconomical(osqlTrans, osqlCon))
{
osqlTrans.Commit();
}
}
}
catch (Exception ex)
{
osqlTrans.Rollback();
}
finally
{
osqlCon.Close();
}
return m_flag;
}
public bool addRisk(SqlTransaction oRiskTrans, SqlConnection oRiskConn)
{
con = new SqlConnection(constr);
if (con.State != ConnectionState.Open)
{
con.Open();
}
cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" id "','" str "','" dbPercent "')", con); //Even i tried adding transaction in command statement
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
public bool addEconomical(SqlTransaction oRiskTrans, SqlConnection oRiskConn)
{
con = new SqlConnection(constr);
if (con.State != ConnectionState.Open)
{
con.Open();
}
cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" id "','" str "','" dbPercent "')", con);//Even i tried adding transaction in command statement
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
Я попытался откатить транзакцию, не выполнив второе условие, но мой первый оператор — inserting to DB
.. Что я должен сделать, чтобы преодолеть это
Комментарии:
1. Использование
osqlTrans
ШОКИРУЕТ!
Ответ №1:
Я предполагаю, что это одна из этих вещей
1) Вы не используете один и тот же объект подключения для всех разных команд
2) Вы не назначаете транзакцию командам перед их выполнением
3) Возможно, обе
Попробуйте использовать тот же объект connection и назначить транзакцию команде перед ее выполнением, пример смотрите на этой странице в MSDN.http://msdn.microsoft.com/en-us/library/86773566.aspx
Ответ №2:
Транзакция не распределяется между соединениями, и вы всегда создаете новое соединение. Используйте oRiskConn, указанный в качестве 2-го параметра ваших методов.
Ответ №3:
Поскольку вы создаете новое соединение в каждой функции, ваш код не работал. Просто удалите соединение
`con = new SqlConnection(constr);`
Замените его соединением, доступным в вашей функции, т. е
oRiskConn
и не инициализируйте это как новое соединение. Если вы сделали это снова, ваша транзакция в соответствии с вашим требованием не будет работать. Также включите oRiskTrans
в свой командный объект. Тогда это будет работать в соответствии с вашими требованиями
Ответ №4:
Я не знаю, каковы некоторые из ваших параметров, но, похоже, вы хотите что-то вроде этого:
class SomeClass
{
// These need to be set to appropriate values
int id, str;
double dbPercent;
string constr;
public bool addWhole()
{
var m_flag = false;
using (var osqlCon = new SqlConnection(constr))
{
if (osqlCon.State != ConnectionState.Open)
{
osqlCon.Open();
}
using (var osqlTrans = osqlCon.BeginTransaction())
{
try
{
if (m_flag = this.addRisk(osqlTrans))
{
if (m_flag = this.addEconomical(osqlTrans))
{
osqlTrans.Commit();
}
}
}
catch (Exception)
{
// Use $exception in watch window if you are debugging
osqlTrans.Rollback();
}
}
}
return m_flag;
}
public bool addRisk(SqlTransaction oRiskTrans)
{
var m_flag = false;
using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" id "','" str "','" dbPercent "')"))
{
cmd.Transaction = oRiskTrans;
cmd.Connection = oRiskTrans.Connection;
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
return m_flag;
}
public bool addEconomical(SqlTransaction oRiskTrans)
{
var m_flag = false;
using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" id "','" str "','" dbPercent "')"))
{
cmd.Transaction = oRiskTrans;
cmd.Connection = oRiskTrans.Connection;
if (cmd.ExecuteNonQuery() > 0)
{
m_flag = true;
}
}
return m_flag;
}
}