Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Проблемы с adapter.Update(dataSet, tableName);


Автор: gfmail 23.1.2007, 10:36
Данный пример взят из МСДН, только параметры функции заменены реальными значениями.
При выполнении: "Ошибка синтаксиса в инструкции 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.

Автор: NET_or_not_NET 23.1.2007, 14:51
Доброго времени суток!

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();


Проверял, у меня работает

Автор: gfmail 23.1.2007, 18:31
Код

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



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

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

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

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


А если вопрос почему пример из МСДНа не работает, так это не первый и не последний которые не работают. 

Автор: gfmail 25.1.2007, 09:27
Re:
Цитата

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


Буду очень благодарен. smile 

Автор: NET_or_not_NET 25.1.2007, 10:48
Выслал на мыло 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();
            }            
        }


Удачи!

Автор: gfmail 25.1.2007, 11:33
Спасибо, этот пример работает, а с моим что-то не то smile . Видимо проблема в базе(хотя там всего две не связанные таблицы с ключевыми полями).

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

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

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

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

Автор: mr.DUDA 25.1.2007, 13:42
Судя по скрину, параметры передать в команду INSERT забыли (пресловутые "вопросы").

Автор: NET_or_not_NET 25.1.2007, 14:05
Теперь уж точно будет работать  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 

Автор: gfmail 25.1.2007, 14:18
Ура, заработало!!! smile  smile  smile 
Большое спасибо NET_or_not_NET!!!, сам бы никогда не догадался(только начал работать с базами).

Автор: NET_or_not_NET 25.1.2007, 14:35
Был рад помочь!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)