powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / не отрабатыват CommandBuilder.GetUpdateCommand
3 сообщений из 3, страница 1 из 1
не отрабатыват CommandBuilder.GetUpdateCommand
    #36341532
Artemus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

Подскажите, пожалуйста, как правильно сделать UPDATE изменений в этой ситуации, когда используются 3 таблицы в одном запросе.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
            string query = @"SELECT r.name, m.is_enabled
                               FROM managers_rules m
                                  , manager_authentication ma
                                  , rules r
                              WHERE ma.manager_login = '" + _managerName + "'" +
                              @"AND m.manager_ID = ma.manager_ID
                                AND m.rule_ID = r.rule_ID;";
            _DataAdapter = new SqlDataAdapter(query, ControlPanel.ConnectionString);

            SqlCommandBuilder _CommandBuilder = new SqlCommandBuilder(_DataAdapter);

            _DataAdapter.UpdateCommand = _CommandBuilder.GetUpdateCommand();


            _DataSet = new DataSet();
            _DataAdapter.Fill(_DataSet);
            commonDataGridView.DataSource = new BindingSource(_DataSet, "Table");
            commonDataGridView.Columns[0].HeaderText = "Объекты";
            commonDataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            commonDataGridView.Columns[0].ReadOnly = true;
            commonDataGridView.Columns[1].HeaderText = "Редактирование";

На этом шаге -
Код: plaintext
_DataAdapter.UpdateCommand = _CommandBuilder.GetUpdateCommand();
Высвечивает ошибку -
"Dynamic SQL generation is not supported against multiple base tables."

Может я просто не ту стратегию выбрал для моего случая.
...
Рейтинг: 0 / 0
не отрабатыват CommandBuilder.GetUpdateCommand
    #36342399
maestro_skl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я знаю, SqlCommandBuilder работает только с одной таблицей, о чем он вам и написал(Dynamic SQL generation is not supported against multiple base tables.).
Тут вам придется руками заполнять UpdateCommand, InsertCommand, DeleteCommand.
...
Рейтинг: 0 / 0
не отрабатыват CommandBuilder.GetUpdateCommand
    #36343989
Artemus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я решил проблему так - разбил запрос на 3 и всё делаю отдельно

Код: plaintext
1.
2.
3.
4.
5.
6.
            string query = @"SELECT r.name, m.is_enabled
                               FROM managers_rules m
                                  , manager_authentication ma
                                  , rules r
                              WHERE ma.manager_login = '" + _managerName + "'" +
                              @"AND m.manager_ID = ma.manager_ID
                                AND m.rule_ID = r.rule_ID;";

вот как это выглядит -

Код: plaintext
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.
            SqlConnection dbConnection = new SqlConnection(ControlPanel.ConnectionString);

            SqlCommand command = new SqlCommand();
            command.Connection = dbConnection;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "p_GetManagerIDFromLogin";

            command.Parameters.Add("@managerLogin", SqlDbType.NVarChar).Direction = ParameterDirection.Input;
            command.Parameters["@managerLogin"].Value = _managerName;

            dbConnection.Open();
            IAsyncResult nIAsyncResult = command.BeginExecuteReader();
            SqlDataReader reader = command.EndExecuteReader(nIAsyncResult);

            int manager_ID = 0;
            while (reader.Read())
                manager_ID = Convert.ToInt32(reader["manager_ID"]);

            reader.Close();

            command.Parameters.Clear();
            command.CommandText = "p_GetRuleList";
            nIAsyncResult = command.BeginExecuteReader();
            reader = command.EndExecuteReader(nIAsyncResult);

            string query = @"SELECT m.manager_ID, m.rule_ID, m.is_enabled
                               FROM managers_rules m
                              WHERE m.manager_ID = " + Convert.ToString(manager_ID) +
                            @"ORDER BY rule_ID;";
            _DataAdapter = new SqlDataAdapter(query, ControlPanel.ConnectionString);

            SqlCommandBuilder _CommandBuilder = new SqlCommandBuilder(_DataAdapter);

            _DataAdapter.UpdateCommand = _CommandBuilder.GetUpdateCommand();


            _DataSet = new DataSet();
            _DataAdapter.Fill(_DataSet);
            commonDataGridView.DataSource = new BindingSource(_DataSet, "Table");
            commonDataGridView.Columns[0].HeaderText = "Объекты";
            commonDataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            commonDataGridView.Columns[0].ReadOnly = true;
            commonDataGridView.Columns[1].Visible = false;
            commonDataGridView.Columns[2].Visible = false;
            commonDataGridView.Columns[3].HeaderText = "Редактирование";

            int i = 0;
            while (reader.Read())
            {
                commonDataGridView.Rows[i].Cells[0].Value = Convert.ToString(reader["name"]);
                i++;
            }
т.е. сначала с помощью хранимой процедуры узнал manager_ID и подставил её в главную выборку, и отдельно выбрал из справочка подписи к строкам. И сохраняется без проблем в результате, т.к. выборка из одной таблицы.

maestro_skl
Насколько я знаю, SqlCommandBuilder работает только с одной таблицей, о чем он вам и написал(Dynamic SQL generation is not supported against multiple base tables.).
Тут вам придется руками заполнять UpdateCommand, InsertCommand, DeleteCommand.
Не могли бы подробнее сказать что нужно заполнить в UpdateCommand? Вообще должны были бы сформироваться такие UPDATEы-

Код: plaintext
1.
2.
3.
UPDATE managers_rules
   SET is_enabled = *новое значение*
WHERE manager_ID = @manager_ID
  AND rule_ID = @rule_ID;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / не отрабатыват CommandBuilder.GetUpdateCommand
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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