![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужна проверка слабых мест
Разведка © (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]может быть код целиком сбросить на файлообменник?