Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизКак добавить запись в таблицу через ADO? Найти похожие ветки
← →
Pavor © (2006-11-23 08:51) [0]Приветствую, уважаемые профессионалы.
Понимаю, тупой вопрос, однако не получается.
Делаю так:
//Добавляем запись в конец таблицы
ADOTable1.Append;
//Заполняем поля
ADOTable1.FieldValues["Letter"]:=AddEditClient.LetterCombo.Text;
// и т. д.
//....
//Сохраняем изменения
ADOTable1.Post;
В результате количество записей остается прежним, сообщений об ошибках нет.
В DBGrid все отображается нормально (одна запись, которая есть).
Подскажите, плиз, как это делается.
И, если можно - где можно прочитать про ADO подробнее,
← →
Elen © (2006-11-23 09:21) [1]
> Pavor
И тебе доброго утречка. А каким провайдерком пользуеш?
← →
Pavor © (2006-11-23 09:27) [2]> Elen
Provider=Microsoft.Jet.OLEDB.4.0;
← →
Megabyte © (2006-11-23 09:58) [3]1) БД, я так понимаю, Access;
2) Выкинь нафиг ADOTable;
3) AddEditClient - это что за компонент?
← →
Pavor © (2006-11-23 10:04) [4]> Megabyte
1) Да, Access.
2) А что тогда -- ADOQuery?
3) AddEditClient - это форма такая, в нее данные вводятся для последующего занесения в БД. :)
← →
Anatoly Podgoretsky © (2006-11-23 10:08) [5]> Pavor (23.11.2006 10:04:04) [4]
2. Делать всегда, а не только с Акцессом и не ADOQuery, а AdoDataset (ADOQuery тоже выкинуть навсегда вместе с AdoTable и AdoStoredProc).
← →
Gloomer © (2006-11-23 10:09) [6]У ADOTable при работе с Access свойство CursorType=ctStatic
Может добавляешь запись в таблицу ADOTable1, а отображаешь данные из таблицы ADOTableХХ???
Requery тебе в помощь
← →
Pavor © (2006-11-23 10:15) [7]> Gloomer
Спасибо, но таблица у меня только одна
← →
Pavor © (2006-11-23 10:16) [8]Уже выкинул ADOTable, посмотрим, что там с ADODataSet...
← →
ЮЮ © (2006-11-23 11:22) [9]
> В результате количество записей остается прежним,
Может фильтр включен и запись отфильтровало?
Или в гриде смотришь не не ADOTable1?
Иначе бы она появилась. В гриде. Независимо от того, записалась бы она в базе или нет. Ибо Append и Post (чаще всего) касаются локального DataSeta.
← →
Pavor © (2006-11-23 12:00) [10]Люди, с 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.
Может, я как-нибудь к базе коннектюсь не так?
← →
Pavor © (2006-11-23 12:03) [11]На форме присутствуют:
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.
← →
ЮЮ © (2006-11-23 12:09) [12]1) ADODataSet реклмендовали вмето ADOTable lдля просмотра данных. Втвка все теми же методами: Append, Post
2) Для вставки SQL-запросом следует уже использлвать ADOCommand. Вот после такой вставки запись уж точно не отобразится в ADODataSet без переоткрытия
3) При такой вставке запрос должен придерживаться синтаксиса серевера/провайдера. В Accese символьные константы обрамляются ", а не ", ИМХО. Для символьных полей и дат лучше использовать параметры. Да и для float, если использовать FloaToStr.
← →
Anatoly Podgoretsky © (2006-11-23 12:09) [13]> Pavor (23.11.2006 12:00:10) [10]
А зачем ты для запроса не возвращающего набор записей используешь ADODataSet, когда надо использовать TAdoCommand
← →
Pavor © (2006-11-23 12:22) [14]
> А зачем ты для запроса не возвращающего набор записей используешь
> ADODataSet, когда надо использовать TAdoCommand
Потому, что туплю :)
Спасибо, наконец-то смог вставить первую запись за день ;)
← →
sniknik © (2006-11-23 12:35) [15]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-у пофигу, он и то и то понимает.
← →
sniknik © (2006-11-23 12:37) [16]блин, точки пропустил :(, ну и ладно.
← →
Pavor © (2006-11-23 13:02) [17]> sniknik
Спасибо, так я еще не пробовал :)
← →
Pavor © (2006-11-23 13:49) [18]> sniknik
Так тоже работает, спасибо... :)
← →
Pavor © (2006-11-23 14:51) [19]Хммм..
Вот так работает нормально (заполнял только два поля):
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"+
" )";
← →
sniknik © (2006-11-23 15:24) [20]вот поэтому и нужно использовать параметры, чтобы избегать подобных неприятностей, про что сказал в [15].
вставленный в запрос текст становится частью запроса, и должен вставляться с учетом этого, не портить синтаксис (что зависит от значений)... с параметрами проще, а учесть еще что работает быстрее... все, по другому и пытаться не стоит.
p.s. Position проверь, может быть (очень похоже) на зарезервированное слово. можно просто в скобки [] взять.
← →
Barabashka (2006-11-23 15:31) [21]Удалено модератором
← →
Pavor © (2006-11-24 06:48) [22]> sniknik
Точно, теперь работает!
Большое спасибо.INSERT INTO Clients (Name, Phone, Email, Site, Address, Comment, Fax, Letter, [Position], Organization, ICQ, CellPhone, ImageIndex)
и далее по тексту
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.046 c