/// <summary> /// Check to see whether the result of a persistence operation /// was successful, raise appropriate exceptions if not. /// </summary> /// <param name="dbCommand"> /// <see cref="DbCommand" /> to retrieve result information from. /// </param> /// <param name="resultParameter"> /// Name of the parameter storing the result. /// </param> /// <param name="instanceParameter"> /// Name of the parameter storing the instance identifier. /// </param> private void CheckResult(DbCommand dbCommand, String resultParameter, String instanceParameter) { Int32?result = _valueReader.GetNullableInt32(dbCommand, resultParameter); Guid instanceId = _valueReader.GetGuid(dbCommand, instanceParameter); switch (result) { case _ownershipError: // ownership error throw new WorkflowOwnershipException(instanceId); case _instanceNotFoundError: // workflow could not be found PersistenceException e = new PersistenceException(RM.Get_Error_InstanceCouldNotBeLoaded(instanceId)); e.Data["WorkflowNotFound"] = true; throw e; } }
/// <summary> /// Retrieve instance state from the persistence store. /// </summary> /// <param name="instanceId"></param> /// <param name="ownerId"></param> /// <param name="ownedUntil"></param> /// <returns></returns> public byte[] RetrieveInstanceState(Guid instanceId, Guid ownerId, DateTime ownedUntil) { byte[] instanceState = null; using (DbCommand dbCommand = CreateCommand(nameResolver.ResolveCommandName(PersistenceCommandName.RetrieveInstanceState), CommandType.StoredProcedure)) { string instanceParameter = nameResolver.ResolveParameterName( PersistenceCommandName.InsertInstanceState, PersistenceParameterName.InstanceId); string resultParameter = nameResolver.ResolveParameterName( PersistenceCommandName.InsertInstanceState, PersistenceParameterName.Result); AddParameter(dbCommand, instanceParameter, instanceId, AdoDbType.Guid); AddParameter(dbCommand, nameResolver.ResolveParameterName( PersistenceCommandName.RetrieveInstanceState, PersistenceParameterName.OwnerId), ownerId, AdoDbType.Guid); AddParameter(dbCommand, nameResolver.ResolveParameterName( PersistenceCommandName.RetrieveInstanceState, PersistenceParameterName.OwnedUntil), ownedUntil, AdoDbType.DateTime); AddParameter(dbCommand, resultParameter, AdoDbType.Int32, ParameterDirection.Output); AddParameter(dbCommand, nameResolver.ResolveParameterName( PersistenceCommandName.RetrieveInstanceState, PersistenceParameterName.CurrentOwnerId), AdoDbType.Guid, ParameterDirection.Output); AddParameter(dbCommand, nameResolver.ResolveParameterName( PersistenceCommandName.RetrieveInstanceState, PersistenceParameterName.State), AdoDbType.Cursor, ParameterDirection.Output); int?result; using (IDataReader dataReader = dbCommand.ExecuteReader()) { if (dataReader.Read()) { instanceState = (byte[])valueReader.GetValue(dataReader, 0); } result = valueReader.GetNullableInt32(dbCommand, resultParameter); } if (instanceState == null && result > 0) { // workflow could not be found PersistenceException e = new PersistenceException( RM.Get_Error_InstanceCouldNotBeLoaded(instanceId)); e.Data["WorkflowNotFound"] = true; WfLogHelper.WriteLog("检索实例状态 public byte[] RetrieveInstanceState(" + instanceId + ", " + ownerId + ", " + ownedUntil + ")发生异常:" + e.ToString()); throw e; } else { checkResult(dbCommand, resultParameter, instanceParameter); } } return(instanceState); }