如何让EXCEL导入SQL的数据不能有重复?

huashimi 2013-04-20 10:02:43
数据库中的表将多个字段一块设为主键,如何实现将数据从Excel中导入到SQL中,不能有重复
...全文
443 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
richardi 2013-04-28
  • 打赏
  • 举报
回复
SQl.Add('INSERT INTO 销售数据表(销售日期,产品型号,产品名称,销售数量,销售价格,员工编号,销售员,所属部门,销售金额) values(:date,:type,:name,:sl,:pice,:bh,:yg,:bm,:money)'); parameters.ParamByName('date').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow].value); 你excel表中的数据类型转换成sqlserver用的日期类型时出错,你应该先把msExcel.WorkSheets[1].Cells[iCol,iRow].value转换成日期类型,再赋值给ParamByName('date')
simonhehe 2013-04-23
  • 打赏
  • 举报
回复
引用 5 楼 huashimi 的回复:
Delphi/Pascal code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576procedure TForm12.Button4……
数据类型没匹配上 直接读excel时有些类型可能转换了, 无法正确导入, 你可以断点逐条过一下, 看看问题所在. ps 一般这种导表, 用一个query打开xls, 一个query打开目标数据表, 然后导入, 可防止读取时数据类型转换
simonhehe 2013-04-22
  • 打赏
  • 举报
回复
如果是库对库导入, 也可以用1楼的方法导入临时表, 然后用主键分组, 再导入正式表
simonhehe 2013-04-22
  • 打赏
  • 举报
回复
引用 楼主 huashimi 的回复:
数据库中的表将多个字段一块设为主键,如何实现将数据从Excel中导入到SQL中,不能有重复
设置了联合主键,就能保证唯一性. 为解决导入数据时的主键冲突, 可以用异常机制处理掉
babydog01 2013-04-22
  • 打赏
  • 举报
回复
跨库有效率问题,可以先整个excel表导入SQL一个临时表,再用SQL语句添加到指定表中。
  • 打赏
  • 举报
回复
procedure TTEORDFO.dxBarLargeButton1Click(Sender: TObject);
//引用
uses ComObj
var
    ASql, APath: String;
    ExcelApp: Variant;
    AInt: Integer;
begin
  with ADOQuery2 do
    begin
        Close;
        sql.Clear;
        SQL.Add('select MAX(SDREN) as SDREN from TEORDL');
        Open;
        if FieldByName('SDREN').AsString<>'' then
        begin
         MessageBox(Self.Handle,'你数据库有未完成的导入的数据,请等待之前的数据完成在导入!','系统提示',mb_iconquestion);
        end
        else
        begin

                  if messagebox(Self.Handle,'你确定要导入联想TMS数据导入?','系统提示',mb_yesno+mb_iconquestion)=idyes then
                      begin
                          If OpenDialog1.Execute Then
                            APath := OpenDialog1.FileName
                          Else
                            Exit;

                          If not FileExists(APath) Then
                            Begin
                              messagebox(self.Handle,'你选择的文件不存,请核对','提示信息',mb_iconinformation);
                              Exit;
                            End;
                          Try
                            Application.ProcessMessages;
                            ExcelApp := CreateOleObject('Excel.Application');
                            ExcelApp.Workbooks.Open(APath);
                            ExcelApp.WorkSheets[1].Activate;

                            ASql := 'select * from TEORDL where 1=2';     //表名 ,也可以在show里面先打开数据集
                             ADOQuery1.Close;       //数据集的 LockType属性 要设为 ltBatchOptimistic
                             ADOQuery1.SQL.Text := ASql;    //才可以批量保存
                             ADOQuery1.Open;


                            For AInt := 2 To ExcelApp.ActiveSheet.UsedRange.rows.count Do //AInt 起始行数,重哪行开始导入,Aint初始值就是几
                              Begin
                                     ADOQuery1.Append;
                                     ADOQuery1.FieldByName('SDDATE').AsDateTime := ExcelApp.Cells[AInt, 1].Value;   //Aint是第几行,后面的数字是第几列,
                                     ADOQuery1.FieldByName('SDREN').AsString := ExcelApp.Cells[AInt, 2].Value;
                                     ADOQuery1.FieldByName('KHNAME').AsString := ExcelApp.Cells[AInt, 3].Value;
                                     ADOQuery1.FieldByName('KHADDESS').AsString := ExcelApp.Cells[AInt, 4].Value;
                                     ADOQuery1.FieldByName('KHTEll').AsString := ExcelApp.Cells[AInt, 5].Value;
                                     ADOQuery1.FieldByName('KHTOPO').AsString := ExcelApp.Cells[AInt, 6].Value;
                                     ADOQuery1.FieldByName('SKUNAME').AsString := ExcelApp.Cells[AInt, 7].Value;
                                     ADOQuery1.FieldByName('SKU').AsString := ExcelApp.Cells[AInt, 8].Value;
                                     ADOQuery1.FieldByName('CQTY').AsFloat := ExcelApp.Cells[AInt, 9].Value;
                                     ADOQuery1.FieldByName('ZQTY').AsFloat := ExcelApp.Cells[AInt, 10].Value;
                                     ADOQuery1.FieldByName('JQTY').AsFloat := ExcelApp.Cells[AInt, 11].Value;
                                     ADOQuery1.Post;
                                   End;
                             Finally
                               ExcelApp.WorkBooks.Close;
                               ExcelApp.quit;
                             End;
                      end;

        end;
    end;
end;
suibianlai369 2013-04-22
  • 打赏
  • 举报
回复
很好,很实用
  • 打赏
  • 举报
回复
引用 5 楼 huashimi 的回复:
Delphi/Pascal code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576procedure TForm12.Button4……
你这个错误,是类型错了吧!
huashimi 2013-04-22
  • 打赏
  • 举报
回复

procedure TForm12.Button4Click(Sender: TObject);
const BeginRow= 1; BeginCol= 2;
var
i:Integer;
iRow,iCol :Integer; //列、行
MsExcel,MsExcelWorkBook,MsExcelWorkSheet:Variant;

begin
Try
OpenDialog1.FileName:='*.xls';
if not OpenDialog1.Execute then
begin
Exit;
end;
if ExtractFileExt(OpenDialog1.FileName) <> '.xls' then
begin
MessageBox(0, '请选择正确的Excel文件',PChar('提示'),MB_OK or MB_ICONWARNING);
Exit;
end;
MsExcel:=CreateOleObject('Excel.Application');
MsExcel.visible:=true;
MsExcelWorkBook:=MsExcel.WorkBooks.Open(OpenDialog1.FileName);
Except
Exit;
end;
//开始从EXCEL文件读取相关信息 ,并导入数据库中的销售数据表
Try

Application.ProcessMessages;//防止进程阻塞
iRow:=BeginRow;
iCol:=BeginCol;
while trim(MsExcel.WorkSheets['Sheet1'].Cells[iCol,iRow].value) <> '' do
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from 销售数据表 where 销售日期:='''+msExcel.WorkSheets[1].Cells[iCol,iRow].value+''' ');
open;
if ADOQuery1.RecordCount <=0 then
//begin
//with adoquery1 do
begin
//Close;
SQL.Clear;
SQl.Add('INSERT INTO 销售数据表(销售日期,产品型号,产品名称,销售数量,销售价格,员工编号,销售员,所属部门,销售金额) values(:date,:type,:name,:sl,:pice,:bh,:yg,:bm,:money)');
parameters.ParamByName('date').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow].value);
parameters.ParamByName('type').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+1].value);
parameters.ParamByName('name').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+2].value);
parameters.ParamByName('sl').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+3].value);
parameters.ParamByName('pice').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+4].value);
parameters.ParamByName('bh').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+5].value);
parameters.ParamByName('yg').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+6].value);
parameters.ParamByName('bm').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+7].value);
parameters.ParamByName('money').Value:=Trim(msExcel.WorkSheets[1].Cells[iCol,iRow+8].value);
ExecSQL;
iCol:=iCol+1;
//end;
end
else exit;
end;

end;
MsExcel.Quit;

Except
MessageBox(self.Handle,'数据导入失败!','系统提示',0);;
MsExcel.Quit;
Exit;
end;//end try
MessageBox(self.Handle,'数据导入成功!','系统提示',0);
MsExcel.Quit;
MsExcel := Unassigned;
MsExcelWorkBook := Unassigned;

end;



这是我做的,但是运行后点击导入之后总出现错误

不知道该怎么解决。各位高手帮帮忙。
huashimi 2013-04-22
  • 打赏
  • 举报
回复
请问具体如何实现呢?我是新手,弄了好久都弄不出来。。

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧