一个关于Sqlcommand执行事物与连接池的问题
下面是我师兄以前给我的代码,我不明白为什么要把后面的方法封装,这不是重复啰嗦了么?在第一个方法的for循环中的sql语句不能用同一个命令执行么?这是不是考虑到连接池的问题...
下面是我师兄以前给我的代码,我不明白为什么要把后面的方法封装,这不是重复啰嗦了么?在第一个方法的for循环中的sql语句不能用同一个命令执行么?这是不是考虑到连接池的问题?反正我觉得写得不简洁,求高手改进。
/// <summary>
/// 用事务执行sql语句(多表操作)
/// </summary>
/// <param name="lisql">Sql命令的集合</param>
/// <returns>bool</returns>
public static bool UpdateDatamany(List<string> lisql)
{
SqlConnection conn = openConnection();
SqlCommand sqlcmd = new SqlCommand();
sqlcmd.Connection = conn;//连接对象
sqlcmd.CommandType = CommandType.Text;//命令类型
SqlTransaction sqltran = null;
try
{
conn.Open();//先打开连接才能开启事务
}
catch (Exception e)
{
throw e;
}
try
{
sqltran = conn.BeginTransaction();
sqlcmd.Transaction = sqltran;
for (int i = 0; i < lisql.Count; i++)
{
string sql = Convert.ToString(lisql[i]);
sqlcmd.CommandText = sql;//命令语句
DBHelper.UpdateDataDatamany(sql, sqltran);//执行
}
sqltran.Commit();//提交事务
return true;
}
catch (Exception)
{
sqltran.Rollback();//回滚事务
return false;
}
finally
{
conn.Close();
}
}
private static bool UpdateDataDatamany(string sql, SqlTransaction sqltran)
{
SqlCommand sqlcmd = new SqlCommand(sql, sqltran.Connection);
sqlcmd.Transaction = sqltran;
try
{
int rs = sqlcmd.ExecuteNonQuery();
return rs > 0;
}
catch (Exception e)
{
throw e;
}
} 展开
/// <summary>
/// 用事务执行sql语句(多表操作)
/// </summary>
/// <param name="lisql">Sql命令的集合</param>
/// <returns>bool</returns>
public static bool UpdateDatamany(List<string> lisql)
{
SqlConnection conn = openConnection();
SqlCommand sqlcmd = new SqlCommand();
sqlcmd.Connection = conn;//连接对象
sqlcmd.CommandType = CommandType.Text;//命令类型
SqlTransaction sqltran = null;
try
{
conn.Open();//先打开连接才能开启事务
}
catch (Exception e)
{
throw e;
}
try
{
sqltran = conn.BeginTransaction();
sqlcmd.Transaction = sqltran;
for (int i = 0; i < lisql.Count; i++)
{
string sql = Convert.ToString(lisql[i]);
sqlcmd.CommandText = sql;//命令语句
DBHelper.UpdateDataDatamany(sql, sqltran);//执行
}
sqltran.Commit();//提交事务
return true;
}
catch (Exception)
{
sqltran.Rollback();//回滚事务
return false;
}
finally
{
conn.Close();
}
}
private static bool UpdateDataDatamany(string sql, SqlTransaction sqltran)
{
SqlCommand sqlcmd = new SqlCommand(sql, sqltran.Connection);
sqlcmd.Transaction = sqltran;
try
{
int rs = sqlcmd.ExecuteNonQuery();
return rs > 0;
}
catch (Exception e)
{
throw e;
}
} 展开
2个回答
展开全部
感觉你的代码里面有好多多语的~~~~~
使用using(………………) {} 可以在using结束之后,系统自动关闭对象,清理占用的资源, 例如 using (SqlCommand cmd = new SqlCommand(sql,sqltran.Connection)){……}
使用完后,不需要使用 cmd.Dispose(); 来释放资源,using语句自动帮我们释放;
而且,即使发生错误,using还会使用try{} catch{} finally{} 的形式抛出异常~~~~~~
/// <summary>
/// 用事务执行sql语句(多表操作)
/// </summary>
/// <param name="lisql">Sql命令的集合</param>
/// <returns>bool</returns>
public static bool UpdateDatamany(List<string> lisql)
{
using (SqlConnection conn = openConnection())
{
conn.Open();
using (SqlCommand sqlcmd = new SqlCommand())
{
sqlcmd.Connection = conn;
sqlcmd.CommandType = CommandType.Text;
using (SqlTransaction sqltran = conn.BeginTransaction())
{
sqlcmd.Transaction = sqltran;
for (int i = 0; i < lisql.Count; i++)
{
DBHelper.UpdateDataDatamany(lisql[i].ToString(), sqltran);//依次执行sql语句
//这里把多条sql语句的执行 封装成一个方法,一是减少代码,而是可以查看事务中的某条sql语句是否正确执行,明显在一个方法的语句方便 调试~~~~~~
}
sqltran.Commit();//提交事务
return true;
}
}
}
}
private static bool UpdateDataDatamany(string sql, SqlTransaction sqltran)
{
using (SqlCommand cmd = new SqlCommand(sql,sqltran.Connection))
{
cmd.Transaction = sqltran;
return cmd.ExecuteNonQuery() > 0;
}
}
}
使用using(………………) {} 可以在using结束之后,系统自动关闭对象,清理占用的资源, 例如 using (SqlCommand cmd = new SqlCommand(sql,sqltran.Connection)){……}
使用完后,不需要使用 cmd.Dispose(); 来释放资源,using语句自动帮我们释放;
而且,即使发生错误,using还会使用try{} catch{} finally{} 的形式抛出异常~~~~~~
/// <summary>
/// 用事务执行sql语句(多表操作)
/// </summary>
/// <param name="lisql">Sql命令的集合</param>
/// <returns>bool</returns>
public static bool UpdateDatamany(List<string> lisql)
{
using (SqlConnection conn = openConnection())
{
conn.Open();
using (SqlCommand sqlcmd = new SqlCommand())
{
sqlcmd.Connection = conn;
sqlcmd.CommandType = CommandType.Text;
using (SqlTransaction sqltran = conn.BeginTransaction())
{
sqlcmd.Transaction = sqltran;
for (int i = 0; i < lisql.Count; i++)
{
DBHelper.UpdateDataDatamany(lisql[i].ToString(), sqltran);//依次执行sql语句
//这里把多条sql语句的执行 封装成一个方法,一是减少代码,而是可以查看事务中的某条sql语句是否正确执行,明显在一个方法的语句方便 调试~~~~~~
}
sqltran.Commit();//提交事务
return true;
}
}
}
}
private static bool UpdateDataDatamany(string sql, SqlTransaction sqltran)
{
using (SqlCommand cmd = new SqlCommand(sql,sqltran.Connection))
{
cmd.Transaction = sqltran;
return cmd.ExecuteNonQuery() > 0;
}
}
}
展开全部
你做好阶段性调整的心理准备就可以了。
不同阶段的人,写的代码不一样,这样的代码最初我在学做事务的时候也写过类似的,
到后面封装到只写主体,不过问事务代码,到后面更精简。
你也不用问我精简到什么程度,时间一长,你也会做到的。
就好像一开始学编程,很多人变量命名随意,后来看到满屏的代码,自己都头晕的时候,又开始去对齐,开始取点有意义的名字。
不过一开始就算有人告诉你要对齐,要命好名,你也不会注意的,人总是有一种不见棺材不掉泪的想法,到最好还是要死心的。经验是别人的,只能告诉你,无法融于你。
不同阶段的人,写的代码不一样,这样的代码最初我在学做事务的时候也写过类似的,
到后面封装到只写主体,不过问事务代码,到后面更精简。
你也不用问我精简到什么程度,时间一长,你也会做到的。
就好像一开始学编程,很多人变量命名随意,后来看到满屏的代码,自己都头晕的时候,又开始去对齐,开始取点有意义的名字。
不过一开始就算有人告诉你要对齐,要命好名,你也不会注意的,人总是有一种不见棺材不掉泪的想法,到最好还是要死心的。经验是别人的,只能告诉你,无法融于你。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询