Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VFP -> C#. SQL View -> TableAdapter / 5 сообщений из 5, страница 1 из 1
29.07.2016, 16:08
    #39282933
Корректор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VFP -> C#. SQL View -> TableAdapter
Пытаюсь познакомиться с C# 2010.
В форме есть метода. В первом методе, используемом при загрузке формы, если пользовательские настройки отсутствуют - формируется новая запись. Update проходит без ошибок. Во втором методе, используемом при закрытии формы, пользовательская запись уже существует, она (запись) только модифицируется. Ошибка при попытке выполнить Update во втором методе: «Для обновления требуется действительный UpdateCommand при передаче коллекции DataRow с измененными строками».

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
        // Загрузка пользовательских настроек
        private void LoadState()
        {
            SqlConnection connection = new SqlConnection(connetionString);
            connection.Open();
            DataTable PmformDT = new PrintmanDataSet.pmformDataTable();
            string cSQL = "SELECT * FROM Pmform Where userid = '00001' and formname = 'P0001'";
            PmformTA.Adapter.SelectCommand = new SqlCommand(cSQL, connection);
            PmformTA.Adapter.Fill(PmformDT);
            // Если строка пользовательских настроек отсутствует - создаем ее
            if (PmformDT.Rows.Count == 0)
            {
                DataRow PmformDR = PmformDT.NewRow();
                PmformDR["userid"] = "00001";
                PmformDR["formname"] = "P0001";
                PmformDR["formleft"] = 0;
                PmformDR["formtop"] = 0;
                PmformDR["formwidth"] = 600;
                PmformDR["formheight"] = 300;
                PmformDR["treeview"] = false;
                PmformDR["splitpos"] = 170;
                PmformDR["sortmode1"] = true;
                PmformDT.Rows.Add(PmformDR);
                PmformTA.Update(PmformDR);
            }
            this.Left = (int) PmformDT.Rows[0]["formleft"];
            this.Top = (int) PmformDT.Rows[0]["formtop"];
            this.Width = (int) PmformDT.Rows[0]["formwidth"];
            this.Height = (int) PmformDT.Rows[0]["formheight"];
            this.Treeview = (bool) PmformDT.Rows[0]["treeview"];
            this.Splitpos = (int) PmformDT.Rows[0]["splitpos"];
            this.Sortmode1 = (bool)PmformDT.Rows[0]["sortmode1"];
            PmformTA.Dispose();
            connection.Close();
        }


        //Сохранение пользовательских настроек
        private void SaveState()
            {
            SqlConnection connection = new SqlConnection(connetionString);
            connection.Open();
            DataTable PmformDT = new PrintmanDataSet.pmformDataTable();
            string cSQL = "SELECT * FROM Pmform Where userid = '00001' and formname = 'P0001'";
            PmformTA.Adapter.SelectCommand = new SqlCommand(cSQL, connection);
            PmformTA.Adapter.Fill(PmformDT);
            DataRow PmformDR = PmformDT.Rows[0];
            PmformDR["userid"] = "00001";
            PmformDR["formname"] = "P0001";
            PmformDR["formleft"] = this.Left;
            PmformDR["formtop"] = this.Top;
            PmformDR["formwidth"] = this.Width;
            PmformDR["formheight"] = this.Height;
            PmformDR["treeview"] = this.Treeview;
            PmformDR["splitpos"] = this.Splitpos;
            PmformDR["sortmode1"] = this.Sortmode1;
            PmformTA.Update(PmformDR);
            PmformTA.Dispose();
            connection.Close();
        }


Первый вопрос (не могу удержаться от смеха): значит вносить новую запись без описания Update можно, а если потрогали уже имевшуюся – нальзя?
Ну, может быть, меня от глупости так прет ….

Вопрос второй, для меня куда более значим. Смотрел «Мастер настройки запроса TableAdapter». Увидел там примечание:
«Создание инструкции INSERT, UPDATE или DELETE не заменяет собой команды адаптера таблицы, используемые при вызове его метода Update. Например, при выборе UPDATE в качестве типа запроса создается новый запрос с именем, которое задается на более позднем шаге в мастере. Для выполнения данного запроса вы вызываете этот именованный метод адаптера таблицы. Вызов метода Updateадаптера таблицы выполняет инструкции, созданные при первоначальной настройке адаптера таблицы».

А на хрена мне тогда такой адаптер?
Чего собственно хочется. В VFP я использовал SQL View. На первых порах SQL View создавался в дизайнере. Позднее, была использована процедура генерации текста SQL View по описанию модуля (справочника, журнала и т.п.). Важно не это. Важно, что всего один раз был описан SQL View. А во всех формах использовался метод сохранения со строкой:
Begin Transaction
lResult = Tableupdate(.T.,.T., Thisform.viewheader)

В C# 2010 стоило подключить базу – автоматически сформировались адаптеры для каждой таблицы. Посмотрел опеределения – роман. Текст SQL View записулькой теперь представляется. Может, я тороплюсь, может терпения не хватает? Неужели нет средств для исчерпывающего описания связей полей источника и полей представления, что апдейтить, а чего нет. Чтобы далее использовать лишь имя представления. Неужели нельзя написать пользовательский адаптер? Тогда, правда, опять хочется спросить, вот эта куча мусора в окне классов зачем?

Извините, если слишком эмоционально. Ткните носом в нужное направление.
...
Рейтинг: 0 / 0
29.07.2016, 19:33
    #39283125
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VFP -> C#. SQL View -> TableAdapter
Корректор,
Все пока не дочитал.
Не могу удержаться от смеха. Вы думаете, что Adapter заменяет SqlDataAdapter?
Вы действительно думает, что если вы не создали SqlDataAdapter.UpdateCommand у Вас что-то будет обновлятся?
И что если бы Вы даже выполнили предыдущие пункты, что нибудь обновилось в

Корректор
Код: c#
1.
2.
PmformDT.Rows.Add(PmformDR);
PmformTA.Update(PmformDR);



без

Код: c#
1.
2.
3.
PmformDT.Rows.Add(PmformDR);
PmformDT.AcceptChanges();
PmformTA.Update(PmformDR);



Продолжайте смеятся, а не доки читать
...
Рейтинг: 0 / 0
29.07.2016, 19:38
    #39283126
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VFP -> C#. SQL View -> TableAdapter
Корректор«Создание инструкции INSERT, UPDATE или DELETE не заменяет собой команды адаптера таблицы, используемые при вызове его метода Update. Например, при выборе UPDATE в качестве типа запроса создается новый запрос с именем, которое задается на более позднем шаге в мастере. Для выполнения данного запроса вы вызываете этот именованный метод адаптера таблицы. Вызов метода Updateадаптера таблицы выполняет инструкции, созданные при первоначальной настройке адаптера таблицы».
Что-то Вы не там и не то читали, наверное.
Ссылочку дайте
...
Рейтинг: 0 / 0
29.07.2016, 19:43
    #39283127
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VFP -> C#. SQL View -> TableAdapter
КорректорВ C# 2010 стоило подключить базу – автоматически сформировались адаптеры для каждой таблицы. Посмотрел опеределения – роман. Текст SQL View записулькой теперь представляется. Может, я тороплюсь, может терпения не хватает? Неужели нет средств для исчерпывающего описания связей полей источника и полей представления, что апдейтить, а чего нет. Чтобы далее использовать лишь имя представления. Неужели нельзя написать пользовательский адаптер? Тогда, правда, опять хочется спросить, вот эта куча мусора в окне классов зачем?
Автоматически сформированные адаптеры можно вполне себе перестроить, задав там свои запросы или хранимые процедуры.
Можно и пользовательский адаптер сделать.
...
Рейтинг: 0 / 0
02.08.2016, 10:59
    #39284408
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VFP -> C#. SQL View -> TableAdapter
Microsoft позиционирует три основных метода работы с данными для свзяки C# .NET MS SQL Server - connected (я использую в основном его), disconnected (Вы изучаете его) и для начинающих был создан EF (Entity framework).

При работе с disconnected approach все Ваши таблицы обязательно должны иметь Primry Key. Это поле как раз и используется для нахождения записи которая будет обновляться.

Так как Вы не определили команды Update во втором случае слкдует сделать это автоматически:

Код: c#
1.
2.
SqlDataAdapter dAdapt = new SqlDataAdapter("SELECT * FROM Pmform", cnString);
SqlCommandBuilder builder = new SqlCommandBuilder(dAdapt);



Два замечания - SQL select command должна быть общей. SqlCommandBuilder автоматически генерирует команды INSERT, UPDATE или DELETE (при наличии Primary Key в Вашей таблице).

Примерно так.

P.S. Я перестал использовать disconnect приём для работы с данными довольно, так как я предопчитаю полный контроль над данными + работв только с SP. Как следствие - быстрота разработки даже простых приложений довольно высокая, намного легче исправлять ошибки и оптимизировать работу с данными особенно для высоконагруженых систем... Аналогичный способ работы с данными я использовал и в связке VFP + Oracle (connected).

Good luck!
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VFP -> C#. SQL View -> TableAdapter / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]