#sql #ms-access
Вопрос:
Я хочу программно создать новый столбец в таблице MS Access. Я перепробовал много перестановок ALTER TABLE MyTable Add MyField DECIMAL (9,4) NULL;
и получил:
Синтаксическая ошибка в определении поля
Я могу легко создать числовое поле, которое относится к Double
типу, но я хочу decimal
. Я бы очень сильно предпочел сделать это в одном ALTER TABLE
операторе и не создавать поле, а затем изменять его.
Я использую Access 2003.
Ответ №1:
Десятичный тип данных не поддерживается в mdb-файле Jet 4.0 по умолчанию. Вы должны использовать параметр Синтаксис совместимости SQL Server (ANSI 92), чтобы использовать десятичный тип данных в окне SQL.
Нажмите на меню «Инструменты» > «Параметры». Перейдите на вкладку Таблицы/Запрос. Установите флажок «Эта база данных» в разделе Синтаксис совместимости SQL Server (ANSI 92). Этот режим повлияет на всю базу данных, включая запросы с подстановочными знаками, поэтому вы можете попробовать это на копии своей базы данных.
Вставьте это в окно SQL:
ALTER TABLE MyTable
Add COLUMN MyField DECIMAL (9,4) NULL;
Если вы не хотите изменять режим своей базы данных, вы должны использовать код vba с библиотекой adodb:
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
conn.Execute "ALTER TABLE MyTable " _
amp; "ADD COLUMN MyField DECIMAL (9,4) NULL;"
conn.Close
Ответ №2:
Если вы хотите создать новый столбец в таблице доступа, легко использовать объект DAO.TableDef:
Dim my_tableDef As DAO.TableDef
Dim my_field As DAO.Field
Set my_tableDef = currentDb.TableDefs(my_table)
Set my_Field = my_tableDef.CreateField(my_fieldName, dbDecimal, myFieldSize)
my_Field.decimalPlaces = myDecimalPlaces
my_Field.defaultValue = myDefaultValue
my_tableDef.Fields.Append my_Field
set my_Field = nothing
set my_tableDef = nothing
Конечно, вы можете дополнительно удалить его.
Возможно, у вас есть возможность сделать это с помощью объекта ADODB (или ADOX?), Но пока вы работаете с mdb-файлом, DAO прост и эффективен.
PS: после проверки на некоторых форумах кажется, что есть ошибка с десятичными полями и DAO. http://allenbrowne.com/bug-08.html. Советы-это «удвоить»(что я обычно делаю, чтобы избежать каких-либо проблем, связанных с десятичным округлением) или использовать ADO «implicite» для изменения вашей базы данных
strSql = "ALTER TABLE MyTable ADD COLUMN MyField DECIMAL (28,3);"
CurrentProject.Connection.Execute strSql
Ответ №3:
Синтаксис ALTER TABLE поддерживается только в Jet 4.0/ACE в режиме запросов ANSI-92. Попробуйте подключиться к ADO, например
Текущий проект.Соединение.Выполните команду «ИЗМЕНИТЬ ТАБЛИЦУ myTbl, ДОБАВИТЬ СТОЛБЕЦ MyColumn ДЕСЯТИЧНЫЙ(9,4)»