📄 unit_importdata.pas
字号:
Str :=copy(Str,1,length(Str)-1)+' )';
query1.sql.text :=Str;
//加上数值
for k:=0 to P_LinkCount -1 do
begin
//只有四种格式的字段类型
if not ((uppercase(P_Link[k].DataCode.DATA_TYPE)='VARCHAR2') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='CHAR') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='NUMBER') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='DATE')) then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',不支持该列数据格式!');
LBz1 :=true;
continue;
end;
//和字段类型有关,现在只支持四中类型
//和字段长度有关
if (uppercase(P_Link[k].DataCode.DATA_TYPE)='VARCHAR2') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='CHAR') then
begin
if uppercase(P_Link[k].DataCode.NULLABLE)='N' then
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值为空,而字段为非空!');
LBz1 :=true;
continue;
end;
end;
if length(Values[strtoint(P_Link[k].DataCode.LinkCol)])
>strtoint(P_Link[k].DataCode.DATA_LENGTH) then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值超过长度!');
LBz1 :=true;
continue;
end
else
begin
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :=
Values[strtoint(P_Link[k].DataCode.LinkCol)];
end;
end;
if uppercase(P_Link[k].DataCode.DATA_TYPE)='DATE' then
begin
if uppercase(P_Link[k].DataCode.NULLABLE)='N' then
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值为空,而字段为非空!');
LBz1 :=true;
continue;
end;
end;
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])<>'' then
begin
try
strtodatetime(Values[strtoint(P_Link[k].DataCode.LinkCol)]);
except
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',时间格式错误!');
LBz1 :=true;
continue;
end;
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asdatetime :=
strtodatetime(Values[strtoint(P_Link[k].DataCode.LinkCol)]);
end
else
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :='';
end;
if uppercase(P_Link[k].DataCode.DATA_TYPE)='NUMBER' then
begin
if uppercase(P_Link[k].DataCode.NULLABLE)='N' then
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值为空,而字段为非空!');
LBz1 :=true;
continue;
end;
end;
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])<>'' then
begin
try
strtoint64(Values[strtoint(P_Link[k].DataCode.LinkCol)]);
except
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',不是数字,错误!');
LBz1 :=true;
continue;
end;
end;
//数字麻烦
if length(Values[strtoint(P_Link[k].DataCode.LinkCol)])
>strtoint(P_Link[k].DataCode.DATA_LENGTH) then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值超过长度!');
LBz1 :=true;
continue;
end
else
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :=''
else
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :=
Values[strtoint(P_Link[k].DataCode.LinkCol)];
end;
end;
end;//end for k:=0 to P_LinkCount -1 do
//表示已经有字段插入出错了
if LBz1 then
begin
LBz :=true;
continue;
end
else
LBz1 :=false;
try
Dm_Main.Databasedh.StartTransaction;
query1.ExecSQL;
Dm_Main.Databasedh.Commit;
except
//messagedlg('第'+inttostr(i+1)+'行出错'+' :违反唯一性原则或者其他数据库原因',mtInformation ,[mbok],0);
Memo2.Lines.add('第'+inttostr(i+1)+'行出错'+' :违反唯一性原则或者其他数据库原因');
Dm_Main.Databasedh.Rollback;
LBz :=true;
continue;
end;
end;
end
else
begin
//Excel
colcount :=ListView1.Columns.Count;
rowcount :=ListView1.Items.Count;
//判断连接数大于实际有的列数
if P_LinkCount >colcount then
begin
messagedlg('连接的列数大于实际文件的列数,错误!',mtInformation ,[mbok],0);
PnlPrint.Visible :=false;
exit;
end;
//一行一行地导入
for i:=0 to rowcount -1 do
begin
//一行的每格存到数组里
for j:=0 to colcount -1 do
begin
if j=0 then
StrValues :=ListView1.Items[i].Caption
else
StrValues :=ListView1.Items[i].SubItems[j -1];
Values[j] :=trim(StrValues);
end;
//*****用这个数组进行插入表 ,要判断数据的合法性*******
//*****非空字段不能为空,字段的长度和类型等***********
query1.close;
Str :='insert into '+tablename+' (';
StrField :='';
StrValues :='';
for k:=0 to P_LinkCount -1 do
begin
StrField :=StrField+P_Link[k].DataCode.COLUMN_NAME+',';
StrValues :=StrValues+':'+P_Link[k].DataCode.COLUMN_NAME+',';
end;
Str :=Str+StrField;
Str :=copy(Str,1,length(Str)-1)+')';
Str :=Str+' values('+StrValues;
Str :=copy(Str,1,length(Str)-1)+' )';
query1.sql.text :=Str;
//加上数值
for k:=0 to P_LinkCount -1 do
begin
//只有四种格式的字段类型
if not ((uppercase(P_Link[k].DataCode.DATA_TYPE)='VARCHAR2') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='CHAR') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='NUMBER') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='DATE')) then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',该列数据格式不支持!');
LBz1 :=true;
continue;
end;
//和字段类型有关,现在只支持四中类型
//和字段长度有关
if (uppercase(P_Link[k].DataCode.DATA_TYPE)='VARCHAR2') or
(uppercase(P_Link[k].DataCode.DATA_TYPE)='CHAR') then
begin
if uppercase(P_Link[k].DataCode.NULLABLE)='N' then
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值为空,而字段为非空!');
LBz1 :=true;
continue;
end;
end;
if length(Values[strtoint(P_Link[k].DataCode.LinkCol)])
>strtoint(P_Link[k].DataCode.DATA_LENGTH) then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值超过长度!');
LBz1 :=true;
continue;
end
else
begin
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :=
Values[strtoint(P_Link[k].DataCode.LinkCol)];
end;
end;
if uppercase(P_Link[k].DataCode.DATA_TYPE)='DATE' then
begin
if uppercase(P_Link[k].DataCode.NULLABLE)='N' then
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值为空,而字段为非空!');
LBz1 :=true;
continue;
end;
end;
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])<>'' then
begin
try
strtodatetime(Values[strtoint(P_Link[k].DataCode.LinkCol)]);
except
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',时间格式错误!');
LBz1 :=true;
continue;
end;
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asdatetime :=
strtodatetime(Values[strtoint(P_Link[k].DataCode.LinkCol)]);
end
else
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :='';
end;
if uppercase(P_Link[k].DataCode.DATA_TYPE)='NUMBER' then
begin
if uppercase(P_Link[k].DataCode.NULLABLE)='N' then
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值为空,而字段为非空!');
LBz1 :=true;
continue;
end;
end;
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])<>'' then
begin
try
strtoint64(Values[strtoint(P_Link[k].DataCode.LinkCol)]);
except
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',不是数字,错误!');
LBz1 :=true;
continue;
end;
end;
//数字麻烦
if length(Values[strtoint(P_Link[k].DataCode.LinkCol)])
>strtoint(P_Link[k].DataCode.DATA_LENGTH) then
begin
memo2.Lines.add('第'+inttostr(i+1)+'行'+'第'+inttostr(k+1)+'列'
+',数值超过长度!');
LBz1 :=true;
continue;
end
else
begin
if trim(Values[strtoint(P_Link[k].DataCode.LinkCol)])='' then
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :=''
else
query1.ParamByName(P_Link[k].DataCode.COLUMN_NAME).asstring :=
Values[strtoint(P_Link[k].DataCode.LinkCol)];
end;
end;
end;//end for k:=0 to P_LinkCount -1 do
if LBz1 then
begin
LBz :=true;
continue;
end
else
LBz1 :=false;
try
Dm_Main.Databasedh.StartTransaction;
query1.ExecSQL;
Dm_Main.Databasedh.Commit;
except
Memo2.Lines.add('第'+inttostr(i+1)+'行出错'+' :违反唯一性原则或者其他数据库原因');
Dm_Main.Databasedh.Rollback;
LBz :=true;
continue;
end;
end;
end;
PnlPrint.Visible :=false;
//万一有错,不好跟踪那条,还是把出错的都记录下来呢?
if LBz=false then
messagedlg('导入数据成功!',mtInformation ,[mbok],0)
else
messagedlg('导入数据中出现错误,请查看错误日志!',mtInformation ,[mbok],0);
button3.Enabled :=false;
end;
procedure TFrm_ImportData.FormShow(Sender: TObject);
var
Ldata:TDataCode1;
str :string;
begin
button3.Enabled :=false;
P_Add :=false;
Panel4.Visible :=false;
PnlPrint.Visible :=false;
P_TxtOrExcel :=false;
ListView1.Columns.Clear;
ListView1.Items.Clear;
ListView1.Visible :=false;
CheckBox1.Checked :=true;
Edit1.text :='';
Memo1.Clear;
P_Title :=true;
//初始化表名的下拉框
FreeNodeCombobox(Combobox);
ComboBox.Clear;
//如果配置表建出来了,要进行改动
query1.close;
query1.sql.text :=
'Select distinct TABLE_NAME FROM user_tab_columns ';
query1.open;
query1.First;
while not query1.Eof do
begin
//得到表注释
query2.close;
query2.sql.Text :=
'Select COMMENTS FROM USER_TAB_COMMENTS where TABLE_NAME='
+#39+query1.FieldByName('TABLE_NAME').AsString+#39;
query2.open;
str :=query2.Fields[0].asstring;
if trim(str) <>'' then
begin
Ldata:=TdataCode1.Create;
Ldata.Code:=trim(query1.FieldByName('TABLE_NAME').AsString);
ComboBox.Items.AddObject(trim(str),Ldata);
end;
query1.Next;
end;
if trim(P_InTableName)<>'' then
begin
combobox.ItemIndex :=GetCodeIndex(combobox,trim(P_InTableName));
end;
end;
procedure TFrm_ImportData.Panel4DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
accept:=true; //允许拖放该控件
end;
procedure TFrm_ImportData.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -