Попытка сохранить DataSet в приложении WinForm - PullRequest
0 голосов
/ 06 августа 2009

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

В веб-приложении Function SaveMe() имеется следующий код на странице Person.ascx.vb ->

        //get dataset from session
        Dim dsPerson As Data.DataSet = CType(Session.Item("Person" & Me.UniqueID), DataSet)
        //if no rows in dataset, add
        If dsPerson.Tables(0).Rows.Count = 0 Then
            Dim rowPerson As Data.DataRow = dsPerson.Tables(0).NewRow
            dsPerson.Tables(0).Rows.Add(FillPersonRow(rowPerson))
        Else
        //otherwise update
        ....more code here

Часть, на которой я застрял, - как логически создать набор данных в приложении WinForm?

Должен ли я просто очистить все поля и выбросить их в набор данных? Как ( это то, что я буду исследовать / попробовать, ожидая совета от SO )?


EDIT

Сессия создается / заполняется в подпункте LoadMe(), вот так ->

        //load person
        Dim dsTemp As Data.DataSet = BLL.Person.GetPerson(PersonID)
        //save to session state
        Session.Add("Person" & Me.UniqueID, dsTemp)

EDIT

Я пытаюсь создать переменную уровня формы -> private DataSet _personInfo; для хранения DataSet, затем в моем FormPaint(int personID) я вызываю следующее:

            _personInfo = ConnectBLL.BLL.Person.GetPerson(personID);

Затем я использую это для заполнения различных полей в Форме.

Далее, на btnUpdate_Click() Я пробую следующее, но безрезультатно:

       void btnUpdate_Click(object sender, EventArgs e)
    {
        var areChanges = _personInfo.HasChanges();
        if (areChanges)
        {
            var whatChanged = _personInfo.GetChanges();
            var confirmChanges =
                MessageBox.Show(
                    "Are you sure you want to make these changes: " +
                    whatChanged.Tables[0].Rows[0].ItemArray.ToString(), "Confirm Member Info Changes",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Hand);
            if (confirmChanges == DialogResult.Yes)
            {
                _personInfo.AcceptChanges();
                ConnectBLL.BLL.Person.Update(_personInfo);
            }
        }

        FormPaint(HUD.PersonId);
    }

Мне неясно, что я делаю не так? Я пропускаю шаг?

Спасибо

Ответы [ 3 ]

3 голосов
/ 06 августа 2009

Во-первых,

Если вы хотите получить хорошее объяснение проблемы, поднятой Джейкобом, прочитайте следующую статью ...

http://www.knowdotnet.com/articles/datasetmerge.html

И я согласен с другими, что вы, кажется, делаете это сложнее, чем нужно.

Вам не ясно, что такое класс ConnectBLL ... это пользовательский объект бизнес-класса или строго типизированный набор данных.

Выполнение привязки данных, которая будет автоматически сохранять, было бы очень длинным постом, поэтому вместо этого здесь есть пара ссылок.

http://www.codeguru.com/columns/vb/article.php/c10815
http://support.microsoft.com/kb/313482
http://msdn.microsoft.com/en-us/library/aa984336(VS.71).aspx

Это были первые ссылки, которые я нашел в Google, используя (пошаговая инструкция по привязке данных winforms со строго типизированным набором данных) в качестве строки поиска. Вы можете найти лучший. Ссылка на кодегуру выглядела довольно хорошо. Другой, чтобы быть более тщательным за счет того, чтобы быть более техническим.

Лучше всего ... если вы можете перейти к книге Криса Селлса по разработке winforms, главы по связыванию данных превосходны (вместе со всеми остальными главами.)

http://www.amazon.com/Windows-Forms-Programming-Microsoft-Development/dp/0321267966/ref=sr_1_1?ie=UTF8&qid=1249525202&sr=8-1

Надеюсь, это поможет.

1 голос
/ 06 августа 2009

Ваша проблема, вероятно, здесь:

 if (confirmChanges == DialogResult.Yes)
 {
      _personInfo.AcceptChanges();
      ConnectBLL.BLL.Person.Update(_personInfo);
 }

AcceptChanges устанавливает RowState в значение «Не изменено» во всех строках, которые были готовы к обновлению. Честно говоря, вероятно, было бы лучше использовать whatChanged, поскольку это избавит ваш адаптер от необходимости перепроверять наличие измененных строк.

 if (confirmChanges == DialogResult.Yes)
 {
      ConnectBLL.BLL.Person.Update(whatChanged);
      _personInfo.AcceptChanges();
 }
1 голос
/ 06 августа 2009

В этом фрагменте DataSet приходит из сеанса. Когда это установлено?

Вы, безусловно, можете использовать DataSet в приложении WinForms. У вас проблемы с привязкой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...