/// <summary> /// 计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改 /// </summary> /// <returns></returns> public override async Task <int> SubmitChangesAsync() { int rowCount = _dbQueryables.Count; if (rowCount == 0) { return(0); } List <Command> sqlList = this.Provider.Resolve(_dbQueryables); List <int> identitys = new List <int>(); IDataReader reader = null; try { Func <IDbCommand, Task <object> > func = async cmd => { reader = await base.Database.ExecuteReaderAsync(cmd); TypeDeserializer deserializer = new TypeDeserializer(this.Database, reader, null); do { var result = deserializer.Deserialize <int>(); foreach (IDbDataParameter p in cmd.Parameters) { if (p.Direction != ParameterDirection.Output) { continue; } identitys.Add(Convert.ToInt32(p.Value)); } }while (reader.NextResult()); // 释放当前的reader if (reader != null) { reader.Dispose(); } return(null); }; await this.Database.ExecuteAsync <object>(sqlList, func); this.SetAutoIncrementValue(_dbQueryables, identitys); return(rowCount); } finally { if (reader != null) { reader.Dispose(); } this.InternalDispose(); } }
private void AssertSignature(string sExp, params Argument_v1[] args) { var arch = new MipsBe32Architecture(); var tser = new TypeDeserializer(); var mipsps = new MipsProcedureSerializer(arch, tser, null); var sig = mipsps.Deserialize(new SerializedSignature { Arguments = args }, arch.CreateFrame()); var sArgs = string.Join(", ", sig.Parameters.Select(p => RenderArg(p.Storage))); Assert.AreEqual(sExp.Trim(), sArgs); }
/// <summary> /// 计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改 /// </summary> /// <returns></returns> public override int SubmitChanges() { int rowCount = _dbQueryables.Count; if (rowCount == 0) { return(0); } IDataReader reader = null; List <int> identitys = null; List <Command> sqlList = this.Provider.Resolve(_dbQueryables); Func <IDbCommand, object> doExecute = cmd => { reader = this.Database.ExecuteReader(cmd); TypeDeserializer deserializer = new TypeDeserializer(this.Database, reader, null); do { List <int> autoIncrements = null; deserializer.Deserialize <object>(out autoIncrements); if (cmd.Parameters != null) { foreach (IDbDataParameter p in cmd.Parameters) { if (p.Direction != ParameterDirection.Output) { continue; } if (identitys == null) { identitys = new List <int>(); } identitys.Add(Convert.ToInt32(p.Value)); } } }while (reader.NextResult()); // 释放当前的reader if (reader != null) { reader.Dispose(); } return(null); }; try { this.Database.Execute <object>(sqlList, doExecute); this.SetAutoIncrementValue(_dbQueryables, identitys); return(rowCount); } finally { if (reader != null) { reader.Dispose(); } this.InternalDispose(); } }
/// <summary> /// 计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改 /// </summary> /// <typeparam name="T1">T</typeparam> /// <typeparam name="T2">T</typeparam> /// <param name="result1">提交更改并查询数据</param> /// <returns></returns> public override int SubmitChanges <T1, T2>(out List <T1> result1, out List <T2> result2) { result1 = new List <T1>(); result2 = new List <T2>(); int rowCount = _dbQueryables.Count; if (rowCount == 0) { return(0); } List <T1> q1 = null; List <T2> q2 = null; IDataReader reader = null; List <int> identitys = null; List <Command> sqlList = this.Provider.Resolve(_dbQueryables); List <IMapper> maps = sqlList.ToList(x => x as IMapper, x => x is IMapper); Func <IDbCommand, object> doExecute = cmd => { reader = this.Database.ExecuteReader(cmd); TypeDeserializer deserializer1 = null; TypeDeserializer deserializer2 = null; do { if (q1 == null) { // 先查第一个类型集合 List <int> autoIncrements = null; if (deserializer1 == null) { deserializer1 = new TypeDeserializer(this.Database, reader, maps.Count > 0 ? maps[0] : null); } var collection = deserializer1.Deserialize <T1>(out autoIncrements); if (collection != null) { q1 = collection; } if (cmd.Parameters != null) { foreach (IDbDataParameter p in cmd.Parameters) { if (identitys == null) { identitys = new List <int>(); } if (p.Direction != ParameterDirection.Output) { continue; } identitys.Add(Convert.ToInt32(p.Value)); } } } else { // 再查第二个类型集合 List <int> autoIncrements = null; if (deserializer2 == null) { deserializer2 = new TypeDeserializer(this.Database, reader, maps.Count > 1 ? maps[1] : null); } var collection = deserializer2.Deserialize <T2>(out autoIncrements); if (collection != null) { if (q2 == null) { q2 = collection; } } if (cmd.Parameters != null) { foreach (IDbDataParameter p in cmd.Parameters) { if (identitys == null) { identitys = new List <int>(); } if (p.Direction != ParameterDirection.Output) { continue; } identitys.Add(Convert.ToInt32(p.Value)); } } } }while (reader.NextResult()); // 释放当前的reader if (reader != null) { reader.Dispose(); } return(null); }; try { this.Database.Execute <object>(sqlList, doExecute); result1 = q1 ?? new List <T1>(0); result2 = q2 ?? new List <T2>(0); this.SetAutoIncrementValue(_dbQueryables, identitys); return(rowCount); } finally { if (reader != null) { reader.Dispose(); } this.InternalDispose(); } }