Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1161938497
Krants
2006-10-27 12:41
2006.12.10
PopupMenu и Hint


15-1164140145
Jolik
2006-11-21 23:15
2006.12.10
Посоветуйте книгу по Delphi 2006...


2-1164269566
IGo
2006-11-23 11:12
2006.12.10
Пронрамное создание элемента CheckBox


15-1163744578
@Ujin
2006-11-17 09:22
2006.12.10
Кто-нибудь натыкался на исходники paxScript?


2-1164206206
REA
2006-11-22 17:36
2006.12.10
Как обменять два TListItem?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский