请教大神 这个事务该怎么实现
我现在的代码如下:
public static int ExecuteAsTransaction(string CommandText, List<Parameter[]> ParamsList)
{
//...省略部分代码 已经获取连接Sconn
SqlCommand cmd = new SqlCommand();
cmd.Connection = Sconn;
SqlTransaction transaction = Sconn.BeginTransaction(); //开始事务 cmd.Transaction = transaction;
bool flag = false;
try
{
foreach (Parameter[] Params in ParamsList)
{
AddParameter(ref cmd, Params); //增加参数
cmd.CommandText = CommandText;
cmd.ExecuteNonQuery();
}
transaction.Commit();
flag = true;
}
catch (Exception ex1)
{
transaction.Rollback();
flag = false;
throw new Exception(ex1.Message);
}
finally
{
//
}
return (flag ? 0 : -2);
}
private static void AddParameter(ref SqlCommand Cmd, params Parameter[] Params)
{
//如果SqlCommand对象和参数列表不为空,则进行添加参数操作
if ((Params != null) && (Cmd != null))
{
for (int i = 0; i < Params.Length; i++)
{
if (Params[i] != null) //判断参数是否为空
{
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = Params[i].Name.StartsWith("@") ? Params[i].Name : ("@" + Params[i].Name); //哪果参数没有以"@"开头,则手动添加上"@"符号
parameter.SqlDbType = DbType2SqlDbType(Params[i].Type); //设置参数类型
if (Params[i].Size > 0)
{
parameter.Size = Params[i].Size; //设置参数大小
}
parameter.Direction = Params[i].Direction; //设置参数方向
//如果参数方向为"输入" 或者 "输入输出"并且参数不为空,则为参数的 Value属性赋值
if (((Params[i].Direction == ParameterDirection.InputOutput) || (Params[i].Direction == ParameterDirection.Input)) && (Params[i].Value != null))
{
parameter.Value = Params[i].Value;
}
Cmd.Parameters.Add(parameter); //将参数添加到SqlCommand命令中
}
}
}
}
事务
[解决办法]
你这个还是单个事务提交,每次提交的事务还是只有执行一次CommandText中的内容。修改之前和之后基本没有区别。
如果你提交一次事务,需要插入多行数据,有三种方法:
1. 提交一次的事务中,就是CommandText进行拼接。
2. 将单个CommandText的事务建立sqlcommand之后,将多个sqlcommand一次性提交,这个你需要大量改写程序,建立新类等很多工作,Sqlcommand 没有batch操作。对你来说可能过于复杂
3. 将要插入的数据放入表格,再在数据库自定义表格变量用于参数提交。对你来说也可能过于复杂。
就目前来说,你这个模式是基本模式。性能上稍微差点,但是如果数据不多,就没有什么区别。