Конвертация данных. Работа с ADO. Часть 1

7 минут на чтение
Итак кaк и обещал, долгожданная статья по конвертации данных из Excel в Access. Тут скажу сразу ничего сложного нету, только лишь воспользуемся знаниями, полученными ранее при работе с данными БД по технологии ADO. Смысл всего этого, делаем запрос в MS Excel на количество записей и количество столбцов, затем по этому количество создаем таблицу в MS Access полями типа MEMO. Мы будем все данные переводить в строковый тип, можно будет усовершенстовать потом конвертирование, чтобы оно само определяло какой тип данных в колонке Excel и такой тип создавать в нашей БД, но это не сейчас, нам сейчас главное понять суть конвертации. Итак на форме у меня следующее
  • TADOConnection — 2 шт
  • TADOQuery — 2 шт
  • TEdit — 2 шт
  • TButton — 2 шт
  • TBitBtn — 2 шт
  • TProgressBar
  • TOpenDialog
Вот такая форма у меня вышла

Вы можете сделать свою, но роли тут ничего это не играет. Итак на Button1 события OnClick нам надо подключить наш Excel файл и получить там количество столбцов и записей, это делается следующим образом.
procedure TForm1.Button1Click(Sender: TObject);
begin
try
if OpenDialog1.Execute then
begin
Edit1.Text:=OpenDialog1.FileName;
ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Файлы Excel;DBQ='+OpenDialog1.FileName+';DefaultDir='+ExtractFileDir(OpenDialog1.FileName)+';DriverId=790;MaxBufferSize=2048;PageTimeout=5;"';
ADOConnection1.Connected:=True;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.Active:=True;
end;
except
on e:Exception do
end;
end;

Как видите мы вручную прописываем путь подключения и вручную указываем Connected - True. Да кстати чуть не забыл настройте за ранее AdoConnection1 и AdoConnection2, в свойствах LongPromt выставим — False, а в свойстве Mode - cmShareDenyNone. Итак данные из Excel файла мы получили, затем нам надо подключить нашу БД MS Access, делается это анологичным способом, на событие Button2 - OnClick пишем

procedure TForm1.Button2Click(Sender: TObject);
begin
try
if OpenDialog1.Execute then
begin
Edit2.Text:=OpenDialog1.FileName;
ADOConnection2.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+OpenDialog1.FileName+';Persist Security Info=False';
ADOConnection2.Connected:=True;
end
else
exit;
except
on e:Exception do
end;
end;

Как видите тоже все вручную подлючаем, только отличается подключение от подключения MS Excel - драйвером БД. Все данные у нас получены, нам придется теперь создать таблицы в MS Access, чтобы потом записывать туда данные из Excel. Для это делаем следующее.

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j:integer;
name_fields:string;
begin
try
name_fields:='';
for i:=0  to ADOQuery1.FieldCount-1 do
begin
name_fields:=name_fields+'pole'+IntToStr(i)+' MEMO,';
end;
Delete(name_fields,length(name_fields),1);
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('CREATE TABLE OUT ('+name_fields+')');
ADOQuery2.ExecSQL;
 
except
on e:Exception do
Application.MessageBox(Pchar(e.Message),'Внимание',MB_OK);
end;
Как видите мы проходимся циклом по количеству столбцов в MS Excel и формируем наши столбцы для БД MS Access, после этого запросом Create Table мы создаем нашу таблицу с нужным количеством столбцов, конечно если таблица данная будет уже существовать в данной БД, будет естественно ошибка. Мы ее перехватим. Далее мы активируем наш ADOQuery2, чтобы можно было туда записывать записи и конвертируем, а точнее записываем. Конечно у нас будет только работать отлично если в нашем Excel файле только текстовые поля, с текстовыми данными, но это решаемо все, мы напишем вот такую вот функцию, которая все время, любой формат будет переводить в текстовый и у нас не будет проблем с конвертацией.
Наша функция конвертирования типов данных
function ToString(Value: Variant): String;
begin
case TVarData(Value).VType of
varSmallInt,
varInteger   : Result := IntToStr(Value);
varSingle,
varDouble,
varCurrency  : Result := FloatToStr(Value);
varDate      : Result := FormatDateTime('dd/mm/yyyy', Value);
varBoolean   : if Value then Result := 'T' else Result := 'F';
varString    : Result := Value;
else            Result := '';
end;
end;
Далее мы наконец-то напишем полный код на кнопку «Начать» для конвертации данных и станет все понятно.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j:integer;
name_fields:string;
begin
try
name_fields:='';
for i:=0  to ADOQuery1.FieldCount-1 do
begin
name_fields:=name_fields+'pole'+IntToStr(i)+' MEMO,';
end;
Delete(name_fields,length(name_fields),1);
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('CREATE TABLE OUT ('+name_fields+')');
ADOQuery2.ExecSQL;
ADOQuery1.First;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('SELECT * FROM OUT');
ADOQuery2.Active:=True;
ADOQuery2.First;
for i:=0 to ADOQuery1.RecordCount-1 do
begin
ProgressBar1.Max:=ADOQuery1.RecordCount;
ADOQuery2.Insert;
for j:=0 to ADOQuery1.FieldCount-1 do
begin
ADOQuery2.Fields[j].AsVariant:=ToString(ADOQuery1.Fields.Fields[j].AsVariant);
end;
ProgressBar1.Position:=ProgressBar1.Position+1;
ADOQuery2.Post;
ADOQuery1.Next;
end;
except
on e:Exception do
Application.MessageBox(Pchar(e.Message),'Внимание',MB_OK);
end;
end;
Как видите используем данную функцию и перехватываем ошибки, которые возникают у нас, также прикрутим наш ProgressBar, чтобы пользователь знал когда ему можно открывать уже БД. Ну как понравился урок? Думаю для начала неплохо, этот проект мы не забрасываем, а дальше усовершенствуем его, наведем порядок, оптимизируем немного, а также сделаем конвертацию данных наооборот, что будет неплохо. Ждем следующих статей
Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Продолжаем работу с базами данных. На этот раз, хотел бы рассмотреть фильтрацию данных в БД. Вообще, хотелось бы поговорить, для чего она предназначена, а также способы фильтрации данных, другими словами поиска данных в БД, с использованием технологии ADO. Как...
Всем здравствуйте, в этой статье я хотел бы снова обратить внимание на Базы данных, а в частности работа с Базами данных по технологии ADO. Когда пользователь создает приложение на Delphi, работающего с СУБД, к которой присоединяется по технологии ADO, то к фа...
Всем привет, и вот мой первый урок, думаю урок полезный, так как работа с базами данных в Delphi очень важно, а тем более Access на мой взгляд самая легкая база данных, с которой можно работать в Delphi. В этой статье я расскажу Вам как эту самую Базу данных A...