Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2013, 11:10   #1
alex1313
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 12
По умолчанию Конвертер из .xls в .mdb. Как сделать без ADOTable

Привет! Пытаюсь перенести Delphi-программу в Lazarus, столкнулся с проблемой: в Lazarus отсутствует аналог ADOTable. Подскажите, как сделать без ADOTable?

Код:
...

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, ExtCtrls, DBCtrls, XPMan, Mask, Grids, ExcelXP,
ComObj, ComCtrls;

...

procedure TForm1.Button1Click(Sender: TObject);
var
ea:variant;
row:integer;
i: word;
ArData: Variant;
begin
try
if opendialog1.Execute then begin
Screen.Cursor := crSQLWait;

ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('Delete from R1');
ADOQuery5.ExecSQL;

ea:=CreateOleObject('Excel.Application');
ea.Workbooks.Open(opendialog1.FileName);
ea.Visible:=false;
row:=ea.ActiveSheet.UsedRange.Rows.Count;
ArData := VarArrayCreate([1, row, 1, 6], varOleStr);
ArData := ea.ActiveSheet.Range['A1:I' + IntToStr(row)].Value;

ProgressBar1.Position:=0;
ProgressBar1.min:=1;
ProgressBar1.max:=row;

adotable1.Close;
adotable1.Open;
for i:=1 to row do begin
adotable1.Append;

adotable1.Fields[0].asString:=VarToStr(ArData[i, 1]);
adotable1.Fields[1].asString:=VarToStr(ArData[i, 2]);
adotable1.Fields[2].asString:=VarToStr(ArData[i, 3]);
adotable1.Fields[3].asString:=VarToStr(ArData[i, 4]);
adotable1.Fields[4].asString:=VarToStr(ArData[i, 5]);
adotable1.Fields[5].asString:=VarToStr(ArData[i, 6]);
adotable1.Fields[6].asString:=VarToStr(ArData[i, 7]);
adotable1.Fields[7].asString:=VarToStr(ArData[i, 8]);
adotable1.Fields[8].asString:=VarToStr(ArData[i, 9]);

adotable1.Post;
ProgressBar1.Position:= row;
application.ProcessMessages;
end;
ProgressBar1.Position:=0;
ea.quit;
adotable1.Close;

ADOQuery1.Close;
ADOQuery1.SQL.Text:= 'Select a,b,c,d,e,f,g,h,i From R1 order by i';
ADOQuery1.Open;

Screen.Cursor := crDefault;
end;
except
on e:exception do begin
Screen.Cursor := crDefault;
ea.quit;
MessageDlg('Ошибка загрузки данных, код ошибки:'+e.message, mtError, [mbOK], 0);
end;
end;
end;
procedure TForm1.Excel1Click(Sender: TObject);
begin
form1.ADOQuery5.Close;
form1.ADOQuery5.SQL.Clear;
form1.ADOQuery5.SQL.Add('SELECT *');
form1.ADOQuery5.SQL.Add('From R1');
form1.ADOQuery5.open
end;

Последний раз редактировалось Stilet; 30.03.2013 в 12:07.
alex1313 вне форума Ответить с цитированием
Старый 30.03.2013, 12:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я использую модули odbcconn, sqldb
Написал для себя простенький класс:
Код:
 TADO=class
    private
     con:TODBCConnection;
     FConnectionString: String;
     FFileDSN: String;
     FPass: String;
     FSQL: TStrings;
     FUser: String;
     tran:TSQLTransaction;
     query:TSQLQuery;
     function GetActive: Boolean;
     function GetField(i: Variant): TField;
     procedure SetActive(AValue: Boolean);
     procedure SetConnectionString(AValue: String);
     procedure SetField(i: Variant; AValue: TField);
     procedure SetFileDSN(AValue: String);
     procedure SetPass(AValue: String);
     procedure SetSQL(AValue: TStrings);
     function GetSQL:TStrings;
     procedure SetUser(AValue: String);
    public
     Error:String;
     property ConnectionString:String read FConnectionString write SetConnectionString;
     property User:String read FUser write SetUser;
     property Pass:String read FPass write SetPass;
     property FileDSN:String read FFileDSN write SetFileDSN;
     property Field[i:Variant]:TField read GetField write SetField;
     property SQL:TStrings read GetSQL write SetSQL;
     property Active:Boolean read GetActive write SetActive;
     Constructor Create(Host:String='');
     Destructor Free;
     Function Eof:Boolean;
     Function FieldByName(name:String):TField;
     Function FieldCount:Integer;
     Function RecordCount:Integer;
     Function Open(aSQL:String):Boolean;
     Function Close:Boolean;
     Function NotEof:Boolean;
     Function Next:Boolean;
     Function ExecSQL:Integer;
  end;
И его реализация:
Код:

function TADO.GetField(i: Variant): TField;
begin
 Result:=nil;
 if query.Active=false then Exit;
 if VarIsOrdinal(i) then Result:=query.Fields[i] else
 if VarIsStr(i) then Result:=query.FieldByName(i);
end;

function TADO.GetActive: Boolean;
begin
 Result:=query.Active;
end;

procedure TADO.SetActive(AValue: Boolean);
begin
  query.Active:=AValue;
end;

procedure TADO.SetConnectionString(AValue: String);
begin
  if FConnectionString=AValue then Exit;
  FConnectionString:=AValue;
end;

procedure TADO.SetField(i: Variant; AValue: TField);
begin

end;

procedure TADO.SetFileDSN(AValue: String);
begin
  if FFileDSN=AValue then Exit;
  FFileDSN:=AValue;
  if con<>nil then con.FileDSN:=FFileDSN;
end;

procedure TADO.SetPass(AValue: String);
begin
  if FPass=AValue then Exit;
  FPass:=AValue;
  if con<>nil then con.Password:=FPass;
end;

procedure TADO.SetSQL(AValue: TStrings);
begin
  if FSQL=AValue then Exit;
  FSQL:=AValue;
end;

function TADO.GetSQL: TStrings;
begin
  Result:=query.SQL;
end;

procedure TADO.SetUser(AValue: String);
begin
  if FUser=AValue then Exit;
  FUser:=AValue;
  if con<>nil then con.UserName:=FUser;
end;

constructor TADO.Create(Host: String);
begin
  tran:=TSQLTransaction.Create(nil); 
  con:=TODBCConnection.Create(nil); con.Transaction:=tran;
  query:=TSQLQuery.Create(nil); query.DataBase:=con;

  with con do begin
   Driver:='SQL Server';
   Password:='Пароль';
   UserName:='Логин';
   Params.Add('Database=Имя базы');
   Params.Add('Server='+Host);
   Params.Add('Integrated Security=SSPI');
   con.Open;
  end;

end;

destructor TADO.Free;
begin
 query.Active:=false; FreeAndNil(query);
 FreeAndNil(tran);
 con.Close; FreeAndNil(con);
end;

function TADO.Eof: Boolean;
begin
  Result:=query.EOF;
end;

function TADO.FieldByName(name: String): TField;
var i:integer;  s:string;
begin
  Result:=query.FieldByName(Utf8ToAnsi(name));
end;

function TADO.FieldCount: Integer;
begin
  Result:=query.FieldCount;
end;

function TADO.RecordCount: Integer;
begin
  Result:=query.RecordCount;
end;

function TADO.Open(aSQL: String): Boolean;
begin
 Close;
 Error:='';
 try
  query.SQL.Text:=asql;
  query.Open;
  Result:=True;
 except
  on e:Exception do begin
   Error:='Ошибка открытия набора: '+e.Message;
   Result:=false;
  end;
 end;
end;

function TADO.Close: Boolean;
begin
  if query.Active=true then query.Close;
end;

function TADO.NotEof: Boolean;
begin
 if query.Active=true then Result:=not query.EOF
 else Result:=false;
end;

function TADO.Next: Boolean;
begin
  query.Next;
end;

function TADO.ExecSQL: Integer;
begin
  query.ExecSQL;
  Result:=0;
end;
Использование:
Код:
var ADOQuery5:TADO;
...
ADOQuery5:=TAdo.Create;
...

ADOQuery5.Close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.Add('Delete from R1');
ADOQuery5.ExecSQL;
Это не палитровый компонент, создавать его нужно ручками и освобождать не забывать при завершении программы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 12:59   #3
alex1313
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 12
По умолчанию

Stilet, спасибо всё это очень круто, но я это применить не смогу.
Мне нужно любым способом перегнать из excel в таблицу mdb, на форме есть компонент StringGrid
alex1313 вне форума Ответить с цитированием
Старый 30.03.2013, 16:09   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
любым способом перегнать из excel в таблицу mdb
а Delphi зачем?

Последний раз редактировалось eval; 30.03.2013 в 16:33.
eval вне форума Ответить с цитированием
Старый 30.03.2013, 16:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
любым способом
Тогда не парься, а в Акцессе настрой импорт внешних данных - дешевле и надежнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 17:00   #6
alex1313
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 12
По умолчанию

Access не работает, лицензии нет
alex1313 вне форума Ответить с цитированием
Старый 30.03.2013, 17:45   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда зачем ты на нем работу делаешь?
Вокруг море бесплатных и более крутых СУБД чем Акцесс.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из XLS в MDB файл с сохранением структуры БД artemavd БД в Delphi 3 23.10.2011 09:39
Обращение к ~.mdb через AdoTable Apostol13 БД в Delphi 22 24.09.2011 20:30
Как работать с *.xls файлами без Excel'я? Нур Общие вопросы Delphi 8 15.12.2010 07:16
Как заблокировать файли *.mdb и *.xls ??? $T@LKER БД в Delphi 3 07.05.2010 10:53
Как копировать данные из ADOTable в ADOTable? mauar БД в Delphi 1 10.05.2008 16:05