![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как добавить запись в таблицу через ADO? [D7, XP]
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 - это что за компонент?