Как избежать перестройки моей базы данных каждый раз, когда я изменяю свой рабочий процесс Windows - PullRequest
0 голосов
/ 17 июля 2009

Я встраиваю рабочий процесс Windows в веб-приложение .Net. У меня проблема в том, что каждый раз, когда я добавляю, удаляю или изменяю действие в конечном компьютере, а затем перекомпилирую и запускаю его, оно больше не соответствует тому, что находится в базе данных для отслеживания и сохранения. Вместо обновления изменений или создания новой версии рабочего процесса в базе данных он выдает ошибку. Иногда это ошибка «index of the bounds», иногда «Не удается получить член XXXXX».

Чтобы заставить его работать, я должен удалить базу данных и перестроить ее. Я считаю, что это работает, потому что, когда механизм рабочего процесса ищет рабочий процесс в базе данных, он не находит его и, таким образом, добавляет его в базу данных. Это очень расстраивает на этапе, на котором я нахожусь, когда я строю рабочий процесс, и он меняется много раз в день.

Есть ли способ, которым я могу просто заставить механизм рабочего процесса обновить соответствующие таблицы в базе данных с изменениями, которые я внес в рабочий процесс? Или перезаписать его новой версией? Я просмотрел различные веб-страницы по настройке рабочего процесса для динамического обновления во время выполнения, но ни одно из этих предложений не помогло мне. И хотя эта функция мне нужна для рабочего процесса, я не уверен, что это действительно способ решить мою проблему. Я не так сильно создаю новую версию рабочего процесса, скорее я создаю рабочий процесс и хочу протестировать только что законченную / добавленную часть, и меня не волнуют предыдущие версии рабочего процесса и любые частично завершенные рабочие процессы в базе данных.

Спасибо.

1 Ответ

1 голос
/ 17 июля 2009

Я тоже сталкивался с подобной проблемой, каждый раз, когда менялся дизайн рабочего процесса, все старые экземпляры рабочего процесса в БД используют для выдачи ошибки.

Чтобы преодолеть это, я создал профиль отслеживания для каждого типа рабочего процесса. Если я изменил какой-либо рабочий процесс, я обновил версию своего профиля. Это сработало для меня .. Вот пример кода -

Для этого вам нужно добавить сервис отслеживания во время выполнения рабочего процесса.

Профиль TrackingProfile = CreateProfile ();

StoreProfileToDB (профиль, connString, typeof (ExceptionWF.ParameterExceptionWF), "2.0.0.0");

приватный статический трекингПрофиль СоздатьПрофиль () { TrackingProfile myProfile = new TrackingProfile ();

        ActivityTrackingLocation stateActivityLocation = CreateActivityLocation(typeof(StateActivity));
        AddActivityExecutionStatus(stateActivityLocation);

        ActivityTrackingLocation eventDrivenActLoc = CreateActivityLocation(typeof(EventDrivenActivity));
        AddActivityExecutionStatus(eventDrivenActLoc);

        ActivityTrackPoint actPt = new ActivityTrackPoint();

        actPt.MatchingLocations.Add(stateActivityLocation);
        actPt.MatchingLocations.Add(eventDrivenActLoc);
        myProfile.ActivityTrackPoints.Add(actPt);

        WorkflowTrackPoint workflowTrack = CreateWorkflowTrackPoint();
        myProfile.WorkflowTrackPoints.Add(workflowTrack);

        UserTrackPoint utp = new UserTrackPoint();
        UserTrackingLocation ul = new UserTrackingLocation();
        ul.ActivityType = typeof(HandleExternalEventActivity);
        ul.ArgumentType = typeof(object);
        ul.MatchDerivedArgumentTypes = true;
        ul.MatchDerivedActivityTypes = true;
        utp.MatchingLocations.Add(ul);

        myProfile.UserTrackPoints.Add(utp);
        myProfile.Version = new Version("1.0.0.0");
        return myProfile;
    }

    private static void StoreProfileToDB(TrackingProfile profile, string connString, Type wfType,string version)
    {
        TrackingProfileSerializer serializer = new TrackingProfileSerializer();
        System.IO.StringWriter writer = new System.IO.StringWriter(new StringBuilder());
        serializer.Serialize(writer, profile);
        SqlConnection conn = null;
        try
        {
            if (!String.IsNullOrEmpty(connString))
            {
                conn = new SqlConnection(connString);


                string storedProc = "dbo.UpdateTrackingProfile";
                SqlCommand cmd = new SqlCommand(storedProc, conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                SqlParameter param = new SqlParameter("@TypeFullName", SqlDbType.NVarChar, 128);
                param.Direction = ParameterDirection.Input;
                param.Value = wfType.FullName;
                cmd.Parameters.Add(param);


                param = new SqlParameter("@AssemblyFullName", SqlDbType.NVarChar, 256);
                param.Direction = ParameterDirection.Input;
                param.Value = wfType.Assembly.FullName;
                cmd.Parameters.Add(param);


                param = new SqlParameter("@Version", SqlDbType.VarChar, 32);
                param.Direction = ParameterDirection.Input;
                //Note that you should increment version number for your
                //TrackingProfile to be able to use new TrackingProfile.
                //Default version is "1.0.0.0, It uses the default profile if not increamented.
                param.Value = version;
                cmd.Parameters.Add(param);

                param = new SqlParameter("@TrackingProfileXml", SqlDbType.NText);
                param.Direction = ParameterDirection.Input;
                param.Value = writer.ToString();
                cmd.Parameters.Add(param);

                conn.Open();
                cmd.ExecuteNonQuery();

            }//if
        }// try
        catch (Exception ex)
        {
            if (ex is SqlException)
            {
                //Check to see if it's a version error
                if (ex.Message.Substring(0, 24) == "A version already exists")
                {
                    EventLogger.Log("A profile with the same version already exists in database");
                }//if
                else
                {
                    EventLogger.Log("Error writing profile to database : " + ex.ToString());
                }
            }
            else
            {
                EventLogger.Log("Error writing profile to database : " + ex.ToString());
            }
        }
        finally
        {
            if (conn != null) { conn.Close(); }
        }
    }
...