我正在尝试为Microsoft Access编写CREATE TABLE
语句(使用OleDbConnection通过C#/ .NET应用程序执行),利用WITH COMPRESSION
属性导致字符列(TEXT)使用单字节字符而不是Unicode双字节字符创建,如MSDN here中所述。
WITH COMPRESSION属性只能与CHARACTER和MEMO(也称为TEXT)数据类型及其同义词一起使用。
由于Unicode字符表示格式的更改,为CHARACTER列添加了WITH COMPRESSION属性。 Unicode字符统一需要每个字符两个字节。对于主要包含字符数据的现有Microsoft®Jet数据库,这可能意味着转换为Microsoft Access数据库引擎格式时,数据库文件的大小几乎会翻倍。但是,许多字符集的Unicode表示(以前称为单字节字符集(SBCS))可以很容易地压缩为单个字节。如果使用此属性定义CHARACTER列,则数据将在存储时自动压缩,并在从列中检索时解压缩。
当我尝试通过OleDbConnection执行以下语句(我相信每个MSDN在语法上是正确的)时,我收到语法错误。
CREATE TABLE [Foo] ([COL1] TEXT(255) WITH COMPRESSION)
同样,在MS Access 2013中直接执行相同的语句作为查询会在WITH
处出现语法错误。
执行
CurrentProject.Connection.Execute("CREATE TABLE [Foo1] ([COL1] TEXT(255) WITH COMPRESSION)")
但是,来自Access VBA 的可以正常工作。
如果我取出WITH COMPRESSION
属性,该语句将通过OleDb并直接在MS Access中执行而不会出错。
任何想法我做错了什么?
答案 0 :(得分:1)
我的问题原来是一个语法错误,在我原来的问题中没有正确反映出来。
但是,解决该问题表明,MSDN https://msdn.microsoft.com/en-us/library/office/ff837200.aspx上的MS Access CREATE TABLE
文档关于CREATE TABLE语句的属性序列是不正确的。根据文档,语法是:
CREATE [TEMPORARY] TABLE表(field1类型[(大小)] [NOT NULL] [WITH COMPRESSION | WITH COMP] [index1] [,field2类型[(大小)] [NOT NULL] [index2] [,... ]] [,CONSTRAINT multifieldindex [,...]])
但事实上,[WITH COMPRESSION | WITH COMP]
必须在 [NOT NULL]
之前出现,否则会出现语法错误。
此外,无法使用MS Access中直接查询中的CREATE TABLE
属性执行WITH COMPRESSION
语句。您必须通过OleDbConnection
使用VBA或(在我的情况下)外部程序。
答案 1 :(得分:0)
我在" WITH COMPRESSION"和MS-ACCESS 2013 无法从查询窗口运行此类脚本。 可能来自VBA但有限制:
PLAY [localhost] *********************************************************************************
TASK [Debug inventory_hostname.] *****************************************************************
ok: [localhost] =>
inventory_hostname: localhost
TASK [Debug idempotent random string.] ***********************************************************
ok: [localhost] =>
msg: $6$rounds=656000$21889$o7dtKP5aAPzYxyDIn9wbTRJMoQboNXtp0snNtTDvcU030aKvMyxsLzTGUuunG/hW2lBSLh/MS/C/c6Dx/uXo51
" ... WITH COMPRESSION" - > " CREATE中的语法错误
表" currentdb.Execute
" ..." - >确定
我确认了什么"先生。 T"说:在NOT NULL
之前,WITH COMPRESSION 必须出现