Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение существующих таблиц (AOD) 
:(
    Опции темы
dinja3
Дата 6.4.2013, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Добрый день,

Помогите решить проблему со сравнением таблиц на существование в базе данных.

У меня есть ComboBox и DBGrid

Мне надо, что бы когда вписываешь название таблицы в ComboBox он её показывал в DBGrid, НО если такой таблицы не существует, то создать её. База данных Access.

Когда создавал таблицы в DataBase Desktop, то в коде на кнопку писал

Код

if not Table1.Exists then
  Table1.Create


А в Access нету такой команды 
Код

if not ADOTable1.Exists

Может кто нибудь подсказать как сделать проверку, есть ли такая таблица или её нету.

Добавлено @ 18:14
Я знаю что есть команда SQL

ADOQuery1.SQL.Add (CREATE Table if not existst Название (Поле тип);

Но если решение только с помощью этого запроса, то как соединить и открытие и создание(если нету такой таблицы) вместе в коде, до меня не доходит. 

Это сообщение отредактировал(а) dinja3 - 6.4.2013, 18:15
PM MAIL   Вверх
Данкинг
Дата 6.4.2013, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(dinja3 @  6.4.2013,  19:10 Найти цитируемый пост)
Может кто нибудь подсказать как сделать проверку, есть ли такая таблица или её нету.

Самый простой способ - отлавливать ошибку на AdoTable.Open. И ещё можно получить список всех таблиц в БД и там искать нужную, т.е. проверять её наличие.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
dinja3
Дата 6.4.2013, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Цитата(Данкинг @ 6.4.2013,  18:39)
Цитата(dinja3 @  6.4.2013,  19:10 Найти цитируемый пост)
Может кто нибудь подсказать как сделать проверку, есть ли такая таблица или её нету.

И ещё можно получить список всех таблиц в БД и там искать нужную, т.е. проверять её наличие.

А как к примеру вывести список таблиц из бд в ListBox? 
Что бы потом сделать сравнение названий из ComboBox и ListBox, если в ListBox есть такая таблица то выводим, если нету то создаём с помощью SQL. 

Но я не знаю как список вывести

Это сообщение отредактировал(а) dinja3 - 6.4.2013, 19:04
PM MAIL   Вверх
Данкинг
Дата 6.4.2013, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Код

t:Tstringlist;
...
ADOConnection.GetTableNames(t, false)



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
dinja3
Дата 6.4.2013, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Спасибо, буду пробовать
PM MAIL   Вверх
Данкинг
Дата 6.4.2013, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Код

function checker (table:string; adoconn:tadoconnection):boolean;
var
 txt:tstringlist;
 j:integer;
 begin
  result:=false;
  table:=ansiuppercase(table);
  txt:=tstringlist.Create;
  adoconn.GetTableNames(txt,false);
  for j:=0 to txt.Count-1 do
   if ansiuppercase(txt.Strings[j])=table then result:=true;
  txt.Free;
 end;



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
dinja3
Дата 6.4.2013, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Спасибо, но я по другому сделал и у меня теперь другая проблема

Он создаёт новую таблицу если не существует, но теперь он мне не открывает те которые уже были)))

Я знаю, что я с кодом напортачил, но могли бы вы подсказать где)

Код

procedure TSaraksts.Button2Click(Sender: TObject);
begin
  ADOConnection1.Open;
  ADOConnection1.GetTableNames(ListBox1.Items);
  if ComboBox1.Text<>ListBox1.Items.Text then
    begin
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('CREATE TABLE '+ComboBox1.Text+' (Test INTEGER)');
    ADOQuery1.ExecSQL;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM '+ComboBox1.Text+'');
    ADOQuery1.Active:=True;
    end
  else
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM '+ComboBox1.Text+'');
    ADOQuery1.Active:=True;
end;


Если не совпадает, то создаём, а если совпадает, то он всё равно создаёт) но такая таблица уже существует
PM MAIL   Вверх
Данкинг
Дата 6.4.2013, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(dinja3 @  6.4.2013,  22:16 Найти цитируемый пост)
но теперь он мне не открывает те которые уже были)))

Где и что он должен открывать? В общем, не понял вопроса.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
dinja3
Дата 6.4.2013, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Код

procedure TSaraksts.Button2Click(Sender: TObject);
begin
  ADOConnection1.Open;
  ADOConnection1.GetTableNames(ListBox1.Items); //выводим названия всех существующих таблиц в Listbox
  if ComboBox1.Text<>ListBox1.Items.Text then // проверяем введёное название таблицы с Listbox, если не совпадает, то создаём таблицу
    begin
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('CREATE TABLE '+ComboBox1.Text+' (Test INTEGER)'); //создаём потому что её не существует
    ADOQuery1.ExecSQL;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM '+ComboBox1.Text+''); //показываем
    ADOQuery1.Active:=True;
    end
  else //в другом случае, если совпадает, то 
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT * FROM '+ComboBox1.Text+''); //показываем таблицу,т.к. она уже существует
    ADOQuery1.Active:=True;
end;


Это сообщение отредактировал(а) dinja3 - 6.4.2013, 21:44
PM MAIL   Вверх
Данкинг
Дата 6.4.2013, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Проверь, что вообще содержится в ComboBox1.Text, а что - в ListBox1.Items.Text. 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
dinja3
Дата 6.4.2013, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Вообщем смотри у меня есть 3 таблицы 

1) Студент
2) Предмет
3) Оценки

Я вывожу их названия в ListBox. Там 3 слова в ряд

1) Студент
2) Предмет
3) Оценки

Мне надо: 

1) Если я ввожу в ComboBox слово Студент, то он должен показывать таблицу в DBGrid

2) Если я ввожу слово Учитель, то он должен создать эту таблицу, поместить в Access, потом прочитать её и вывести в DBGrid.

НО, когда я ввожу слово Студент, он пишет, что такая таблица уже есть и не выводит её в DBGrid,

А когда ввожу слово Учитель, то он создаёт, но при повторном запросе так же пишет, что она существует и не показывает её в DBGrid

Всё дело в if then else, я не очень понимаю как правильно написать, что бы если есть то он показывал, а в противном случае создавал и показывал

Это сообщение отредактировал(а) dinja3 - 6.4.2013, 21:58
PM MAIL   Вверх
Данкинг
Дата 6.4.2013, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(dinja3 @  6.4.2013,  22:56 Найти цитируемый пост)
Я вывожу их названия в ListBox. 

Зачем? Т.е. какое это отношение имеет к задаче?
Цитата(dinja3 @  6.4.2013,  22:56 Найти цитируемый пост)
я не очень понимаю как правильно написать

Мою функцию проверял?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1367 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.