1

我正在尝试使用 VBA 脚本将我的数据库导出为 .dbf,但 dbf 要求数据库具有特定的列大小值。

当我将列保留在 Access 中时,我收到一条错误消息

field will not fit in record

如何单独设置每列的列大小?最好在生成表时,这样我就不必每次生成带有查询的新表时手动进行

我在哪里设置它们?(在查询中还是在 SQL 中?)

提前致谢!


编辑:

我已经确保它是给我错误的字段大小值。我通过在设计视图中打开表格手动更改了所有字段大小值。

所以现在我的问题的第二部分变得更加重要。是否可以在生成表格时设置字段大小。


编辑2:

我目前在查询中使用 SQL 来创建表,如下所示:

SELECT * INTO DB_Total
FROM Tags_AI_DB;

完成初始设置后DB_Total,我使用了几个Insert into查询来添加其他行:

INSERT INTO DB_TOTAL
SELECT a.*
FROM Tags_STS_ENA_DB AS a 
LEFT JOIN DB_TOTAL AS b 
ON a.NAME = b.NAME
WHERE b.NAME IS NULL;

DB_Total如果我在使用查询生成表时设置了表中的列值,那么在使用查询插入更多行Select into后它们是否仍然具有这些值?Insert Into


编辑3:

我决定(根据您的一些建议和同事的一些建议,最好先制作我的表,然后用查询更新此表。

但是,似乎我在使用 Access 时遇到了死胡同,这是我正在使用的代码:

CREATE TABLE DB_Total ("NAME" char(79),"TYPE" char(16), "UNIT" char(31), 
"ADDR" char(254), "RAW_ZERO" char(11), "RAW_FULL" char(11), "ENG_ZERO" char(11), 
"ENG_FULL" char(11), "ENG_UNIT" char(8), "FORMAT" char(11), "COMMENT" char(254), 
"EDITCODE" char(8), "LINKED" char(1), "OID" char(10), "REF1" char(11), "REF2" char(11),
"DEADBAND" char(11), "CUSTOM" char(128), "TAGGENLINK" char(32), "CLUSTER" char(16), 
"EQUIP" char(254), "ITEM" char(63), "HISTORIAN" char(6), 
"CUSTOM1" char(254), "CUSTOM2" char(254), "CUSTOM3" char(254), "CUSTOM4" char(254), 
"CUSTOM5" char(254), "CUSTOM6" char(254), "CUSTOM7" char(254), "CUSTOM8" char(254))

这些是我制作被我们使用的应用程序接受的 DBF 文件所需的所有列。

当这产生以下错误时,您会理解我的悲伤:

Record is too large

我能做些什么来使这张桌子正常工作吗?

4

2 回答 2

1

更新

Access 2007 的最大记录大小约为 2kB(毫无疑问有人会更正该值)当您创建 CHAR(255) 时,无论字段中的内容如何,​​它将使用 255 个字节的空间。
相比之下,VARCHAR 不会占用空间(仅足以定义它们),直到您将某些内容放入字段中,它们会动态增长。

CHAR(x)将s更改为VARCHAR(x)s 您会将表格的长度缩小到允许的值内。请注意,如果您尝试插入的行大于 2kB 限制,您可能会遇到麻烦。


以前的

生成表时指定列长度的方法是使用CREATE TABLE语句而不是SELECT * INTO.

CREATE TABLE DB_Total
(
 Column1Name NVARCHAR(255) --Use whatever datatype and length you need
,Column2Name NUMERIC(18,0) --Use whatever datatype and length you need
,...
) ;

INSERT INTO DB_Total
....

如果使用SELECT * INTO语句,SQL 将使用它在现有数据中找到的任何字段长度和类型。

在插入语句中列出列名也是一种更好的做法,所以不要

INSERT INTO DB_TOTAL
SELECT a.*

你应该把:

INSERT INTO DB_Total
       (
        Column1Name
       ,Column2Name
       ,...
       )
SELECT  a.Column1Name
       ,a.Column2Name
       ,...
FROM   ...
WHERE  ... ;
于 2013-02-26T11:49:20.583 回答
1

Edit2中,您指出您的流程以“制作表”( SELECT INTO) 查询开始,该查询创建DB_Total并使用来自Tags_AI_DB. 然后运行一系列“追加”( INSERT) 查询以添加来自其他表的数据。

现在您的问题是您需要特定的字段大小设置DB_Total,但无法使用“制作表”查询来定义这些大小。

我认为您应该创建DB_Total一次并根据需要设置字段大小。使用设计视图中的表手动执行此操作,或者CREATE TABLE如果您愿意,可以执行语句。

然后忘记“make table”查询,只使用“append”查询来添加数据。

如果问题是这是一个重复操作,并且您想在导入新数据之前丢弃以前的数据,请执行DELETE FROM DB_Total而不是DROP TABLE DB_Total. 这将允许您保留(现在为空)DB_Total表的结构,因此您无需再次设置字段大小。

在我看来,唯一的潜在问题可能是源表的结构是否发生变化。如果发生这种情况,请修改 的结构DB_Total,使其再次兼容。

于 2013-02-26T18:59:37.637 回答