Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как добавить запись в таблицу через ADO? [D7, XP]


Страницы:   1 2

Pavor ©   (2006-11-23 08:51:00) 

Приветствую, уважаемые профессионалы.
Понимаю, тупой вопрос, однако не получается.

Делаю так:


//Добавляем запись в конец таблицы
ADOTable1.Append;
//Заполняем поля
ADOTable1.FieldValues['Letter']:=AddEditClient.LetterCombo.Text;
// и т. д.
//....
//Сохраняем изменения
ADOTable1.Post;


В результате количество записей остается прежним, сообщений об ошибках нет.
В DBGrid все отображается нормально (одна запись, которая есть).

Подскажите, плиз, как это делается.
И, если можно - где можно прочитать про ADO подробнее,


Pavor   (2006-11-24 06:48:00) [1]

> sniknik

Точно, теперь работает!
Большое спасибо.

INSERT INTO Clients (Name, Phone, Email, Site, Address, Comment, Fax, Letter, [Position], Organization, ICQ, CellPhone, ImageIndex)
и далее по тексту


Barabashka   (2006-11-23 15:31:00) [2]

Удалено модератором


sniknik   (2006-11-23 15:24:00) [3]

вот поэтому и нужно использовать параметры, чтобы избегать подобных неприятностей, про что сказал в [15].
вставленный в запрос текст становится частью запроса, и должен вставляться с учетом этого, не портить синтаксис (что зависит от значений)... с параметрами проще, а учесть еще что работает быстрее... все, по другому и пытаться не стоит.

p.s. Position проверь, может быть (очень похоже) на зарезервированное слово. можно просто в скобки [] взять.


Pavor   (2006-11-23 14:51:00) [4]

Хммм..
Вот так работает нормально (заполнял только два поля):


ADOCommand.CommandType:=cmdText;
ADOCommand.CommandText:='INSERT INTO Clients (Name, Letter) VALUES ('+QuotedStr(AddEditClient.NameEdit.Text)+','+QuotedStr(AddEditClient.LetterCombo.Text)+')';

ADOCommand.Execute;


Работает замечательно.
Как остальные поля стал заполнять, так ошибку выдает:
---------------------------
Debugger Exception Notification
---------------------------
Project ClientBase.exe raised exception class EOleException with message 'Ошибка синтаксиса в инструкции INSERT INTO'. Process stopped. Use Step or Run to continue.


Ведь то же самое все, только параметров больше (все строковые, последний - целое число)
ADOCommand.CommandType:=cmdText;
ADOCommand.CommandText:='INSERT INTO Clients (Name, Phone, Email, Site, Address, Comment, Fax, Letter, Position, Organization, ICQ, CellPhone, ImageIndex) '+
'VALUES ('+
QuotedStr(AddEditClient.NameEdit.Text)+','+
QuotedStr(AddEditClient.PhoneEdit.Text)+','+
QuotedStr(AddEditClient.EmailEdit.Text)+','+
QuotedStr(AddEditClient.SiteEdit.Text)+','+
QuotedStr(AddEditClient.AddressMemo.Text)+','+
QuotedStr(AddEditClient.CommentMemo.Text)+','+
QuotedStr(AddEditClient.FaxEdit.Text)+','+
QuotedStr(AddEditClient.LetterCombo.Text)+','+
QuotedStr(AddEditClient.PositionEdit.Text)+','+
QuotedStr(AddEditClient.OrganizationEdit.Text)+','+
QuotedStr(AddEditClient.ICQEdit.Text)+','+
QuotedStr(AddEditClient.CellEdit.Text)+','+
'0'+
' )';


Pavor   (2006-11-23 13:49:00) [5]

> sniknik

Так тоже работает, спасибо... :)


Pavor   (2006-11-23 13:02:00) [6]

> sniknik

Спасибо, так я еще не пробовал :)


sniknik   (2006-11-23 12:37:00) [7]

блин, точки пропустил :(, ну и ладно.


sniknik   (2006-11-23 12:35:00) [8]

Pavor ©   (23.11.06 12:00) [10]
Pavor ©   (23.11.06 12:03) [11]

ConnectionString= 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\D7Projects\Clients\clients.mdb;Persist Security Info=False';
этого хватит

with ADODataSet do  begin
 Close;
 CommandText:= 'SELECT * FROM Clients';
 Open;
end;
открыли таблицу полностью для показа (с таким запросом это аналог адотабле)

и как нибудь потом
with ADODataSet do  begin
 Append;
 FieldByName('Name')asString:= AddEditClient.NameEdit.Text;
 FieldByName('Letter')asString:= AddEditClient.LetterCombo.Text;
 Post;
end;
добавили с одновременным показом добавленного.

если показывать не нужно то запросом с использованием TAdoCommand и параметров для текста (позволяют избежать разных неприятностей + работает быстрее)

ЮЮ ©   (23.11.06 12:09) [12]
> В Accese символьные константы обрамляются ", а не ', ИМХО
Jet-у пофигу, он и то и то понимает.


Pavor   (2006-11-23 12:22:00) [9]


> А зачем ты для запроса не возвращающего набор записей используешь
> ADODataSet, когда надо использовать TAdoCommand

Потому, что туплю :)
Спасибо, наконец-то смог вставить первую запись за день ;)


ЮЮ   (2006-11-23 12:09:00) [10]

1) ADODataSet реклмендовали вмето ADOTable lдля просмотра данных. Втвка все теми же методами: Append, Post
2) Для вставки SQL-запросом следует уже использлвать ADOCommand. Вот после такой вставки запись уж точно не отобразится в ADODataSet без переоткрытия
3) При такой вставке запрос должен придерживаться синтаксиса серевера/провайдера. В Accese символьные константы обрамляются ", а не ', ИМХО. Для символьных полей и дат лучше использовать параметры. Да и для float, если использовать FloaToStr.


Anatoly Podgoretsky   (2006-11-23 12:09:00) [11]

> Pavor  (23.11.2006 12:00:10)  [10]

А зачем ты для запроса не возвращающего набор записей используешь ADODataSet, когда надо использовать TAdoCommand


Pavor   (2006-11-23 12:03:00) [12]

На форме присутствуют:
1. ADOConnection
ConnectionString='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=D:\D7Projects\Clients\clients.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=True;Jet OLEDB:Database Password=*****' :)

2. ADODataSet, завязан на подключение с пунктом 1.
3. DataSource, в свойстве DataSet указан пункт 2.


Pavor   (2006-11-23 12:00:00) [13]

Люди, с ADODataSet тоже не получается.
Вот такой код:

With ADODataSet do  begin
Close;
CommandType:=cmdText;
CommandText:='INSERT INTO Clients (Name, Letter) Values ('+QuotedStr(AddEditClient.NameEdit.Text)+','+QuotedStr(AddEditClient.LetterCombo.Text)+')';
Open;
end;


При выполнении выдает ошибку:
---------------------------
Debugger Exception Notification
---------------------------
Project ClientBase.exe raised exception class EOleException with message 'Current provider does not support returning multiple recordsets from a single execution'. Process stopped. Use Step or Run to continue.


Может, я как-нибудь к базе коннектюсь не так?


ЮЮ   (2006-11-23 11:22:00) [14]


> В результате количество записей остается прежним,


Может фильтр включен и запись отфильтровало?
Или в гриде смотришь не не ADOTable1?

Иначе бы она появилась. В гриде. Независимо от того, записалась бы она в базе или нет. Ибо Append и Post (чаще всего) касаются локального DataSeta.


Pavor   (2006-11-23 10:16:00) [15]

Уже выкинул ADOTable, посмотрим, что там с ADODataSet...


Pavor   (2006-11-23 10:15:00) [16]

> Gloomer
Спасибо, но таблица у меня только одна


Gloomer   (2006-11-23 10:09:00) [17]

У ADOTable при работе с Access свойство CursorType=ctStatic
Может добавляешь запись в таблицу ADOTable1, а отображаешь данные из таблицы ADOTableХХ???
Requery тебе в помощь


Anatoly Podgoretsky   (2006-11-23 10:08:00) [18]

> Pavor  (23.11.2006 10:04:04)  [4]

2. Делать всегда, а не только с Акцессом и не ADOQuery, а AdoDataset (ADOQuery тоже выкинуть навсегда вместе с AdoTable и AdoStoredProc).


Pavor   (2006-11-23 10:04:00) [19]

> Megabyte

1) Да, Access.
2) А что тогда -- ADOQuery?
3) AddEditClient - это форма такая, в нее данные вводятся для  последующего занесения в БД. :)


Megabyte   (2006-11-23 09:58:00) [20]

1) БД, я так понимаю, Access;
2) Выкинь нафиг ADOTable;
3) AddEditClient - это что за компонент?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо