2015-07-29 4 views
0

Я пытаюсь написать оператор CREATE TABLE для Microsoft Access (который должен выполняться через приложение C#/.NET с использованием OleDbConnection), используя атрибут WITH COMPRESSION, чтобы создавать столбцы символов (TEXT) с использованием однобайтовых символов чем двухбайтовые символы Юникода, как описано в MSDN here.MS Access CREATE TABLE "WITH COMPRESSION" синтаксис?

Атрибут WITH COMPRESSION может использоваться только с типами данных CHARACTER и MEMO (также называемыми TEXT) и их синонимами.

Атрибут WITH COMPRESSION был добавлен для столбцов CHARACTER из-за изменения формата представления символов в Юникоде. Для символов Юникода одинаково требуется два байта для каждого символа. Для существующих баз данных Microsoft® Jet, содержащих преимущественно персональные данные, это может означать, что файл базы данных почти удваивается по размеру при преобразовании в формат ядра базы данных Microsoft Access. Однако представление Unicode многих наборов символов, ранее обозначаемых как однобайтовые наборы символов (SBCS), можно легко сжать в один байт. Если вы определяете столбец CHARACTER с этим атрибутом, данные будут автоматически сжаты, поскольку они будут сохранены и несжаты при извлечении из столбца.

Когда я пытаюсь выполнить следующую инструкцию (которая, я считаю, синтаксически корректна для MSDN) через OleDbConnection, я получаю синтаксическую ошибку.

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

Ошибка при выполнении вашего оператора 'CREATE TABLE' с' CurrentProject.Connection.Execute' в Access 2010. Тогда, с этой таблицей в представлении Design, свойство * Unicode Compression * поля является * True *, как и ожидалось , Есть ли больше сообщений об ошибках, чем просто «синтаксическая ошибка» *? – HansUp

+0

Я не использую VBA или любое кодирование в Access - я использую C# и OleDbConnection. Но я получаю ту же ошибку, если я создаю новый запрос в MS Access, перейдите в «SQL View» и попробуйте запустить вышеприведенный оператор CREATE TABLE. –

+1

Вы должны делать что-то не так в своем проекте C#. [Этот код] (http://pastebin.com/QYXC1FvY) отлично подходит для меня. –

ответ

1

Моя проблема оказалась синтаксической ошибкой, которая не была правильно отражена в моем исходном вопросе.

Однако решение этой проблемы показало, что документация по MS Access CREATE TABLE на MSDN https://msdn.microsoft.com/en-us/library/office/ff837200.aspx неверна в отношении последовательности атрибутов для оператора CREATE TABLE. Согласно документации, синтаксис:

CREATE [TEMPORARY] TABLE таблица (field1 типа [(размер)] [NOT NULL] [с компрессией | С COMP] [index1] [, field2 типа [(размер)] [NOT NULL] [index2] [, ...]] [, скованность multifieldindex [, ...]])

, но на самом деле, [WITH COMPRESSION | WITH COMP] должен появиться перед тем[NOT NULL] или вы получите синтаксическую ошибку.

Кроме того, невозможно выполнить оператор CREATE TABLE с использованием атрибута WITH COMPRESSION из запроса непосредственно в MS Access. Вы должны либо использовать VBA, либо (как в моем случае) внешнюю программу через OleDbConnection.

Смежные вопросы