Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с adapter.Update(dataSet, tableName); пример из МСДН не работает 
V
    Опции темы
gfmail
Дата 23.1.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 8.7.2006

Репутация: нет
Всего: нет



Данный пример взят из МСДН, только параметры функции заменены реальными значениями.
При выполнении: "Ошибка синтаксиса в инструкции INSERT INTO."
Кажется мне, что OleDbCommandBuilder не генерирует InsertCommand, а вот почему - не пойму.
Подскажите, пожалуйста, кто знает.
Код

   public static DataSet UpdateRows()
        {
            DataRow row;
            string message = "HELLO, WORLD";
            string connectionString = 
                "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\\____PABOTA\\DATABASE\\Chat.mdb";
            string queryString = "SELECT * FROM Messages";
            string tableName = "Messages";
            DataSet dataSet = new DataSet();
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                adapter.SelectCommand = new OleDbCommand(queryString, connection);
                OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);

                connection.Open();

                adapter.Fill(dataSet, tableName);

                //code to modify data in DataSet here
                row = dataSet.Tables[tableName].NewRow();

                row[0] = DateTime.Now;
                row[1] = "gfmail";
                row[2] = message;

                dataSet.Tables[tableName].Rows.Add(row);

                cb.GetDeleteCommand();
                cb.GetInsertCommand();
                cb.GetUpdateCommand();
                //Without the OleDbCommandBuilder this line would fail
                adapter.Update(dataSet, tableName);

                connection.Close();
            }
            return dataSet;
        }



P.S.
Может проблема описана здесь?//мсдн
The OleDbCommandBuilder also uses the Connection, CommandTimeout, and Transaction properties referenced by the SelectCommand. The user should call RefreshSchema if one or more of these properties are modified, or if the SelectCommand itself is replaced. Otherwise the InsertCommand, UpdateCommand, and DeleteCommand properties retain their previous values.
PM MAIL ICQ   Вверх
NET_or_not_NET
Дата 23.1.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: 1
Всего: 1



Доброго времени суток!

gfmail
Цитата

Кажется мне, что OleDbCommandBuilder не генерирует InsertCommand, а вот почему - не пойму.


На самом деле генерирует. но по непонятной мне причине в примере указано

Код

cb.GetDeleteCommand();
cb.GetInsertCommand();
cb.GetUpdateCommand();


все эти Get'ы возвращают OleDbCommand, поэтому эти команды надо как-то выполнить...
т.е. мы передадим эти команды соответствующим в adapterе

По аналогии с примером
Цитата

adapter.SelectCommand = new OleDbCommand(queryString, connection);


пишем следующее:
Код

adapter.InsertCommand = cb.GetInsertCommand();
adapter.UpdateCommand = cb.GetUpdateCommand();


Проверял, у меня работает
PM MAIL   Вверх
gfmail
Дата 23.1.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 8.7.2006

Репутация: нет
Всего: нет



Код

adapter.InsertCommand = cb.GetInsertCommand();
adapter.UpdateCommand = cb.GetUpdateCommand();



Так я делал сам, и результат был аналогичным, поэтому взял пример с мсдн.
PM MAIL ICQ   Вверх
NET_or_not_NET
Дата 23.1.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: 1
Всего: 1



поставте брейк поинт на cb.GetInsertCommand(); 
и посмотрите что там за запрос, может проблема с именем таблицы
если можно выложите запрос который сгенерировал adapter

могу выслать свой пример, но он будет всеравно содержать
Код

dapter.InsertCommand = cb.GetInsertCommand();
adapter.UpdateCommand = cb.GetUpdateCommand();


А если вопрос почему пример из МСДНа не работает, так это не первый и не последний которые не работают. 
PM MAIL   Вверх
gfmail
Дата 25.1.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 8.7.2006

Репутация: нет
Всего: нет



Re:
Цитата

могу выслать свой пример, но он будет всеравно содержать


Буду очень благодарен. smile 
PM MAIL ICQ   Вверх
NET_or_not_NET
Дата 25.1.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: 1
Всего: 1



Выслал на мыло test.rar и выкладываю сюда

Для работы кода необходима БД из MS Access "Борей.mdb" в моем примере она находиться в корне диска D:\
все операции будут проводятся с таблицей "Клиенты", дальше на форму кнопку Button1 и событие OnClick 

Код

private void button1_Click(object sender, EventArgs e)
        {
            DataRow row;
            string message = "HELLO, WORLD";
            string connectionString =
                "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\\Борей.mdb";
            string queryString = "SELECT * FROM Клиенты";
            string tableName = "Messages";
            DataSet dataSet = new DataSet();
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                adapter.SelectCommand = new OleDbCommand(queryString, connection);
                OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
                connection.Open();
                adapter.Fill(dataSet, tableName);
                //code to modify data in DataSet here
                row = dataSet.Tables[tableName].NewRow();
                row[0] = "ZZZZZ";
                row[1] = "Bla Bla Bla";
                row[2] = message;
                dataSet.Tables[tableName].Rows.Add(row);
                dataGridView1.DataSource = dataSet.Tables[tableName];

                
                adapter.DeleteCommand = cb.GetDeleteCommand();
                adapter.InsertCommand = cb.GetInsertCommand();
                adapter.UpdateCommand =  cb.GetUpdateCommand();

                //  Кстати я проверял так тоже РАБОТАЕТ!!!!
                //cb.GetDeleteCommand();
                //cb.GetInsertCommand();
                //cb.GetUpdateCommand();

                //Without the OleDbCommandBuilder this line would fail
                adapter.Update(dataSet, tableName);
                connection.Close();
            }            
        }


Удачи!
PM MAIL   Вверх
gfmail
Дата 25.1.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 8.7.2006

Репутация: нет
Всего: нет



Спасибо, этот пример работает, а с моим что-то не то smile . Видимо проблема в базе(хотя там всего две не связанные таблицы с ключевыми полями).
PM MAIL ICQ   Вверх
gfmail
Дата 25.1.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 8.7.2006

Репутация: нет
Всего: нет



Изменил высланный проект под свою базу, и получаю ошибку : 

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: Ошибка синтаксиса в инструкции INSERT INTO.

На скрине текст команды.

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  db.jpg 16,02 Kb
PM MAIL ICQ   Вверх
mr.DUDA
Дата 25.1.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Судя по скрину, параметры передать в команду INSERT забыли (пресловутые "вопросы").


--------------------
user posted image
PM MAIL WWW   Вверх
NET_or_not_NET
Дата 25.1.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: 1
Всего: 1



Теперь уж точно будет работать  smile 

если я правильно понимаю у Вас в БД в той таблицы куда Вы записываете 
есть поля Time, Login, Message 
я создал свою БД с идентичной таблицей

запустил код.... и правда НЕ РАБОТАЕТ!!!  smile 

ошибка в следующем: GetInsertCommand() генерирует запрос 
Код

INSERT INTO MessagesTable (Time, Login, Message) VALUES (?, ?, ?)


Я не работаю с MS Access и поэтому не знаю как правильно это назвать, но
 Time это зарегистрированное слово или функция или тип. поэтому запрос в должен быть:

Код

INSERT INTO MessagesTable ([Time], Login, Message) VALUES (?, ?, ?)


Time надо взять в []

Мой совет переименуйте поле Time в своей таблице например на DT (сокращенно от DataTime)
или на что угодно (кроме зарегистрированных) и все получиться!!!  smile 
PM MAIL   Вверх
gfmail
Дата 25.1.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 8.7.2006

Репутация: нет
Всего: нет



Ура, заработало!!! smile  smile  smile 
Большое спасибо NET_or_not_NET!!!, сам бы никогда не догадался(только начал работать с базами).
PM MAIL ICQ   Вверх
NET_or_not_NET
Дата 25.1.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: 1
Всего: 1



Был рад помочь!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.