Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/74: Рейтинг темы: голосов - 74, средняя оценка - 4.91
1449 / 357 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
1

Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей.

11.09.2011, 15:03. Показов 14941. Ответов 13
Метки нет (Все метки)

Добрый ночь! Возникла такая проблема. Вот код.
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
SqlConnectionStringBuilder bu = new SqlConnectionStringBuilder();
SqlDataAdapter adap;
SqlCommandBuilder cmdb;
DataSet ds;
bu.UserID = "sa";
bu.InitialCatalog = "Message";
bu.IntegratedSecurity = true;
bu.DataSource = "????\\????";
            
adap = new SqlDataAdapter("Select * From Post", bu.ConnectionString);
cmdb = new SqlCommandBuilder(adap);
ds = new DataSet();
            
adap.Fill(ds, "Message");
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
{
    Add(ds.Tables[0].Columns[i].ColumnName.Trim(), i); //Add это добовление в таблицу. 
}
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
   for (int x = 0; x < ds.Tables[0].Columns.Count; x++)
       Add(ds.Tables[0].Rows[i][x].ToString(), x);
}
 
ds.Tables[0].Rows[i][x] =  "Hello";
 
// теперь для сохранения в базу, пишу 
adap.Update(ds, "Message");
// но вылетает ошибка исключения
//Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей.
//Даже пробовал писать вместо adap.Update(ds, "Message");
SqlCommand cmd = new SqlCommand();
cmd = cmdb.GetUpdateCommand();
cmd.ExecuteNonQuery();
//Та же самая ошибка
Прошу за какую нибудь подсказку. За ранее спасибо.

Добавлено через 11 часов 49 минут
Точно никто не знает в чем дело? Очень надо, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2011, 15:03
Ответы с готовыми решениями:

Ошибка "Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей."
Может кто нибудь знает из-за чего может возникать такая ошибка &quot;Динамическое создание SQL для...

Динамическое создание SQL не поддерживается для SelectCommand, не возвращающей сведений о столбце ключей
При подключении базы данных в проект возникает ошибка, Динамическое создание SQL для UpdateCommand...

Динамическое создание SQL для DeleteCommand (UpdateCommand) не поддерживается
После редактирование(UpdateCommand) или удаления(DeleteCommand) строки выдает ошибку(скрин...

Как сгенерировать код для UpdateCommand SQL Server?
Здравствуйте. Visual Studio 2017 не хочет генерировать UPDATECOMMAND автоматически при подключении...

13
6242 / 3543 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
11.09.2011, 16:09 2
У Вас нету запроса на обновление.
1
1449 / 357 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
11.09.2011, 17:44  [ТС] 3
Петррр, В смысле запроса? Поясните пожалуйста.
0
6242 / 3543 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
11.09.2011, 17:51 4
Запрос на выборку:
SQL
1
SELECT * FROM Post
Запрос на обновление:
SQL
1
UPDATE Post SET ...
Запрос на вставку:
SQL
1
INSERT INTO Post(Field1, Fielld2..) VALUES(Value1, Value2..)
Запрос на уделение:
SQL
1
DELETE FROM post WHERE условие удаления...
1
1449 / 357 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
11.09.2011, 18:43  [ТС] 5
Петррр, Значит все таки мне надо писать вместо
C#
1
2
ds.Tables[0].Rows[i][x] =  "Hello";
adap.Update(ds, "Message");
вот так
C#
1
2
SqlCommand cmd = new SqlCommand("INSERT INTO Post(Field1, Fielld2..) VALUES(Value1, Value2..)", cn);
            cmd.ExecuteNonQuery();
Значит DataSet лишь получает данные, но не сохраняет?
0
6242 / 3543 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
11.09.2011, 19:07 6
Нет. DataSet как раз и занимается хранением данных. DataSet - это набор таблиц в оперативной памяти. Udapter занимается получением данных и обновлением из в источнике данных. У адаптеров данных есть для каждого запроса соответствующее свойство: UpdateCommand, SelectCommand, DeleteCommand, InsertCommand. В данном случае Вы все писали кодом, поэтому кроме SelectCommand у Вас ничего нет. Если Вы кинете компонент на форму, то появится диалоговое окно, где нужно будет выбрать БД, сделать select запрос и тогда Visual Studio сформирует все остальные запросы сама. В запросе должна быть только одна таблица, если будут соединения, то VS не сможет сформировать остальные запросы.
2
1449 / 357 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
11.09.2011, 19:16  [ТС] 7
Петррр, У меня консоль. Компонентов кинуть не получиться. Скажите пожалуйста, если не трудно. Как реализовать этот UpdateCommand? Просто я мало знаком с БД.
0
6242 / 3543 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
11.09.2011, 19:30 8
Создаешь оконное приложение. Проделываешь все то, что я написал в своем предыдущем посте. Затем копируешь код созданный VS и вставляешь в свою консоль.
1
1449 / 357 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
11.09.2011, 23:30  [ТС] 9
Петррр, Извините, но я сегодня очень торможу. Я поставил компонент DataAdapter и сгенирировал DataSet. Появились новые файлы где был файл *.cs, но там слишком много кода и он жестко закодирован, но моя программа должна уметь работать с многими базами, а не с одной, путем жесткого кода.
0
332 / 268 / 18
Регистрация: 19.01.2011
Сообщений: 597
12.09.2011, 10:40 10
Судя по Вашему коду (SqlCommandBuilder+select * from...) у Вас все запросы должны строиться, но! По тексту Вашей ошибки - в наборе записей, которые вернул select * from ... нет ключевого поля (Primary Key,Uniq, еще как... ). Стоит добавить его в источник данных для автоматической генерации запроса Update и проверить свой код еще раз. Если же ключевое поле невозможно добавить - необходимо руками написать такой запрос и присвоить его UpdateCommand, и уже после этого делать adap.Update.

Так же не смог понять что делает код
C#
1
2
3
4
5
6
7
8
9
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
{
    Add(ds.Tables[0].Columns[i].ColumnName.Trim(), i); //Add это добовление в таблицу. 
}
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
   for (int x = 0; x < ds.Tables[0].Columns.Count; x++)
       Add(ds.Tables[0].Rows[i][x].ToString(), x);
}
....
0
1449 / 357 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
12.09.2011, 22:31  [ТС] 11
Цитата Сообщение от Winsor Посмотреть сообщение
Судя по Вашему коду (SqlCommandBuilder+select * from...) у Вас все запросы должны строиться, но! По тексту Вашей ошибки - в наборе записей, которые вернул select * from ... нет ключевого поля (Primary Key,Uniq, еще как... ). Стоит добавить его в источник данных для автоматической генерации запроса Update и проверить свой код еще раз. Если же ключевое поле невозможно добавить - необходимо руками написать такой запрос и присвоить его UpdateCommand, и уже после этого делать adap.Update.
Ладно, хорошо. Спасибо. Только я никогда не работал с базой данных под средством компонентов Windows Form. Скажите, генерировать запрос надо с помощью DataAdapter? Потом смотреть в созданном файле *.cs?
0
6 / 6 / 2
Регистрация: 20.01.2015
Сообщений: 67
25.06.2015, 09:00 12
Попробуйте в базе данных в таблице установить ключевое поле.
1
0 / 0 / 0
Регистрация: 20.12.2019
Сообщений: 96
05.03.2021, 16:27 13
Цитата Сообщение от IvanSh Посмотреть сообщение
Попробуйте в базе данных в таблице установить ключевое поле.
Да именно первичный ключ решил проблему
0
Эксперт .NET
9308 / 6674 / 1077
Регистрация: 21.01.2016
Сообщений: 25,096
05.03.2021, 17:07 14
gena8208, проблема не в этом, а в использовании SqlDataAdapter. Этот механизм устарел лет пятнадцать назад.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2021, 17:07

Создание класса-контейнера для SP, возвращающей несколько НД
Здравствуйте ! Есть хранимка, возвращающая два НД. Первый - телефонная книга, Второй -...

Создание рекурсивной функции, возвращающей значение для вычисления наибольшего размера в одномерном массиве
сем доброго времени суток. Собственно сама задача: Разработать рекурсивную функцию возвращающую...

Создание ключей для массива. Использование файла
Доброго времени суток. Представим, что у нас есть файл Нужно получить ассоциативный...

Создание внешних ключей в SQL server management studio
Уважаемые Гуру! При работе с MySQL в dbForge studio удобный графический редактор связей между...

При вводе ключей (для всех команд /?, для sort /r, для dir /o:s /a:-d /o:n) программа вылетает
Всем доброго времени суток, исправьте пжл ошибку в коде. program os_cmd; uses windows,crt,dos;...

Динамическое создание типа для коллекции
Здравствуйте! Есть такая задумка, но не знаю как реализовать. Файл электронной таблицы, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.