Работа с ADOTable
Скажите, в чем возможная проблема
Пойти попить пивка, например.
Код в студию (это фраза звучит постоянно)
эта фраза означает, что мы не умеем читать ваши мысли.
Приведите ваш код (кусок кода).
Может тогда мы сможем понять в чем ваша проблема...
вот код загрузки, находящейся на первой форме(он у меня стабильно работает)
ADOTable1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+OD1->FileName+";Persist Security Info=False";
ADOTable1->Open();
ADOTable1->Active=true;
ADOTable1->First();
while (!ADOTable1->Eof)
{
читаем поля из бд
ADOTable1->Next();
}
}
//загружаем второую бд, расположенную на 2-ой форме
Form2->ADOTable1->Close();
Form2->ADOTable1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+OD1->FileName+";Persist Security Info=False";
Form2->ADOTable1->Open();
Form2->ADOTable1->Active=true;
Form2->ADOTable1->First();
while (!Form2->ADOTable1->Eof)
{
читаем поля из бд
Form2->ADOTable1->Next();
}
}
Далее у меня вызывается третья форма, которая вызывает функцию редактирования, расположенную во 2-ой форме.
Код этой функции редактирования ниже:
Form2->ADOTable1->First();
while (!Form2->ADOTable1->Eof)
{
читаем ключевое поле и проверяем та ли эта запись или нет
если да то
{
Form2->ADOTable1->Edit();
Form2->ADOTable1->Fields->Fields[0]->AsString="fabcd"; ВОТ ЗДЕСЬ ОН РУГАЕТСЯ
Form2->ADOTAble1->Post();
break;
}
Form2->ADOTable1->Next();
}
}
Все делается в таком вот порядке.
вот код загрузки, находящейся на первой форме(он у меня стабильно работает)
ADOTable1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+OD1->FileName+";Persist Security Info=False";
ADOTable1->Open();
ADOTable1->Active=true;
ADOTable1->First();
while (!ADOTable1->Eof)
{
читаем поля из бд
ADOTable1->Next();
}
}
//загружаем второую бд, расположенную на 2-ой форме
Form2->ADOTable1->Close();
Form2->ADOTable1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+OD1->FileName+";Persist Security Info=False";
Form2->ADOTable1->Open();
Form2->ADOTable1->Active=true;
Form2->ADOTable1->First();
while (!Form2->ADOTable1->Eof)
{
читаем поля из бд
Form2->ADOTable1->Next();
}
}
Далее у меня вызывается третья форма, которая вызывает функцию редактирования, расположенную во 2-ой форме.
Код этой функции редактирования ниже:
Form2->ADOTable1->First();
while (!Form2->ADOTable1->Eof)
{
читаем ключевое поле и проверяем та ли эта запись или нет
если да то
{
Form2->ADOTable1->Edit();
Form2->ADOTable1->Fields->Fields[0]->AsString="fabcd"; ВОТ ЗДЕСЬ ОН РУГАЕТСЯ
Form2->ADOTAble1->Post();
break;
}
Form2->ADOTable1->Next();
}
}
Все делается в таком вот порядке.
Случаем не ключевое уникальное поле правиться?
ЗЫ: после EAccessviolation что пишет?
Что именно пишет в сообщении об ошибке?
Вот то, что написано в ошибке:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00406106 in module 'Project1.exe'. Read of adress 0000024'.
Стандартный совет всем кто работает с TADOTable- не используйте этот компонент. Работайте с запросами.
Для работы с запросами служит компонент TADOQuery. Принцип работы достаточно простой. Выборка данных:
quSelect->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+OD1->FileName+";Persist Security Info=False";
String select = "Select * FROM <table>";
quSelect->SQL->Clear();
quSelect->SQL->Add(select);
quSelect->Active = true;
TDataSourse *dsSelect = new TDataSourse(this);
dsSelect->DataSet = quSelect;
DBGrid1->DataSourse = dsSelect;
выберет все данные из указанной таблицы.
Для модификации данных:
quUpdate->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+OD1->FileName+";Persist Security Info=False";
String update = "UPDATE <table> SET <field1>= :param1,<field2>= :param2 ...
WHERE <fieldid>= :paramid";
quUpdate->SQL->Clear();
quUpdate->SQL->Add(update);
quUpdate->Param->ParamByName("param1")->Value = param1;
quUpdate->Param->ParamByName("param2")->Value = param2;
....
quUpdate->Param->ParamByName("paramid")->Value = quSelect->FieldByName("fieldid")->Value;
quUpdate->ExecSQL();
delete quUpdate;
В этом примере выбираються все записи из таблицы <table>, затем (если вы используете компонент TDBGrid ) данные выбраной записи обновляються. Более подробно читайте в литературе и справке.
Перебор записей, которые выбраны из таблицы выполняеться просто:
while(!quSelect->Eof){
if(quSelect->FieldByName("somefields")->Value == somevalue){
....
//
}
quSelect->Next();
}
Если вы работаете с DBGrid - этого делать ненужно.
Если нужно выбрать определенную запись по параметру используйте Locate - пример подробно описан в справке.
Более подробно напишу в ФАКе когда будет время.
З.Ы. [COLOR="Red"]Код не проверялся и не тестировался - все переменные и значения вида somefields, а так же расположенные в угловых скобках, параметры, названия таблиц и пр. надо заменить своими конкретными значениями.[/COLOR]
TADOQuery *quUpdate = new TADOQuery(this);
quUpdate->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+OD1->FileName+";Persist Security Info=False";
String update = "UPDATE <derig> SET <Имя>=:Коля,<Отчестов>=:Петрович, WHERE <Фамилия>=:Семенов";
quUpdate->SQL->Clear();
quUpdate->SQL->Add(update);
quUpdate->Parameters->ParamByName("Коля")->Value = "eprs";
quUpdate->Parameters->ParamByName("Петровия")->Value ="ывава";
quUpdate->Parameters->ParamByName("Семенов")->Value ="dfsdg";
quUpdate->ExecSQL();
delete quUpdate;
Поле Фамилия у меня ключевое.
Но мне как раз нужно изменить и ключевое поле, как это сделать?????
Но мне как раз нужно изменить и ключевое поле, как это сделать?????
Проверить на отсутсвие совпадений с теми данными что хотите ввести в ключевое поле
при условии если запрос выдаст > 0 использовать
иначе
Во вторых - апдейт в таком случае выполняется так же как и на остальные поля:
короме того - не используйте русские имена и <> - это стандартное обозначение того, что здесь вам надо подставить свое значение.
А вот про изменение ключевого поля, написал этот код, но результат нуливой
quUpdate->SQL->Clear();
quUpdate->SQL->Add(update);
quUpdate->Parameters->ParamByName("Семенов")->Value="Семеновfff";
quUpdate->ExecSQL();
По разному менял значение после SET Фамилия=: , но все равно не выходит
quUpdate->SQL->Clear();
quUpdate->SQL->Add(update);
quUpdate->Parameters->ParamByName("@new_name")->Value = "Семеновfff";
quUpdate->Parameters->ParamByName("@old_name")->Value = "Семенов";
quUpdate->ExecSQL();
...
Да в разных базах по разному вобщета - с акцессом вроде должно с двоеточием работать - хз, я предполагаю что человек способен нажать на клавишу Ф1 и посмотреть как что и почему.
З.Ы. Кроме того, топикстартеру рекомендую ознакомиться с правилами топика - а то мне быстро надоест быть добрым. В конце концов, материала по языку SQL в сети более чем достаточно.
она нужна только для парвметров ХП в MS SQL server
VCL понимает параметры с простым двоеточием
String del="DELETE FROM derig WHERE Фамилия=:Иванов";
Для добавления записи Inserts, а вот для удаления записи нужен номер строки, а как его получить я не знаю. Или есть другая команда для удаления записи по запросу?
String del="DELETE FROM derig WHERE Фамилия=:Иванов";
Для добавления записи Inserts, а вот для удаления записи нужен номер строки, а как его получить я не знаю. Или есть другая команда для удаления записи по запросу?
PS: Вы не осознаете разницу между параметром и значением параметра. RTFM
Какая разница как вы это проверяете - факт в том что однофамильци в вашей модели данных существовать не могут. Как в принципе и братья. Или сестры. Кроме того - использование символьного поля в качестве ключевого - нерационально - особенно если учесть что фамилии в принципе могут быть от двух до 35 символов - в данном случае это можно расценивать как грубейшую ошибку проектирования.
String del="DELETE FROM derig WHERE Фамилия=:Иванов"; -мой
DELETE FROM derig WHERE Фамилия="Иванов" -ваш
Вижу разницу только в двоеточии.
Но я не вижу ответа, в какую функцию это запихнуть?
Я же не спрашиваю ВАС как мне проектировать свою базу, я лишь прошу помощи в функции удаления записи и ВСЕ. Почему то вам сложно помочь с функцией удаления записи, но не лень меня учить, как проектировать БД.
Странно))
String del="DELETE FROM derig WHERE Фамилия=:Иванов";
Для добавления записи Inserts, а вот для удаления записи нужен номер строки, а как его получить я не знаю. Или есть другая команда для удаления записи по запросу?
В базе нет номеров строк как таковых - по крайней мере с ними не работают явно никогда. В здравом уме и трезвым. Если у вас есть ваше ключевое поле - ну так и удаляйте по нему - ключевое поле - это значит что этому значению соотвествует одно - и только одно значение.
Т.е. ваш запрос должен быть:
String del="DELETE FROM derig WHERE Фамилия="+LastName;
И дайте себе труд ознакомиться со справкой - я предупреждаю в последний раз - следующим я просто дам бан на неделю.
Форум не начальная школа.