插入一条新纪录时,如何在程序里控制字段“编号”不能重复,ACCESS库,
字段“编号”设有主键,编号为数字,没有用自己动编号,也没有规律
因为我现在要导入大量计录(文本导入到库存,2万条),这些计录中有不少是在表里已有的,我要把记录编号不一样的导入到库,不一样的不导入,我用的是ADOTABLE写库
try
adotable.append;
adotable.post;
except
 on EdatabaseError do System.Continue;
end;
这样写时,只是导入记录有一条和库中的相同就所有记录都不导入。
怎么解决啊?

解决方案 »

  1.   

    try
    if not Locate('编号', 要插入的编号, [loCaseInsensitive]) then//如果没找到,就添加
    begin
    adotable.append;
    adotable.post;
    end; //否则啥也不干
    except
     on EdatabaseError do System.Continue;
    end;
      

  2.   

    你这种方式不好,建议采用以下方式1、首先把所有数据倒入临时表
    2、从临时表中将原有数据删除,一条SQL语句即可 DELETE FROM 临时表 LEFT JOIN 原表 ON 条件 WHERE 删除条件
    3、把临时表中删除后的数据导入,也是一条SQL语句
      

  3.   

    使用临时表都不会?用数据表多久了?通过SQL建立一个临时表就行了,剩下的和普通操作一样用临时表最大的原因在于开始阶段不进行任何判断直接以SQL模式导入数据表,这当然快了。
    然后通过SQL模式把不要的数据删除,然后再导入要导的表中当数据库有索引的时候,导入2万条记录,一次一条共2万次和一次2万条工1次在速度上有天壤之别,可能差数10倍。当然,如果你在起事阶段调整好而且你的原始数据有固定格式,通过TXT的SQL直接过滤数据后再导入那会更快。如果是ACCESS数据表,2万条记录不用15秒。
      

  4.   

    设好了主建以后如果重复会报错啊,那程序也会报错,我没有做除错,因来还不会做
    insert into tb1 select * From [Text;Database=c:\a.txt;Format=Delimited()].a.txt
    还有,请问下上面这句是什么意思啊
    要用怎么改啊
      

  5.   

    哈哈,脑子终于开窍了,那么离成功已经不远了insert into tb1 select * From [Text;Database=c:\a.txt;Format=Delimited()].a.txt以SQL模式将TXT数据倒入ACCESS,后面的[]部分是TXT数据库引擎,和ACCESS的ADO是同类的东西
    如果你的tbl是临时表,如果这部分通过ADO引擎,那么2万条记录倒入也就是15秒,除非你的字段特多,不相信吗?通过Access的倒入导出功能看看把TXT文件直接导到Access中看要多长时间,那么这个时间就是你的执行时间。那里导完以后两个表一比对把临时表里的重复数据删除然后导入顺利搞定
      

  6.   

    脑子开窍
    没有啊,
    我现在还是一窍也不通啊!
    正在查找资料中,在这里先谢谢各位了
    特别是Hank(星星农场)
      

  7.   

    谢谢 Rubi(有点麻木了!还好世界杯开始了,业余生活可以更丰富了)
    呵呵 insert into tb1 select * From [Text;Database=c:\a.txt;Format=Delimited()].a.txt

    Delimited()是定义分隔符,如果是分号,用format=Delimited(;)
    但我的没有分隔符,只用定义数据宽度,
    比如我的数据每行是65个字节,分成15列,第一列5个字节,每二列1个字节......等怎么定义啊?
      

  8.   

    这么多天了怎么就一直不开窍其实这些问题Windows的帮助里面写的很清楚以前所说的可以察看Access的帮助, Rubi所说的直接察看Windows帮助,如果你不知道怎么找,打开 system32\odbcjet.hlp文件直接看帮助就行了
      

  9.   

    下面的文字是从Windows里面的帮助里面直接拷出的
    当使用 Text 驱动程序时,正文文件的格式是用结构描述信息文件来决定的。结构描述信息文件总是命名为 Schema.ini,始终放在和文本数据源相同的目录中,它提供的 IISAM 有关于文件一般格式的信息、字段名和数据类型信息、和许多其它数据特征。访问固定长度的数据时,一定需要 Schema.ini 文件;当文本表包含日期时间、货币、或十进制数据时、或当要对数据表中的数据处理有更多的控制时,都应使用 Schema.ini 文件。注意   文本 ISAM 将从注册簿中获得初始值,而不是从 SCHEMA.ini。相同的缺省文件格式应用于所有新的文本数据表。所有由 CREATE TABLE 语句创建的文件会继承那些相同的缺省格式值,在“定义文本格式”对话框选取文件格式值,并在“表”列表框中选择的 “缺省”便能设置那些缺省格式值。如果在注册簿中的值不同於在 SCHEMA.ini 中的值,SCHEMA.ini 的值将改写注册簿中的值。介绍 Schema.ini 文件Schema.ini 文件提供关于正文文件中记录的结构描述信息。每一个 Schema.ini 项目指定表的五个特征中的一个:?正文文件名称
    ?文件格式
    ?字段名、宽度、和类型
    ?字符集
    ?特殊的数据类型转换下列讨论这些特征。指定文件名Schema.ini 中的第一项始终是括在方括号中的文本源文件的名称。下面就是 Sample.txt 文件的这一项:“Sample.txt”指定文件格式Schema.ini 中的 Format 选项指定了正文文件的格式。Text IISAM 能自动地从大多数字符分隔的文件中读入格式。可用除双引号 (? 之外的任何单一字符当做为文件中的分隔符。在 Schema.ini 中的 Format 设置会覆盖每个文件的 Windows 注册中的设置。下列表格列出在 Format 选项中的有效数。格式说明符 表的格式
    TabDelimited 文件中的字段由 tab 符分隔。
    CSVDelimited 文件中的字段由逗点(逗点分隔的值)分隔。
    Delimited(*) 文件中的字段由星号分隔。可用除双引号之外的任何字符来代替星号。
    FixedLength 在文件中的字段属于固定长度。
    例如,要指定逗点分隔的格式,可在 Schema.ini 中添加:Format=CSVDelimited指定字段可以用二种方法,在字符分隔的正文文件中指定字段名:?在表的第一行中包含字段名,并设定 ColNameHeader 为 TRUE。
    ?用数字指定每一列,并设计列的名称和数据类型。对于固定长度文件,必须用数字指定每一列,并设计列的名称、数据类型及宽度。注意   Schema.ini 的 ColNameHeader 设置会覆盖每个文件的 Windows 注册簿中的 FirstRowHasNames 设置。也能决定字段的数据类型。使用 MaxScanRows 选项指出当决定列的类型时,应该扫描多少行。如果 MaxScanRows 设置为 0,则会扫描整个文件。在 Schema.ini 中的 MaxScanRows 设置会覆盖每个文件的 Windows 注册簿中的设置。下面的两行代码指出,Microsoft Jet 应使用表的第一行的数据来决定字段名,应该检验整个文件来决定使用的数据类型:ColNameHeader=True
    MaxScanRows=0下一项是利用列号 (Coln) 选项来设计表中的字段,这对于字符分隔文件是可选的,而对固定长度文件是必需的,下面的两行是两个字段的对应项:一个是 10 
    个字符的 CustomerNumber 文本字段,另一个是 30 个字符的 CustomerName 文本字段:Col1=CustomerNumber Text Width 10
    Col2=CustomerName Text Width 30Coln 的语法是:Coln=ColumnName type “Width #”Coln 项目的每一部分是:参数 描述
    ColumnName 列的文本名称。如果列名包含空格,必须用双引号括起来。
    type 数据类型是:Microsoft Jet 数据类型
    Bit
    Byte
    Short
    Long
    Currency
    Single
    Double
    DateTime
    Text
    MemoODBC 数据类型
    Char(和文本相同)
    Float(和 Double 相同)
    Integer(和 Short 相同)
    LongChar(和 Memo 相同)
    Date 日期格式
    Width 文本字符串值 Width。指出后面列宽度的数字(对于字符分隔的文件而言这是可选的,对于固定长度文件而言这是必需的)。
    # 指定列宽度的整型值(如果指定了 Width,则是必需的)。
    选取字符集可以从二个字符集中选取一个:ANSI 和 OEM。下列示例显示在 Schema.ini 中选取 OEM 字符集的项。在 Schema.ini 中的 CharacterSet 设置会覆盖每个文件在 Windows 注册簿中的设置。下列示例显示在 Schema.ini 中选取字符集为 ANSI 的设置:CharacterSet=ANSI指定数据类型格式和转换Schema.ini 文件包含一些可用来指定数据如何转换或显示的选项。下表列出每一个选项。选项  描述
    DateTimeFormat 可以设定指定日期和时间格式的字符串。如果在导入/导出中的所有日期/时间字段都用相同的格式处理,应该指定此项目。除 A.M. 和 P.M. 之外的所有 Microsoft Jet 格式都支持。若不规定格式字符串,则使用 Windows “控制面板” 的 “简短日期” 格式和 “时间” 选项。
    DecimalSymbol 用来设定分隔整数部分与小数部分的单一字符。
    NumberDigits 指出数值的小数部分的位数。
    NumberLeadingZeros 指定小于 1 并且大于 -1 的十进制值数是否应该包含前导零;此值可以是 False (没有前导零)或 True。
    CurrencySymbol 指出在正文文件中货币值使用的货币符号。例如美元符号 ($) 和 Dm。
    CurrencyPosFormat 可以设定为下列任何值:?货币符号在前且没有分隔 ($1)?货币符号在後且没有分隔 (1$)?货币符号在前且有一个分隔 ($ 1)?货币符号在後且有一个分隔 (1 $)
    CurrencyDigits 指定用作货币量的小数部分的位数。
    CurrencyNegFormat 可设定为下列值之一:?($1)?-$1?$-1?$1-?(1$)?-1$?1-$?1$-?-1 $?-$ 1?1 $-?$ 1-?$ -1?1- $?($ 1) ?(1 $)此示例显示美元符号,但在实际程序中应该用适当的 CurrencySymbol 值取代它。
    CurrencyThousandSymbol 指出在正文文件中以千位来分隔货币值的单一字符符号。
    CurrencyDecimalSymbol 设定用来分隔整个货币量的小数部分的单一字符。
    注意   不管省略哪一项,系统会使用在 Windows “控制面板” 的缺省值。
      

  10.   

    知道怎么做了,但好像schema.ini文件一定要和导入的TXT文件同事个目录,能不能把schema.ini文件里的内容写到程序里呢?