两个不同实体对象实现事物提交(SqlTransaction )

public int ExecuteSqlTran(Maticsoft.Model.SHWL_Stock model, Maticsoft.Model.SHWL_OutPutComponet model2)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into SHWL_Stock(");
strSql.Append("ID,ComponentName,Brand,Type,Unit,Count,Supplier)");
strSql.Append(" values (");
strSql.Append("@ID,@ComponentName,@Brand,@Type,@Unit,@Count,@Supplier)");
SqlParameter[] parameters = {
new SqlParameter("@ID", SqlDbType.Int),
new SqlParameter("@ComponentName", SqlDbType.NVarChar,50),
new SqlParameter("@Brand", SqlDbType.Int),
new SqlParameter("@Type", SqlDbType.Int),
new SqlParameter("@Unit", SqlDbType.Int),
new SqlParameter("@Count", SqlDbType.Int),
new SqlParameter("@Supplier", SqlDbType.Int)};
parameters[0].Value = model.ID;
parameters[1].Value = model.ComponentName;
parameters[2].Value = model.Brand;
parameters[3].Value = model.Type;
parameters[4].Value = model.Unit;
parameters[5].Value = model.Count;
parameters[6].Value = model.Supplier;

StringBuilder strSql2 = new StringBuilder();
strSql2.Append("insert into SHWL_OutPutComponet(");
strSql2.Append("SNum,ComponentName,Brand,Type,Unit,Count,Price,ModelName,Supplier,IsOld,WareHouse,Location,Operator,Memo,Company,Department,Status)");
strSql2.Append(" values (");
strSql2.Append("@SNum,@ComponentName,@Brand,@Type,@Unit,@Count,@Price,@ModelName,@Supplier,@IsOld,@WareHouse,@Location,@Operator,@Memo,@Company,@Department,@Status)");
strSql2.Append(";select @@IDENTITY");
SqlParameter[] parameters2 = {
new SqlParameter("@SNum", SqlDbType.VarChar,35),
new SqlParameter("@ComponentName", SqlDbType.NVarChar,50),
new SqlParameter("@Brand", SqlDbType.Int),
new SqlParameter("@Type", SqlDbType.Int),
new SqlParameter("@Unit", SqlDbType.Int),
new SqlParameter("@Count", SqlDbType.Int),
new SqlParameter("@Price", SqlDbType.Money),
new SqlParameter("@ModelName", SqlDbType.NVarChar,50),
new SqlParameter("@Supplier", SqlDbType.Int),
new SqlParameter("@IsOld", SqlDbType.NChar,1),
new SqlParameter("@WareHouse", SqlDbType.Int),
new SqlParameter("@Location", SqlDbType.Int),
new SqlParameter("@Operator", SqlDbType.NChar,15),
new SqlParameter("@Memo", SqlDbType.NVarChar,100),
new SqlParameter("@Company", SqlDbType.NVarChar,70),
new SqlParameter("@Department", SqlDbType.NVarChar,30),
new SqlParameter("@Status", SqlDbType.NChar,2)};
parameters2[0].Value = model2.SNum;
parameters2[1].Value = model2.ComponentName;
parameters2[2].Value = model2.Brand;
parameters2[3].Value = model2.Type;
parameters2[4].Value = model2.Unit;
parameters2[5].Value = model2.Count;
parameters2[6].Value = model2.Price;
parameters2[7].Value = model2.ModelName;
parameters2[8].Value = model2.Supplier;
parameters2[9].Value = model2.IsOld;
parameters2[10].Value = model2.WareHouse;
parameters2[11].Value = model2.Location;
parameters2[12].Value = model2.Operator;
parameters2[13].Value = model2.Memo;
parameters2[14].Value = model2.Company;
parameters2[15].Value = model2.Department;
parameters2[16].Value = model2.Status;
System.Collections.Generic.List<CommandInfo> cmdList = new System.Collections.Generic.List<CommandInfo>();
CommandInfo cmdl = new CommandInfo();
cmdl.CommandText = strSql.ToString();
cmdl.Parameters = parameters;
cmdList.Add(cmdl);
CommandInfo cmd2 = new CommandInfo();
cmdl.CommandText = strSql2.ToString();
cmdl.Parameters = parameters2;
cmdList.Add(cmd2);
return DbHelperSQL.ExecuteSqlTran(cmdList);
}

/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
public static int ExecuteSqlTran(System.Collections.Generic.List<CommandInfo> cmdList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
SqlCommand cmd = new SqlCommand();
try
{ int count = 0;
//循环
foreach (CommandInfo myDE in cmdList)
{
string cmdText = myDE.CommandText;
SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
PrepareCommand(cmd, conn, trans, cmdText, cmdParms);

if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine)
{
if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
{
trans.Rollback();
return 0;
}

object obj = cmd.ExecuteScalar();
bool isHave = false;
if (obj == null && obj == DBNull.Value)
{
isHave = false;
}
isHave = Convert.ToInt32(obj) > 0;

if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave)
{
trans.Rollback();
return 0;
}
if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave)
{
trans.Rollback();
return 0;
}
continue;
}
int val = cmd.ExecuteNonQuery();
count += val;
if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0)
{
trans.Rollback();
return 0;
}
cmd.Parameters.Clear();
}
trans.Commit();
return count;
}
catch
{
trans.Rollback();
throw;
}
}
}
}

private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = CommandType.Text;//cmdType;
if (cmdParms != null)
{

foreach (SqlParameter parameter in cmdParms)
{
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
cmd.Parameters.Add(parameter);
}
}
}

public class CommandInfo
{
public object ShareObject = null;
public object OriginalData = null;
event EventHandler _solicitationEvent;
public event EventHandler SolicitationEvent
{
add
{
_solicitationEvent += value;
}
remove
{
_solicitationEvent -= value;
}
}
public void OnSolicitationEvent()
{
if (_solicitationEvent != null)
{
_solicitationEvent(this,new EventArgs());
}
}
public string CommandText;
public System.Data.Common.DbParameter[] Parameters;
public EffentNextType EffentNextType = EffentNextType.None;
public CommandInfo()
{

}
public CommandInfo(string sqlText, SqlParameter[] para)
{
this.CommandText = sqlText;
this.Parameters = para;
}
public CommandInfo(string sqlText, SqlParameter[] para, EffentNextType type)
{
this.CommandText = sqlText;
this.Parameters = para;
this.EffentNextType = type;
}
}

时间: 2024-10-11 16:32:03

两个不同实体对象实现事物提交(SqlTransaction )的相关文章

循环保存的对象在事物提交后发现只保存了一个对象

有时候我们在使用事务循环保存多个对象时,可能会出现在提交事务后发现只保存了最后一个对象 例如 public void saveSystemDDL(SystemDDLPojo systemDDLPojo) {        String keywordname = systemDDLPojo.getKeywordname();        String[] ite = systemDDLPojo.getItemname();        String typeflag = systemDDLP

EBS OAF开发中实体对象和视图对象的属性设置器

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle Application Framework Documentation Set, Release 12.2 > Oracle Application Framework Developer's Guide > Chapter 5: Implementing Server-Side Features > Entity Object and Vi

Hibernate中实体对象的状态

实体对象的状态 这里的实体对象是指Hibernate的O/R映射关系中的域对象(即O/R中的O).实体对象的生命周期是指实体对象由产生到被GC回收的一段过程,实体对象的生命周期包括3种状态:自由状态(Transient),持久状态(Persistent)和游离状态(Detached). 1.自由状态 自由状态是指实体对象在内存中自由存在,但此时它与数据库无关.主要有一下两个特征: >> 不处于Session的缓存中,也就是不被任何一个Session关联. >> 在数据库中没有对应的

Linq结果直接返回实体对象

说到Linq返回结果集,我们一般都会这样做: var result=from s in db.Students join c in db.Classes on s.ClassID equals c.ClassID select new { Id = s.Id, Name = c.Name, Address = c.Address }; 然后我们就直接操作result结果集或者是再进一步转换为实体对象. 现在,我们可以直接让Linq返回实体对象,这样就省去转换的麻烦了.代码如下: IEnumera

Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数

本文参考<Android系统源代码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/binder ----BpBinder.cpp ----Parcel.cpp ----ProcessState.cpp ----Binder.cpp ----IInterface.cpp ----IPCThreadState.cpp ----IServiceManager.cpp ----Static.cpp ~/Androi

学习ASP.NET MVC(四)——我的第一个ASP.NET MVC 实体对象

今天我将根据数据库中的表结构添加一些类.这些类将成为这个ASP.NET MVC应用程序中"模型"的一部分.       我们使用Entity Framework(实体框架)来定义和使用这些模型类,并且访问数据库.实体框架 (EF) 是一种对象关系映射机制,支持 .NET 开发人员使用特定对象来处理关系数据.它消除了开发人员通常需要编写大部分数据访问代码的工作,所以也称为代码优先开发模式.使用实体框架 ,可以将自定义数据类与数据模型一起使用,而无需对数据类本身进行任何修改. 这意味着可以

利用HttpWebRequest实现实体对象的上传

一 简介 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的.请注意,HttpWebRequest对象不是利用new关键字通过构 造函数来创建的,而是利用工厂机制(factory mechanism)通过Create()方法来创建的.另外,你可能预计需要显式地调用一个“Send”方法,实际上不需要.接下来调用 HttpWebRequ

【Away3D代码解读】(二):渲染核心流程(简介、实体对象收集)

我之前解析过Starling的核心渲染流程,相比Away3D而言Starling真的是足够简单,不过幸运的是两者的渲染流程是大体上相似的:Starling的渲染是每帧调用Starling类中的render方法,类似的Away3D的渲染是每帧调用View3D类中的render方法,那我们要了解Away3D的渲染就需要从这个方法入手了. View3D的render方法源码: 1 /** 2 * Renders the view. 3 */ 4 public function render():voi

iOS关于LKDBHelper实体对象映射插件运用

iOS关于LKDBHelper实体对象映射插件运用 一 插件简介: 其github地址:https://github.com/li6185377/LKDBHelper-SQLite-ORM 全面支持 NSArray,NSDictionary, ModelClass, NSNumber, NSString, NSDate, NSData, UIColor, UIImage, CGRect, CGPoint, CGSize, NSRange, int,char,float, double, long