Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Как добавить запись в таблицу через 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.045 c
15-1163815002
Tirael
2006-11-18 04:56
2006.12.10
готов признать что вы крутые программеры


3-1159861658
Itonix
2006-10-03 11:47
2006.12.10
Два запроса


2-1164362132
TIF
2006-11-24 12:55
2006.12.10
Глубокоуважаемый штрих код


15-1164004463
pssst
2006-11-20 09:34
2006.12.10
win 2003


8-1145057895
Vitalyrus
2006-04-15 03:38
2006.12.10
Маштабирование Канваса