Можно ли создать проверочное ограничение в доступе и / или DAO? - PullRequest
0 голосов
/ 02 ноября 2009

Я пытаюсь создать проверочное ограничение для таблицы доступа (jet?).

Итак, я открываю файл .mdb с доступом, захожу в запросы-> создать запрос в режиме конструктора, наберите esc, затем menu-> view-> query и, наконец, наберите

создать таблицу X ( число, проверка (> 20) )

но access считает, что у меня "синтаксическая ошибка в определении поля". Однако я так не думаю. Поэтому мой вопрос: возможно ли создать проверочное ограничение с доступом. Если так: как.

Кроме того, я хотел бы создать ограничение с помощью dao / vba, а не в графическом интерфейсе. Это возможно?

И, наконец, несколько примечание: как вводить операторы sql в доступ? Я не могу себе представить, что мне нужно использовать запросы-> представление дизайна-> запрос-> просмотр маршрута, чтобы сделать это. Я привык к Oracle * Plus, который мне очень нравится, и я надеюсь, что есть что-то подобное и для доступа.

Спасибо за любой вклад Rene

Ответы [ 4 ]

2 голосов
/ 02 ноября 2009

Вот несколько заметок.

Вы можете создать сквозной запрос для Oracle (выберите меню «Запрос»> «Специфичный для SQL»> «Сквозной»)

Начиная с Access 2003, вы можете выбрать SQL Server совместимый синтаксис (ANSI 92) (http://office.microsoft.com/en-us/access/HA010345621033.aspx)

Правило проверки с VBA / DAO

''Reference: Microsoft DAO x.x Object Library

Dim tdf As TableDef
Dim db As Database

Set db = CurrentDb

Set tdf = db.TableDefs("Table1")

tdf.Fields("aDouble").ValidationRule = "<10"
tdf.Fields("aDouble").ValidationText = "Must be less than 10"

Ограничения с ADO / VBA. См. [Промежуточный Microsoft Jet SQL для Access 2000] (http://msdn.microsoft.com/en-us/library/aa140015(office.10).aspx)

''Reference: Microsoft ADO Ext. x.x for DDL and Security

Dim cn As ADODB.Connection 'For action queries
Dim rs As ADODB.Recordset  'For select queries
Dim s As String
Dim RecordsAffected As Long

Set cn = CurrentProject.Connection

''You can store sql in a table
s = DLookup("SQLText", "sysSQL", "ObjectName='q1'")
''Result: CREATE TABLE tblCreditLimit (LIMIT DOUBLE)
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

''You can run queries from VBA
s = "INSERT INTO tblCreditLimit VALUES (100)"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "CREATE TABLE tblCustomers (CustomerID COUNTER, CustomerName Text(50))"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "INSERT INTO tblCustomers VALUES (1, 'ABC Co')"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "ALTER TABLE tblCustomers " _
   & "ADD COLUMN CustomerLimit DOUBLE"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

''You can add contraints using ADO like so:
s = "ALTER TABLE tblCustomers " _
   & "ADD CONSTRAINT LimitRule " _
   & "CHECK (CustomerLimit <= (SELECT LIMIT " _
   & "FROM tblCreditLimit))"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "UPDATE tblCustomers " _
   & "SET CustomerLimit = 200 " _
   & "WHERE CustomerID = 1"
''Error occurs here
cn.Execute s, RecordsAffected

s = "UPDATE tblCustomers " _
   & "SET CustomerLimit = 90 " _
   & "WHERE CustomerID = 1"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

''Clean up
''You cannot do this through the database window,
''because of the constraint.
s = "ALTER TABLE tblCustomers DROP CONSTRAINT LimitRule "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "DROP TABLE tblCustomers "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "DROP TABLE tblCreditLimit "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected
1 голос
/ 02 ноября 2009

Для этого в Access необходимо сначала открыть интерфейс в ANSI-92 Query Mode . Я проверил ваш код SQL DDL: он отлично работает и создает столбец типа FLOAT (Double).

Невозможно сделать это с помощью DAO, но вы можете использовать ADO. Короче говоря: ограничения CHECK были введены в движок в эпоху Jet 4.0, когда группа доступа предпочитала ADO. Начиная с Access2007, команда Access вернулась к предпочтению DAO, но еще не закрыла «дыры» Jet 4.0 в DAO. Таким образом, для большинства функциональных возможностей Jet 4.0 (сжимаемые типы данных, типы текстовых данных фиксированной длины, быстрые внешние ключи и т. Д.) Вам необходимо использовать ADO.

1 голос
/ 02 ноября 2009

В столбце есть правило проверки. Вы можете использовать VB для доступа. нет SQL * Плюс здесь ... Вы всегда можете использовать SQL Express в качестве источника данных - со всеми преимуществами реального сервера SQL и использовать доступ только в качестве фронта.

0 голосов
/ 02 ноября 2009

Вы не можете использовать стандартный ANSI в построителе запросов, ЕСЛИ ВЫ не установите базу данных как sql ansi-совместимую. Если вы измените этот параметр, вы МОЖЕТЕ использовать sql в построителе запросов, как и у вас. Однако я бы не рекомендовал изменять этот параметр для существующих баз данных.

Если вы это сделаете, вы можете ввести:

CREATE TABLE z1 
       (id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
check (id < 20),  
constraint Mypk primary key (id) )

Если вам не нужно сохранять sql в построителе запросов, просто нужно набрать sql, затем просто нажмите ctrl-g, чтобы получить приглашение командной строки для доступа, и затем вы можете набрать:

currentproject.Connection.Execute "CREATE TABLE
    z1(id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
    check (id < 20),
    constraint Mypk primary key (id) )"

Выше будет напечатано в одну строку. Таким образом, вы можете использовать командную строку, если хотите ..

...