Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужна проверка слабых мест


Разведка ©   (2012-06-03 14:57:00) 

Сделал импорт файла Excel в ADO во временную таблицу по определенным полям. Нужно проверить есть ли потенциально опасные места в коде при которых могут возникать ошибки при импорте... Например, пользователь укажет не верные данные в Excel или же импортируемая таблица будет иметь не те поля или неверные типы полей ну т.д.

type
TFrmMain = class(TForm)
JvDBGOutput: TJvDBGrid;
JvDBGInput: TJvDBGrid;;
GrBoxFind: TGroupBox;
ChBoxDateFind: TCheckBox;
Act_Import_TabOutput: TAction;
Act_Import_TabInput: TAction;
ConnectBase: TADOConnection;
QueryOutput: TADOQuery;
QueryInput: TADOQuery;
OpenDlg: TOpenDialog;
Query: TADOQuery;
QueryImport: TADOQuery;
procedure Act_Import_TabOutputExecute(Sender: TObject);
procedure Act_Import_TabInputExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TableClear(TabName: String);
Procedure TabImportConnetion;
end;
var
 FrmMain:TFrmMain;
 CurPath,ConnStr:String;
Const mb_caption='Импорт расходов/приходов';
implementation

procedure TFrmMain.Act_Import_TabInputExecute(Sender: TObject);
begin
 //Вызов процедуры Диалога открытия и подключения таблицы Excel
 TabImportConnetion;
 //Проверка что QueryImport активный ()
 if Not QueryImport.Active then Exit;
  if (QueryImport.FindField('Дата')=Nil) or
    (QueryImport.FindField('Приход')=Nil) or
    (QueryImport.FindField('Валюта')=Nil) or
    (QueryImport.FindField('Информация')=Nil) then
   begin
     MessageBox(Handle,PChar('Неудалось выполнить импорт данных.'),
        PChar(mb_caption),MB_ICONWARNING);
     exit;
   end;
 //Очистка всей таблицы TabOutput перед импортом данных
 TableClear('TabInput');
 //Цеклический перенос записей в базу из Excel
 QueryImport.First;
 While Not QueryImport.Eof do
   begin
     with Query do
       begin
         //Пропускается импорт строк имеющие пустые значения в значимых полях
   if QueryImport.FindField('Дата').IsNull or
            QueryImport.FindField('Приход').IsNull then
           begin
             QueryImport.next;
             Continue;
           end;        
   Close;SQL.Clear;
         SQL.Add('INSERT INTO TabInput (FDate,FInput,Valuta,Coment) ');
         SQL.Add('VALUES (:FDate,:FInput,:FValuta,:FComent)');
         //Заполнение параметров для запроса QueryImport из QueryImport
         Parameters.ParamByName('FDate').Value:=QueryImport.FindField('Дата').AsDateTime;
         Parameters.ParamByName('FInput').Value:=QueryImport.FindField('Приход').AsFloat;
         Parameters.ParamByName('FValuta').Value:=QueryImport.FindField('Валюта').AsStrin g;
         Parameters.ParamByName('FComent').Value:=QueryImport.FindField('Информация').AsS tring;
         ExecSQL;
       end;
     QueryImport.Next;
   end;
   QueryInput.Close;
   QueryInput.Open;
   QueryImport.Close;
   LblTabInput.Caption := 'Файл таблицы Прихода: '+ExtractFileName(OpenDlg.FileName);
end;

procedure TFrmMain.Act_Import_TabOutputExecute(Sender: TObject);
begin
 //Вызов процедуры Диалога открытия и подключения таблицы Excel
 TabImportConnetion;
 if QueryImport.Active = false then Exit;
 if (QueryImport.FindField('Дата') = Nil) or
    (QueryImport.FindField('Расход') = Nil) or
    (QueryImport.FindField('Валюта') = Nil) or
    (QueryImport.FindField('Информация') = Nil) then
   begin
     MessageBox(Handle,PChar('Неудалось выполнить импорт данных.'),
      PChar(mb_caption),MB_ICONWARNING);
     exit;
   end;
 //Очистка всей таблицы TabOutput перед импортом данных
 TableClear('TabOutput');
 //Цеклический перенос записей в базу из Excel
 QueryImport.First;
 While Not QueryImport.Eof do
   begin
     with Query do
       begin
   //Пропускается импорт строк имеющие пустые значения в значимых полях
         if QueryImport.FindField('Дата').IsNull or
            QueryImport.FindField('Расход').IsNull then
           begin
             QueryImport.next;
             Continue;
           end;
         Close;
         SQL.Clear;
         SQL.Add('INSERT INTO TabOutput (FDate,FOutput,Valuta,Coment) ');
         SQL.Add('VALUES (:FDate,:FOutput,:FValuta,:FComent)');
         // Заполнение параметров для запроса QueryImport из QueryImport
         Parameters.ParamByName('FDate').Value:=QueryImport.FindField('Дата').AsDateTime;
         Parameters.ParamByName('FOutput').Value:=QueryImport.FindField('Расход').AsFloat ;
         Parameters.ParamByName('FValuta').Value:=QueryImport.FindField('Валюта').AsStrin g;
         Parameters.ParamByName('FComent').Value:=QueryImport.FindField('Информация').AsS tring;
         ExecSQL;
       end;
       QueryImport.next;
   end;
   QueryOutput.Close;
   QueryOutput.Open;
   QueryImport.Close;
   LblFileTabOutput.Caption:='Файл таблицы расхода: '+ExtractFileName(OpenDlg.FileName);
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
 CurPath:=ExtractFilePath(Application.ExeName);
 //Подключаем основную базу  base_test.mdb
 ConnStr:='Provider=Microsoft.Jet.OLEDB.4.0;'+
  'Data Source='+CurPath+'base_test.mdb;Persist Security Info=False';
 ConnectBase.ConnectionString := ConnStr;
 ConnectBase.Connected:=true;
 ConnectBase.BeginTrans;
 QueryOutput.Active:=True;
 QueryInput.Active :=True;
 JvGradient1.Align :=alClient;
end;

procedure TFrmMain.TabImportConnetion;
var SelSheet: integer;
begin
OpenDlg.FileName := '';
 if Not OpenDlg.Execute then Exit;
 //Подключение таблиццы Excel как базу данных в ADO
 ConnectImport.Close;
 QueryImport.Close;
 ConnectImport.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
    'Data Source='+OpenDlg.FileName+
    ';Extended Properties=Excel 8.0;';
 //ConnectImport.Connected:=true;
 try
   ConnectImport.open;
     //Получаем список листов Книги из файла Excel
    FrmSelectSheet.LBoxSheets.Clear;
    ConnectImport.GetTableNames(FrmSelectSheet.LBoxSheets.Items);
    if FrmSelectSheet.LBoxSheets.Count = 0 then
     begin
      MessageBox(Handle,PChar('Не удалось из Excel ни одного листа'),PChar(mb_caption),MB_ICONWARNING);
      Exit;
     end;
    FrmSelectSheet.ShowModal;
 if FrmSelectSheet.LBoxSheets.ItemIndex = -1 then SelSheet := 0
 else SelSheet:=FrmSelectSheet.LBoxSheets.ItemIndex;
 //Делаем SQL запрос и получаем всю таблицу целиком в QueryImport
 //Из выбранного листа Excel
 QueryImport.Connection := ConnectImport;
 QueryImport.SQL.Text := 'SELECT * FROM ['+FrmSelectSheet.LBoxSheets.Items[SelSheet]+']';
 QueryImport.Open;
 except
   MessageBox(Handle,PChar('Не удалось получить данные из файла: '
      +ExtractFileName(OpenDlg.FileName)),
      PChar(mb_caption),MB_ICONWARNING);
   QueryImport.Close;
   exit;
 end;
end;

procedure TFrmMain.TableClear(TabName: String);
begin
 With Query do
 begin
  SQL.Clear;
  SQL.Text:='DELETE FROM '+TabName;
  ExecSQL;
 end;
end;
end.


KSergey   (2012-06-05 15:06:00) [1]

> Разведка   (03.06.12 14:57) 

А в чем ваш вопрос? Мне не понятно.
Говорите - надо сделать проверки - ну сделайте проверки, если надо.
А вы написали "надо сделать проверки" и привели портянку кода.

А в чем вопрос-то?


Anatoly Podgoretsky   (2012-06-05 10:18:00) [2]


> Разведка   (04.06.12 19:40) [7]

Можешь не читать


sniknik   (2012-06-04 19:51:00) [3]

> Не понятно чем оно лучше?
раз в 100 быстрее чем то, что сделаешь ты, даже если уберешь из кода выше все тормозные места.

> у людей только одни проблемы какие то
странно, а у меня их нет. вывод - я не человек, я программист.


Разведка   (2012-06-04 19:44:00) [4]


> sniknik ©   (03.06.12 19:33)


Поискал, по поисковикам информацию по вашему этому ISAM - результат
у людей только одни проблемы какие то сплошные весь инет завален только просьбами как исправить то одни глюки, то другие.  Впечатление такое, что такие технологи нам ненужны.


Разведка   (2012-06-04 19:40:00) [5]


> sniknik ©   (03.06.12 19:33) [6]
> а я не направил? или нужно прямое указание? ну так, бери
> справку, и читай про исам-ы!


Не понятно чем оно лучше?


sniknik   (2012-06-03 19:33:00) [6]

а я не направил? или нужно прямое указание? ну так, бери справку, и читай про исам-ы!


Разведка   (2012-06-03 19:07:00) [7]


> sniknik ©   (03.06.12 18:30) [4]
> как напишешь. ты программист или где?


А ведь всего все сразу и не узнаешь. Нужно что бы кто то направлял на правильные мысли.


sniknik   (2012-06-03 18:30:00) [8]

как напишешь. ты программист или где?


Разведка   (2012-06-03 17:02:00) [9]


> sniknik ©   (03.06.12 15:28) [2]
> в Jet вся эта хрень с переносом данных в файл экселя делается
> одним запросом, для этого есть ISAM Excel.


Нужно что бы при переносе в новой таблице появлялись новые поля key -ключевое и Link -для связи, а еще проверка проводилась, те ли данные пользователь импортирует? ответствуют ли названия полей и нет ли лишних полей в таблице? Будет ли это выполняться в одном запросе?


sniknik   (2012-06-03 15:28:00) [10]

в Jet вся эта хрень с переносом данных в файл экселя делается одним запросом, для этого есть ISAM Excel.


Разведка   (2012-06-03 14:59:00) [11]

может быть код целиком сбросить на файлообменник?


Наверх

Титульная страница Поиск, карта сайта Написать письмо