Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с ADOTable

1.8K
15 мая 2008 года
Evgeni
188 / / 14.06.2006
Подскажите, плиз(очень надо). У меня есть две аксесные бд. Есть два компонента ADOTable, располженных на разных формах. Я вначале открываю первую, следом вторую бд. Читаю из обоих записи. И вот когда пытаюсь изменить запись во второй бд, то прога вылетает со словами EAccessviolation и курсор устанавливается на строчку изменения поля записи.

Скажите, в чем возможная проблема
5
15 мая 2008 года
hardcase
4.5K / / 09.08.2005
Проблема в "кривом" указателе.
1.8K
15 мая 2008 года
Evgeni
188 / / 14.06.2006
а что нужно предпринять, как можно исправить?
1
15 мая 2008 года
kot_
7.3K / / 20.01.2000
Любопытно - когда мне внемлет хоть кто нибудь - телепатов нет на форуме. Нет на форуме телепатов. Телепатов - нет. Нет. И не было никогда. :)
5
16 мая 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Evgeni
а что нужно предпринять, как можно исправить?

Пойти попить пивка, например.

1.8K
16 мая 2008 года
Evgeni
188 / / 14.06.2006
Может хватит уже приклываться.
332
16 мая 2008 года
Valiant
416 / / 27.09.2004
Да хватит прикалываться !!!
Код в студию (это фраза звучит постоянно)
332
16 мая 2008 года
Valiant
416 / / 27.09.2004
Уважаемый Evgeni
Цитата: kot_
Любопытно - когда мне внемлет хоть кто нибудь - телепатов нет на форуме. Нет на форуме телепатов. Телепатов - нет. Нет. И не было никогда. :)



эта фраза означает, что мы не умеем читать ваши мысли.
Приведите ваш код (кусок кода).
Может тогда мы сможем понять в чем ваша проблема...

1.8K
16 мая 2008 года
Evgeni
188 / / 14.06.2006
Эх, не могу выложить весь проект, т.к на форуме нельзя выложить больше 20кб, а код членить слишком геморно. Может подскажите, куда можно временно залить файл?
1.8K
16 мая 2008 года
Evgeni
188 / / 14.06.2006
Но суть состоит в следующем
вот код загрузки, находящейся на первой форме(он у меня стабильно работает)
Код:
ADOTable1->Close();
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();
Form2->ADOTable1->First();
while (!Form2->ADOTable1->Eof)  
{
    читаем ключевое поле и проверяем та ли эта запись или нет
   если да то
   {
    Form2->ADOTable1->Edit();
    Form2->ADOTable1->Fields->Fields[0]->AsString="fabcd";    ВОТ ЗДЕСЬ ОН РУГАЕТСЯ
   Form2->ADOTAble1->Post();
   break;
   }
   Form2->ADOTable1->Next();
}
}


Все делается в таком вот порядке.
11
16 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Evgeni
Но суть состоит в следующем
вот код загрузки, находящейся на первой форме(он у меня стабильно работает)
Код:
ADOTable1->Close();
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();
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 что пишет?

1.8K
16 мая 2008 года
Evgeni
188 / / 14.06.2006
Я там вообщето изменяю все поля. Я бы вам скинул весь исходник, то форму это не позволяет)). Если можно, могу скинуть вам на ящик.
1
16 мая 2008 года
kot_
7.3K / / 20.01.2000
не надо никому ничего скидывать. вашу работу делать за вас никто не будет. тем более мальчик взрослый - отладчиком надо уметь пользоваться.
11
16 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Повторю вопрос:
Что именно пишет в сообщении об ошибке?
1.8K
16 мая 2008 года
Evgeni
188 / / 14.06.2006
Я и не проше делать за себя всю работу, просто возникла не стандартная для меня ошибка, когда код рабочий, но что-то все же происходит.

Вот то, что написано в ошибке:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00406106 in module 'Project1.exe'. Read of adress 0000024'.
1
16 мая 2008 года
kot_
7.3K / / 20.01.2000
4 сервис-пак установлен?
Стандартный совет всем кто работает с TADOTable- не используйте этот компонент. Работайте с запросами.
1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
тогда не подскажите ли, как работать с бд через запросы(я ни когда этого не делал): вот когда мне надо изменить определенную запись в бд, какой запорс нужно сформировать?
1
17 мая 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Evgeni
тогда не подскажите ли, как работать с бд через запросы(я ни когда этого не делал): вот когда мне надо изменить определенную запись в бд, какой запорс нужно сформировать?


Для работы с запросами служит компонент TADOQuery. Принцип работы достаточно простой. Выборка данных:

 
Код:
TADOQuery *quSelect = new TADOQuery(this);
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;

выберет все данные из указанной таблицы.
Для модификации данных:
Код:
TADOQuery *quUpdate = new TADOQuery(this);
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 ) данные выбраной записи обновляються. Более подробно читайте в литературе и справке.
Перебор записей, которые выбраны из таблицы выполняеться просто:
 
Код:
quSelect->First();
while(!quSelect->Eof){
 if(quSelect->FieldByName("somefields")->Value == somevalue){
  ....
//
}
quSelect->Next();
}

Если вы работаете с DBGrid - этого делать ненужно.
Если нужно выбрать определенную запись по параметру используйте Locate - пример подробно описан в справке.
Более подробно напишу в ФАКе когда будет время.
З.Ы. [COLOR="Red"]Код не проверялся и не тестировался - все переменные и значения вида somefields, а так же расположенные в угловых скобках, параметры, названия таблиц и пр. надо заменить своими конкретными значениями.[/COLOR]
1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
Все, сделал как вы сказали, но выводит сообщение: ошибка синтаксиса Update. Написал такой код
Код:
OD1->Execute();
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;

Поле Фамилия у меня ключевое.
1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
все, получилось изменить поля, при условии что ключивое не меняю(там в строке нужно было убрать скобки).
Но мне как раз нужно изменить и ключевое поле, как это сделать?????
11
17 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Evgeni
все, получилось изменить поля, при условии что ключивое не меняю(там в строке нужно было убрать скобки).
Но мне как раз нужно изменить и ключевое поле, как это сделать?????



Проверить на отсутсвие совпадений с теми данными что хотите ввести в ключевое поле

 
Код:
SELECT COUNT(*) AS Count FROM <Table> WHERE <KeyField> = :Value


при условии если запрос выдаст > 0 использовать
 
Код:
UPDATE <Table> SET <KeyField> = :Value

иначе
 
Код:
INSERT INTO <Table> (<KeyField>, <SomeFields>) VALUES (:Value, :SomeValues)
1
17 мая 2008 года
kot_
7.3K / / 20.01.2000
Для начала - у вас неверно установлено ключевое поле. Вероятно вы никогда не слышали о однофамильцах. Тем более вы не предполагаете наличие братьев, и прочих родичей.
Во вторых - апдейт в таком случае выполняется так же как и на остальные поля:
 
Код:
UPADATE derig SET Фамилия = :Param Where Фамилия = :ParamId

короме того - не используйте русские имена и <> - это стандартное обозначение того, что здесь вам надо подставить свое значение.
1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
Проверка на однофомильцев я осуществляю другими средствами, для этого мне не надо опрашивать бд посредствам запросов.
А вот про изменение ключевого поля, написал этот код, но результат нуливой
 
Код:
String update = "UPDATE derig SET Фамилия=:Семеновfff WHERE Фамилия=:Семенов";
quUpdate->SQL->Clear();
quUpdate->SQL->Add(update);
quUpdate->Parameters->ParamByName("Семенов")->Value="Семеновfff";
quUpdate->ExecSQL();

По разному менял значение после SET Фамилия=: , но все равно не выходит
5
17 мая 2008 года
hardcase
4.5K / / 09.08.2005
По-моему всегда параметр имел префикс-плюшку "@":
 
Код:
String update = "UPDATE derig SET Фамилия=@new_name WHERE Фамилия=@current_name";
quUpdate->SQL->Clear();
quUpdate->SQL->Add(update);
quUpdate->Parameters->ParamByName("@new_name")->Value = "Семеновfff";
quUpdate->Parameters->ParamByName("@old_name")->Value = "Семенов";
quUpdate->ExecSQL();
1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
Запрос на добавление записи получилось сделать, а как сделать на удаление7
11
17 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Evgeni
Запрос на добавление записи получилось сделать, а как сделать на удаление7



здесь на многое есть ответ

1
17 мая 2008 года
kot_
7.3K / / 20.01.2000
Цитата: hardcase
По-моему всегда параметр имел префикс-плюшку "@":
...


Да в разных базах по разному вобщета - с акцессом вроде должно с двоеточием работать - хз, я предполагаю что человек способен нажать на клавишу Ф1 и посмотреть как что и почему.
З.Ы. Кроме того, топикстартеру рекомендую ознакомиться с правилами топика - а то мне быстро надоест быть добрым. В конце концов, материала по языку SQL в сети более чем достаточно.

11
17 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase
По-моему всегда параметр имел префикс-плюшку "@":


она нужна только для парвметров ХП в MS SQL server
VCL понимает параметры с простым двоеточием

1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
Я имел ввиду, какая команда удаляет строку по такому запросу:
String del="DELETE FROM derig WHERE Фамилия=:Иванов";

Для добавления записи Inserts, а вот для удаления записи нужен номер строки, а как его получить я не знаю. Или есть другая команда для удаления записи по запросу?
11
17 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Evgeni
Я имел ввиду, какая команда удаляет строку по такому запросу:
String del="DELETE FROM derig WHERE Фамилия=:Иванов";

Для добавления записи Inserts, а вот для удаления записи нужен номер строки, а как его получить я не знаю. Или есть другая команда для удаления записи по запросу?



 
Код:
DELETE FROM derig WHERE Фамилия="Иванов"


PS: Вы не осознаете разницу между параметром и значением параметра. RTFM
1
17 мая 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Evgeni
Проверка на однофомильцев я осуществляю другими средствами, для этого мне не надо опрашивать бд посредствам запросов.


Какая разница как вы это проверяете - факт в том что однофамильци в вашей модели данных существовать не могут. Как в принципе и братья. Или сестры. Кроме того - использование символьного поля в качестве ключевого - нерационально - особенно если учесть что фамилии в принципе могут быть от двух до 35 символов - в данном случае это можно расценивать как грубейшую ошибку проектирования.

1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
и что же это я не правильно написал???? разница между тем, что написали вы и то что написал я
String del="DELETE FROM derig WHERE Фамилия=:Иванов"; -мой
DELETE FROM derig WHERE Фамилия="Иванов" -ваш
Вижу разницу только в двоеточии.
Но я не вижу ответа, в какую функцию это запихнуть?
1.8K
17 мая 2008 года
Evgeni
188 / / 14.06.2006
Цитата: kot_
Какая разница как вы это проверяете - факт в том что однофамильци в вашей модели данных существовать не могут. Как в принципе и братья. Или сестры. Кроме того - использование символьного поля в качестве ключевого - нерационально - особенно если учесть что фамилии в принципе могут быть от двух до 35 символов - в данном случае это можно расценивать как грубейшую ошибку проектирования.



Я же не спрашиваю ВАС как мне проектировать свою базу, я лишь прошу помощи в функции удаления записи и ВСЕ. Почему то вам сложно помочь с функцией удаления записи, но не лень меня учить, как проектировать БД.
Странно))

1
17 мая 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Evgeni
Я имел ввиду, какая команда удаляет строку по такому запросу:
String del="DELETE FROM derig WHERE Фамилия=:Иванов";

Для добавления записи Inserts, а вот для удаления записи нужен номер строки, а как его получить я не знаю. Или есть другая команда для удаления записи по запросу?



В базе нет номеров строк как таковых - по крайней мере с ними не работают явно никогда. В здравом уме и трезвым. Если у вас есть ваше ключевое поле - ну так и удаляйте по нему - ключевое поле - это значит что этому значению соотвествует одно - и только одно значение.
Т.е. ваш запрос должен быть:

 
Код:
String LastName = "Иванов";
String del="DELETE FROM derig WHERE Фамилия="+LastName;


И дайте себе труд ознакомиться со справкой - я предупреждаю в последний раз - следующим я просто дам бан на неделю.
Форум не начальная школа.
1
17 мая 2008 года
kot_
7.3K / / 20.01.2000
Тема закрыта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог