I’m just starting out experimenting with SQL on MS Access. I’m trying to insert data into a table, and I can’t figure out what I’m doing wrong here. I know it’s probably something simple so I apologize in advance. Thanks for any help you can give me!
Here’s what I’ve got:
CREATE TABLE DeathDay
(
ID INT PRIMARY KEY NOT NULL,
LastName CHAR(25),
FirstName CHAR(10),
DoB DATE,
DoD DATE
);
INSERT INTO DeathDay
VALUES (1,
'Breitenbach',
'Max',
'1991-05-17',
'2022-12-31');
I can create the table fine, but it gives me the following error message when I try to insert the data.
«Syntax error in CREATE TABLE statement»
Martin Smith
442k88 gold badges746 silver badges850 bronze badges
asked Jan 28, 2013 at 21:19
9
I just ran your scripts in separate query windows in MS Access 2010 and there was no error. However, if you try running them at the same time, you get an error:
Syntax error in CREATE TABLE statement
Based on my experience you cannot run multiple queries in the same query window.
If you want to run multiple queries then you want to use a script to process it.
answered Jan 28, 2013 at 21:28
TarynTaryn
244k57 gold badges364 silver badges405 bronze badges
3
In case anyone else comes to this question with the same problem as me, I found the issue to be keywords in my SQL statement. In my case «Currency». A list of reserved keywords is available here: http://allenbrowne.com/AppIssueBadWord.html the ones that are relevant to SQL are the Jet keywords.
answered Oct 17, 2013 at 8:49
majjammajjam
1,2962 gold badges15 silver badges33 bronze badges
|
0 / 0 / 0 Регистрация: 22.12.2020 Сообщений: 7 |
|
|
1 |
|
|
16.05.2021, 01:18. Показов 4508. Ответов 11
Здравствуйте! Помогите, пожалуйста. Нужна команда на SQL для создания четырех связанных таблиц в MS Access. Я пишу код, но при попытке сохранить его выскакивает сообщение «Ошибка синтаксиса в инструкции CREATE TABLE». Уже перерыла все методички, но решения проблемы так и не нашла. По методичке пишу правильно, но запрос упорно не хочет сохраняться. Должна получиться вот такая схема данных (см. вложение). Кликните здесь для просмотра всего текста
0 |
|
17406 / 7187 / 1627 Регистрация: 21.06.2012 Сообщений: 13,621 |
|
|
16.05.2021, 01:31 |
2 |
|
Возможно ли это реализовать? Возможно. Запросы нужно запускать по отдельности, так в Аксессе делается. А связи Вы и не создавали. Для их создания нужно делать CONSTRAINT … FOREIGN KEY.
1 |
|
0 / 0 / 0 Регистрация: 22.12.2020 Сообщений: 7 |
|
|
16.05.2021, 01:49 [ТС] |
3 |
|
Поняла, спасибо. Я пыталась писать запросы на создание таблиц со связями. Во вложении пример одного такого запроса. Таблица создается, а связь — нет. Что я делаю не так?.. Миниатюры
0 |
|
17406 / 7187 / 1627 Регистрация: 21.06.2012 Сообщений: 13,621 |
|
|
16.05.2021, 02:00 |
4 |
|
Выкладывайте SQL не картинками, а текстом, в тегах SQL. Нажали SQL (третья строка, 6 слева), появились и внутрь вставили текст. Ломать глаза, а потом стучать по клавишам нет никакого желания.
1 |
|
marusa122 0 / 0 / 0 Регистрация: 22.12.2020 Сообщений: 7 |
||||
|
16.05.2021, 02:06 [ТС] |
5 |
|||
|
Извините, я просто не знала, как это делать. Добавила.
0 |
|
ltv_1953 17406 / 7187 / 1627 Регистрация: 21.06.2012 Сообщений: 13,621 |
||||
|
16.05.2021, 02:18 |
6 |
|||
|
РешениеА CONSTRAINT где? И, естественно, таблицы Группы и Университеты должны быть созданы до выполнения этого запроса.
1 |
|
marusa122 0 / 0 / 0 Регистрация: 22.12.2020 Сообщений: 7 |
||||
|
16.05.2021, 02:44 [ТС] |
7 |
|||
|
Спасибо вам большое.
В режиме Конструктора (в уже созданной таблице) приходится вручную задавать маску ввода >L и правило проверки — «М» Or «Ж» . Возможно ли как-то дополнить запрос, чтобы при создании таблицы эти параметры устанавливались автоматически?
0 |
|
17406 / 7187 / 1627 Регистрация: 21.06.2012 Сообщений: 13,621 |
|
|
16.05.2021, 03:41 |
8 |
|
маску ввода > Это не маска ввода, а ограничение. Читайте документацию CONSTRAINT
1 |
|
0 / 0 / 0 Регистрация: 22.12.2020 Сообщений: 7 |
|
|
16.05.2021, 03:51 [ТС] |
9 |
|
Нет-нет, там именно маска ввода (она так и называется в Конструкторе)
0 |
|
17406 / 7187 / 1627 Регистрация: 21.06.2012 Сообщений: 13,621 |
|
|
16.05.2021, 04:09 |
10 |
|
Но куда вставлять и как оформлять в запросе маску ввода? Никуда. Нет такой возможности, если не конструкторе вручную, то только в VB, в DAO есть свойства полей таблицы. И все маски и т.п. (прочитал Вашу, как ограничение >1) лучше не делайте в таблицах, а только в формах. Вручную в таблицы вводить — дурной тон.
1 |
|
0 / 0 / 0 Регистрация: 22.12.2020 Сообщений: 7 |
|
|
16.05.2021, 04:18 [ТС] |
11 |
|
Большое вам спасибо))
0 |
|
17406 / 7187 / 1627 Регистрация: 21.06.2012 Сообщений: 13,621 |
|
|
16.05.2021, 04:42 |
12 |
|
Большое вам спасибо Да не за что. Все бы ТС так точно формулировали вопросы, воспринимали ответы, … .
1 |
I keep getting CREATE TABLE Syntax Error, but I don’t see the error! What is causing the error?
My SQL:
CREATE TABLE my_employee
(
employee_id INTEGER PRIMARY KEY NOT NULL,
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(30) NOT NULL,
address VARCHAR(10) NOT NULL,
birthdate DATE,
salary NUMERIC(8,2) DEFAULT 15000,
marital_status CHAR(1)
);
Newd
2,1952 gold badges18 silver badges32 bronze badges
asked Feb 19, 2013 at 18:17
2
Since your DDL statement includes DEFAULT, you must execute it with ADO. I loaded your statement into a string variable and executed it from Access 2007 like this:
CurrentProject.Connection.Execute strSql
The salary field is decimal with precision 8, scale 2, and default 15000.
DEFAULT is one of the Access SQL features added with Jet 4.0. Those features are not available for a statement executed from DAO. If you are using Access’ query designer to create and execute the statement, you’re using DAO. Same if you were using CurrentDb.Execute. But CurrentProject.Connection is an ADO object, so it can .Execute Jet 4.0 features.
Note NOT NULL is not necessary after PRIMARY KEY since PRIMARY KEY implies NOT NULL. However PRIMARY KEY NOT NULL does not trigger an error. The statement works as you originally wrote it as long as you execute it from ADO.
answered Feb 19, 2013 at 18:26
HansUpHansUp
96.1k11 gold badges77 silver badges135 bronze badges
1
Well I was having the same problem with Ms Access 2007, but I solved it later on.
It is because actually some features are disabled by default for security reasons over there.
When it shows you syntax error, you can see the message at menu bar somewhere or at the bottom: Some Features Are Disabled For Security Reasons....
Click on the message then proceed to enable further features.
Andre Silva
4,8109 gold badges52 silver badges65 bronze badges
answered May 19, 2013 at 15:57
RAFIARAFIA
111 bronze badge
As HansUp said: «default» in DDL doesn’t work here. As an alternative you can create the table without the default first and add the default via the TableDef afterwards:
CurrentDb().Execute "create table my_employee ..."
CurrentDb().TableDefs("my_employee").Fields("salary").DefaultValue = 15000
answered Aug 25, 2014 at 11:49
Your problem is in your PRIMARY KEY declaration
CREATE TABLE my_employee
(
employee_id INTEGER NOT NULL,
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(30) NOT NULL,
address VARCHAR(10) NOT NULL,
birthdate DATE,
salary NUMERIC(8,2) DEFAULT 15000,
marital_status CHAR(1),
PRIMARY KEY (employee_id)
);
answered Feb 19, 2013 at 18:38
1
I keep getting CREATE TABLE Syntax Error, but I don’t see the error! What is causing the error?
My SQL:
CREATE TABLE my_employee
(
employee_id INTEGER PRIMARY KEY NOT NULL,
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(30) NOT NULL,
address VARCHAR(10) NOT NULL,
birthdate DATE,
salary NUMERIC(8,2) DEFAULT 15000,
marital_status CHAR(1)
);
Newd
2,1762 gold badges17 silver badges31 bronze badges
asked Feb 19, 2013 at 18:17
2
Since your DDL statement includes DEFAULT, you must execute it with ADO. I loaded your statement into a string variable and executed it from Access 2007 like this:
CurrentProject.Connection.Execute strSql
The salary field is decimal with precision 8, scale 2, and default 15000.
DEFAULT is one of the Access SQL features added with Jet 4.0. Those features are not available for a statement executed from DAO. If you are using Access’ query designer to create and execute the statement, you’re using DAO. Same if you were using CurrentDb.Execute. But CurrentProject.Connection is an ADO object, so it can .Execute Jet 4.0 features.
Note NOT NULL is not necessary after PRIMARY KEY since PRIMARY KEY implies NOT NULL. However PRIMARY KEY NOT NULL does not trigger an error. The statement works as you originally wrote it as long as you execute it from ADO.
answered Feb 19, 2013 at 18:26
HansUpHansUp
95.8k11 gold badges76 silver badges135 bronze badges
1
Well I was having the same problem with Ms Access 2007, but I solved it later on.
It is because actually some features are disabled by default for security reasons over there.
When it shows you syntax error, you can see the message at menu bar somewhere or at the bottom: Some Features Are Disabled For Security Reasons....
Click on the message then proceed to enable further features.
Andre Silva
4,7729 gold badges52 silver badges65 bronze badges
answered May 19, 2013 at 15:57
RAFIARAFIA
111 bronze badge
As HansUp said: «default» in DDL doesn’t work here. As an alternative you can create the table without the default first and add the default via the TableDef afterwards:
CurrentDb().Execute "create table my_employee ..."
CurrentDb().TableDefs("my_employee").Fields("salary").DefaultValue = 15000
answered Aug 25, 2014 at 11:49
Your problem is in your PRIMARY KEY declaration
CREATE TABLE my_employee
(
employee_id INTEGER NOT NULL,
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(30) NOT NULL,
address VARCHAR(10) NOT NULL,
birthdate DATE,
salary NUMERIC(8,2) DEFAULT 15000,
marital_status CHAR(1),
PRIMARY KEY (employee_id)
);
answered Feb 19, 2013 at 18:38
1
I am running this SQL query in MS Access:
CREATE TABLE EX_P_TEMP
AS (SELECT
EXPORT_POSTING_ID, IMPORT_POSTING_ID, DIS,
MILE_SAVED, IMPORT_AVAILABLE
FROM POTENTIAL_PAIRS);
Error:
Syntax error in CREATE TABLE statement.
Where did I go wrong?
marc_s
729k175 gold badges1327 silver badges1455 bronze badges
asked Jul 4, 2015 at 20:34
3
That doesn’t look like valid Access syntax. If you are trying to create a new table based on the results of a SELECT, try this intead:
SELECT EXPORT_POSTING_ID, IMPORT_POSTING_ID, DIS, MILE_SAVED, IMPORT_AVAILABLE
INTO EX_P_TEMP
FROM POTENTIAL_PAIRS;
answered Jul 4, 2015 at 20:38
sstansstan
35.3k6 gold badges48 silver badges66 bronze badges
7
#sql #ms-access
#sql #ms-access
Вопрос:
Вот мой код, я пытаюсь создать несколько таблиц:
Create Table Order_t
(
Id AutoIncrement Not Null,
OrderDate DateTime Not Null,
CustId Int Not Null,
Primary Key(Id),
Foreign Key(CustId) References Customer_t(Id)
(;
Create Table PersonRole_t
(
PersonRoleID Autoincrement Not Null,
Person_ID int Not Null,
Primary Key(PersonRoleID, Person_ID),
Foreign Key(Person_ID) References Person_T(Person_ID)
(;
Create Table Product_t
(
Id Text(10) Not Null,
Name Text(30) Not Null,
Description Text(30),
Finish Text(30),
UnitPrice Currency Not Null,
Primary Key(Id)
) ;
Всякий раз, когда я запускаю его в Microsoft Access, я получаю сообщение об ошибке в инструкции CREATE TABLE (оно выделяет определение таблицы PersonRole_T). Не уверен, что делать, довольно новичок в SQL.
Ответ №1:
Используйте CLOSE скобки в конце CREATE инструкции Table вместо круглых OPEN скобок
Create Table Order_t
(
Id AutoIncrement Not Null,
OrderDate DateTime Not Null,
CustId Int Not Null,
Primary Key(Id),
Foreign Key(CustId) References Customer_t(Id)
); -- Not (;
Create Table PersonRole_t
(
PersonRoleID Autoincrement Not Null,
Person_ID int Not Null,
Primary Key(PersonRoleID, Person_ID),
Foreign Key(Person_ID) References Person_T(Person_ID)
); -- Not (;
Комментарии:
1. Просто чтобы указать очевидное для OP, синтаксис Access SQL не поддерживает комментарии, поэтому
-- Not (;часть должна быть удалена при выполнении.
Ответ №2:
Таблица Person_T с ключом of Person_ID должна существовать до References Person_T(Person_ID) того, как оператор сможет выполняться. Основываясь на вашем соглашении об именах, я бы предположил, что утверждение должно быть References Person_T(Id) .
Рассмотрите возможность изменения вашего соглашения об именовании, чтобы элемент данных не менял свое имя в зависимости от его местоположения, связанного с таблицами / представлениями. Также подумайте, стоит ли беспокоиться о _t суффиксе.
Точка зрения @Prdp о закрытых скобках тоже верна.
Я продолжаю получать синтаксическую ошибку CREATE TABLE, но не вижу ошибки! Что вызывает ошибку?
Мой SQL:
CREATE TABLE my_employee
(
employee_id INTEGER PRIMARY KEY NOT NULL,
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(30) NOT NULL,
address VARCHAR(10) NOT NULL,
birthdate DATE,
salary NUMERIC(8,2) DEFAULT 15000,
marital_status CHAR(1)
);
4 ответа
Лучший ответ
Поскольку ваш оператор DDL включает DEFAULT, вы должны выполнить его с помощью ADO. Я загрузил ваш оператор в строковую переменную и выполнил его из Access 2007 следующим образом:
CurrentProject.Connection.Execute strSql
Поле зарплата является десятичным с точностью до 8, по шкале 2 и по умолчанию 15000.
DEFAULT — одна из функций Access SQL, добавленных в Jet 4.0. Эти функции недоступны для оператора, выполняемого из DAO. Если вы используете конструктор запросов Access для создания и выполнения инструкции, вы используете DAO. То же самое, если вы использовали CurrentDb.Execute. Но CurrentProject.Connection является объектом ADO, поэтому он может .Execute выполнять функции Jet 4.0.
Примечание. NOT NULL не является обязательным после PRIMARY KEY, поскольку PRIMARY KEY подразумевает NOT NULL. Однако PRIMARY KEY NOT NULL не вызывает ошибки. Оператор работает так, как вы его изначально написали, пока вы выполняете его из ADO.
5
HansUp
19 Май 2013 в 23:32
У меня была та же проблема с Ms Access 2007, но я решил ее позже.
Это потому, что на самом деле некоторые функции отключены по умолчанию по соображениям безопасности.
Когда он показывает вам syntax error, вы можете увидеть сообщение в строке меню где-нибудь или внизу: Some Features Are Disabled For Security Reasons....
Щелкните сообщение, затем перейдите к включению дополнительных функций.
1
Andre Silva
19 Май 2013 в 21:19
Как сказал HansUp: «default» в DDL здесь не работает. В качестве альтернативы вы можете сначала создать таблицу без значения по умолчанию, а затем добавить значение по умолчанию через TableDef:
CurrentDb().Execute "create table my_employee ..."
CurrentDb().TableDefs("my_employee").Fields("salary").DefaultValue = 15000
1
Timo Verhoeven
25 Авг 2014 в 15:49
Ваша проблема в декларации PRIMARY KEY
CREATE TABLE my_employee
(
employee_id INTEGER NOT NULL,
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(30) NOT NULL,
address VARCHAR(10) NOT NULL,
birthdate DATE,
salary NUMERIC(8,2) DEFAULT 15000,
marital_status CHAR(1),
PRIMARY KEY (employee_id)
);
0
Dirker27
19 Фев 2013 в 22:38
Механизм доступа db будет перекрывать объявления типа поля, такие как Number(Integer). Предполагая, что вы выполните инструкцию из OleDb-соединения, используйте этот…
cmmd.CommandText = "CREATE TABLE tblContacts( [SectionID] COUNTER PRIMARY KEY,[ScetionName] Text(50), [CatID] Long, [Rate] Double, [Prefix] Text(5), [Suffix] Text(5), [NextNumber] Number(Integer), [Inactive] YesNo, [ModUserID] Long,[ModDate] DateTime)";
Вы можете найти таблицу, которая включает в себя действительные объявления типа поля доступа DDL: Ссылка на тип поля — имена и значения для DDL, DAO и ADOX
Форум программистов Vingrad
| Модераторы: Akina |
Поиск: |
![]() ![]()
|
|
Опции темы |
| CLIPSA |
|
||
Шустрый Профиль Репутация: нет
|
Использую Access + ADO.
Пишит ошибка синтаксиса CREATE TABLE. Немогу понять где эта ошибка? |
||
|
|||
| sergejzr |
|
||
Un salsero Профиль
Репутация: нет
|
Наверное здесь
А вообще, конечно интересно, что за база данных, к которй обращаешься. ——————— Me. |
||
|
|||
| CLIPSA |
|
||
Шустрый Профиль Репутация: нет
|
Access |
||
|
|||
| sergejzr |
|
||
Un salsero Профиль
Репутация: нет
|
Тогда туда и надо!
переношу. ——————— Me. |
||
|
|||
| Akina |
|
||
|
Советчик Профиль
Репутация: 30
|
В MS Access вызовите справку, ее оглавление, раскройте справочник по MS Jet SQL и посмотрите синтаксис оператора CREATE TABLE. Кроме того, как указано выше, все имена таблиц и полей в кириллице обрамляйте квадратными скобками. Для проверки правильности построенного запроса попробуйте его занести в построитель запросов MS Access (вид — режим SQL) и выполнить — это даст возможность его отладить. ——————— О(б)суждение моих действий — в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция — Администрация форума. |
||
|
|||
| CLIPSA |
|
||
Шустрый Профиль Репутация: нет
|
Ничего не получается |
||
|
|||
| Golden Hands |
|
||
Золотой Профиль
Репутация: нет
|
Проверил в Delphi — запрос выполняется, таблица создается. ——————— Мы обречены… но только на победу! |
||
|
|||
| Akina |
|
||
|
Советчик Профиль
Репутация: 30
|
Еще бы… а ведь уже один раз предлагал я почитать таки справку… Не знает MS Jet SQL про какой-то там DEFAULT. Ну вот не знает, и все тут! а ты его, беднягу… и CONSTRAINT он бы хотел видеть написанным совсем по-другому… и еще пара ляпчиков (кажется — я-то за тебя справку читать не буду, а точно не помню)… Добавлено @ 00:40 ——————— О(б)суждение моих действий — в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция — Администрация форума. |
||
|
|||
| Golden Hands |
|
||
Золотой Профиль
Репутация: нет
|
В самом Access этот запрос не прошел, пока не убрал DEFAULT и WITH COMP. ——————— Мы обречены… но только на победу! |
||
|
|||
| CLIPSA |
|
||
Шустрый Профиль Репутация: нет
|
Гадость какая этот MS Jet SQL. Это сообщение отредактировал(а) CLIPSA — 8.11.2006, 17:35 |
||
|
|||
| Akina |
|
||
|
Советчик Профиль
Репутация: 30
|
Сам Аксесс работает через коллекцию TableDefs. Вот уж где раздолье для творчества. ——————— О(б)суждение моих действий — в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция — Администрация форума. |
||
|
|||
| bopoha |
|
||
Эксперт Профиль
Репутация: 21
|
На самом деле в Access 2003, если записать так DEFAULT «0», то работает. Именно как строковый тип. ——————— Как создавать приложения на MS Access |
||
|
|||
![]() ![]()
|
| Правила форума «MS Access» | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
| 0 Пользователей: |
| « Предыдущая тема | MS Access | Следующая тема » |
|
|
От: |
Wind |
|
| Дата: | 20.04.04 05:43 | ||
| Оценка: |
Использую компилятор VC7. Обращаюсь с помощью ADO (через драйвер ODBC) к SQL Server 2К.Ниже следующий код выдает исключение (мол, не могу выполнить). Исключение выдает
Error Code = 3292
Source = DAO.Database
Description = Ошибка синтаксиса при определении поля.
Такого кода в таблице sysmessage (SQL Server) нет (равно как и такой таблицы) => следовательно это не его ошибка
DAODBEngine* DBeng=NULL;
CDaoDatabase *db=NULL;
AfxDaoInit();
DBeng = AfxDaoGetEngine();
db=new CDaoDatabase();
db->Open(«test»,false,false,»ODBC;PWD=xxx;UID=sa;») ;
if (db->IsOpen())
{
db->Execute(«CREATE TABLE time_fond ( id_time int NOT NULL, time datetime NULL, PRIMARY KEY (id_time))»);
}
Вопрос 1) Почему не выполняется запрос (с правами доступа все ОК, с синтаксисом SQL тоже)
Вопрос 2) Чья эта ошибка и кто вернул мне такой код ошибки (где его посмотреть)
P.S. Аналогичный код, но для MS Access выполняется на ура
|
|
От: |
Sinclair |
https://github.com/evilguest/ |
| Дата: | 20.04.04 06:20 | ||
| Оценка: |
Здравствуйте, Wind, Вы писали:
W>Вопрос 1) Почему не выполняется запрос (с правами доступа все ОК, с синтаксисом SQL тоже)
Хм. Constructing Interoperable SQL Statements? Может быть, дело именно в этом?
W>Вопрос 2) Чья эта ошибка и кто вернул мне такой код ошибки (где его посмотреть)
W>P.S. Аналогичный код, но для MS Access выполняется на ура
Тогда вообче загадка…
… << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
|
|
От: |
Elena_ |
|
| Дата: | 20.04.04 07:35 | ||
| Оценка: |
Здравствуйте, Wind, Вы писали:
W>Использую компилятор VC7. Обращаюсь с помощью ADO (через драйвер ODBC) к SQL Server 2К.Ниже следующий код выдает исключение (мол, не могу выполнить). Исключение выдает
W>Error Code = 3292
W>Source = DAO.Database
W>Description = Ошибка синтаксиса при определении поля.
)
W>Вопрос 2) Чья эта ошибка и кто вернул мне такой код ошибки (где его посмотреть)
Ошибка DAO — из документации по DAO 3.6:
Ошибка синтаксиса при определении поля. (Ошибка 3292)
Ошибка синтаксиса при описании поля в инструкции CREATE TABLE или ALTER TABLE.Возможные причины:
Пропущено или неверно указано зарезервированное слово или имя аргумента.
Неверная пунктуация.
Пользователь — друг программиста!
|
|
От: | Аноним | |
| Дата: | 20.04.04 09:35 | ||
| Оценка: |
Здравствуйте, Wind, Вы писали:
W>P.S. Аналогичный код, но для MS Access выполняется на ура
Это, да, это Билл Гейтс ещё как может, если чесно — в чём проблема не знаю,
но у меня была похожая фишка — в SQL запросах из под MS ACCESS прокатывали
* в параметрах в качестве любого знака, а через ODBC приходилось заменять
по стандарту SQL-92 — прочти какие-нибудь старые книги с описанием синтаксиса
CREATE TABLE.
P.S. Вроде ещё ; в конце SQL ставить надо …
|
|
От: |
Wind |
|
| Дата: | 20.04.04 14:24 | ||
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>* в параметрах в качестве любого знака, а через ODBC приходилось заменять
А>по стандарту SQL-92 —
Ну это штука достаточно известная, плюс это формальное нарушение синтаксиса для конкретной СУБД (одна хочет *, другая _). Тут вещь другая, я вначале решил не описывать ситуацию полностью, но раз все в тупике… Итак:
Есть скрипт (написанный мной же) для создания БД на SQL Server (в части схемы данных полность компатибал с Access и FoxPro). Скрипт АБСОЛЮТНО рабочий (запускался из QueryAnalizer). Ни каких вопросов по синтаксису.
Решил автоматизировать его запуск, начал писать эту программу. Хлоп — ошибка (с таблицей — частный случай, базу данных тоже не удалось создать). Процесс отладки опущу, приведу только вывод. В MS Access этот код полностью создает схему данных (от специфичных команд я, разумеется избавился), все правильно и ни каких нареканий. MS SQL — вы уже знаете.
Команды работы с данными SQL Servera выполняются, команды управления схемой данных — нет (команды менеджмента я не пробовал, ибо без схемы данных они не нужны). Вот и всё. Что делать?
А>CREATE TABLE.
А>P.S. Вроде ещё ; в конце SQL ставить надо …
Далеко не ИМХО: это пережиток.
|
|
От: |
Wind |
|
| Дата: | 20.04.04 14:26 | ||
| Оценка: |
Здравствуйте, Elena_, Вы писали:
E_>Ошибка DAO — из документации по DAO 3.6:
Ссылочку на документацию не дадите?
E_>Пропущено или неверно указано зарезервированное слово или имя аргумента.
E_>Неверная пунктуация.
см. http://rsdn.ru/Forum/MsgList.aspx?gid=6&start=1&flat=0
|
|
От: |
Elena_ |
|
| Дата: | 20.04.04 15:19 | ||
| Оценка: |
Здравствуйте, Wind, Вы писали:
W>Ссылочку на документацию не дадите?
Я просто посмотрела в справке по Access, там есть ветка по DAO, в описании объекта Error — Error.Number есть список ошибок.
Я не уверена, что мои соображения на этот счет правильные, но может быть, пригодится:
1) Может быть, ей не нравится слово time, как зарезервированное
2) Я всегда работала с командами DDL SQL Server’а (CREATE TABLE и т.д.) через DAO ODBCDirect, а не через DAO Jet на VB
Раньше обертки MFC для DAO не поддерживали ODBCDirect, см.например, Visual C++ Concepts: Adding Functionality
DAO and MFC
Note MFC now supports DAO 3.5. MFC DAO classes work either with DAO 3.0 or DAO 3.5, but have not been designed to take advantage of any new DAO 3.5 features, including ODBCDirect
Я не уверена, что вообще можно выполнить CREATE TABLE через этот оберточный класс. Может быть, надо подключать DAO напрямую без MFC, или по-моему лучше использовать ADO.
Но очень возможно, что я ошибаюсь, сейчас нет времени проверять.
Пользователь — друг программиста!
|
|
От: |
Sinclair |
https://github.com/evilguest/ |
| Дата: | 20.04.04 17:28 | ||
| Оценка: |
Здравствуйте, Wind, Вы писали:
W>Команды работы с данными SQL Servera выполняются, команды управления схемой данных — нет (команды менеджмента я не пробовал, ибо без схемы данных они не нужны). Вот и всё. Что делать?
У меня единственное подозрение — в сторону ODBC драйвера для SQL. Это, вроде бы, единственное место, через которое может не пролезть команда, успешно выполняемая в Query Analyser. В связи с этим есть доп вопросы:
1. Вообще никакие DDL не проходят? Пример, приведенный в исходном постинге — довольно сложный. Вот такой тоже не пролазит:
create table t1(id int)
?
2. Что показывает профайлер? Доезжает ли команда до сервера? И если доезжает, то в каком виде?
… << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
|
|
От: |
Elena_ |
|
| Дата: | 20.04.04 21:41 | ||
| Оценка: |
Здравствуйте, Elena_, Вы писали:
E_>Я не уверена, что вообще можно выполнить CREATE TABLE через этот оберточный класс. Может быть, надо подключать DAO напрямую без MFC, или по-моему лучше использовать ADO.
E_>Но очень возможно, что я ошибаюсь, сейчас нет времени проверять.
Я еще посмотрела, из описания CREATE TABLE для JET:
Note The Microsoft Jet database engine doesn’t support the use of CREATE TABLE, or any of the DDL statements, with non-Microsoft Jet database engine databases. Use the DAO Create methods instead.
Если я не ошибаюсь в терминологии, то «Microsoft Jet engine databases» — это mdb файлы, а SQL server к ним не относится, судя по следующей цитате. Хотя я нигде не нашла четкого определения, что такое «Microsoft Jet engine databases».
Note For better performance when accessing external databases, including ISAM databases and ODBC data sources, it is recommended that you attach external database tables to a Microsoft Jet engine database (.MDB) rather than connecting directly to the data source.
Пользователь — друг программиста!
|
|
От: |
Wind |
|
| Дата: | 22.04.04 07:18 | ||
| Оценка: |
Здравствуйте, Elena_, Вы писали:
E_>>Я не уверена, что вообще можно выполнить CREATE TABLE через этот оберточный класс. Может быть, надо подключать DAO напрямую без MFC, или по-моему лучше использовать ADO.
Ладно, покажу свою безграматность. Чем отличаются DAO и ADO? Как можно подключить DAO без MFC обертки?
E_>Note For better performance when accessing external databases, including ISAM databases and ODBC data sources, it is recommended that you attach external database tables to a Microsoft Jet engine database (.MDB) rather than connecting directly to the data source.
E_>[/q]
Пусть я буду безграмотным до конца. Что такое ISAM?
|
|
От: |
Wind |
|
| Дата: | 22.04.04 07:34 | ||
| Оценка: |
Здравствуйте, Sinclair, Вы писали:
S>1. Вообще никакие DDL не проходят? Пример, приведенный в исходном постинге — довольно сложный.
Что такое DDL?
Ни какие команды по управлению(созданию и пр.) схемой данных не проходят. Все команды работы с данными проходят.
S>2. Что показывает профайлер? Доезжает ли команда до сервера? И если доезжает, то в каком виде?
Команды управления не доходят до Сервера. Ни в каком виде.
Еще один интересный момент. Если открывать access через ODBC (весь код тотже, но вместо пути до файла указать его DSN), то команды, также не пролазят, правда код ошибки другой:
Error Code = 3423
Source = DAO.Workspace
Description = Не допускается использование ODBC для импорта, экспорта или присоединения таблицы из внешней базы данных Microsoft Jet или базы данных ISAM.
Вот такое дао для DAO… Простите за каламбур.
Вопрос: какой механизм обращения к БД мне лучше использовать, чтобы избежать таких глюков (вернее не глюков а несовместимостей)? Два условия: 1) Компилятор VC7 2) На машину не должны устанавливатся какие-нибудь специальные пакеты. Только Windows + SP к нему + SQL Server.
|
|
От: |
Elena_ |
|
| Дата: | 22.04.04 10:10 | ||
| Оценка: |
Здравствуйте, Wind, Вы писали:
W>Чем отличаются DAO и ADO? Как можно подключить DAO без MFC обертки?
W>Что такое ISAM?
Собственно и DAO и ADO это компоненты для работы с базами данных — DAO расшифровывается как Data Access Objects, а ADO как ActiveX Data Objects. Если Вы сделаете поиск в MSDN по любому из этих сокращений или по обоим, то получите кучу всего. Например:
Porting DAO Code to ADO with the Microsoft Jet Provider
Migrating from DAO to ADO Using ADO with the Microsoft Jet Provider
WP: Migrating DAO/ODBCDirect to ADO To Use MSDE
DAO — более старая технология, кажется, после 3.6 ее и не обещают развивать. У нее доволько узкий круг применения —
1) собственно mdb — то, что они называют Microsoft Jet engine database, хотя я не нашла четкого определения
2) через драйверы ISAM: у меня такой список, может быть, он устарел
Microsoft Fox Pro 2.0б 2.5б 2.6ь 3.0 (только для чтения) и DBC
dBASE III, dBASE IV, dBASE 5.0
Paradox 3.x, 4.x, 5.x
Рабочие листы Microsoft Excel 3.0, 4.0, 5.0, 7.0, 8.0
Microsoft Exchange и Outlook
Электронные таблицы Lotus 1-2-3 WK1, WK3, WKS
Таблицы в текстовых файлах с разделителями или колонками фиксированной ширины
Таблицы в файлах на языке гипертекстовой разметки HTML
Я лично с ISAM драйверами совсем не работала, по-моему это все устарело и сейчас не используется.
3) Источники данных ODBC — как раз Microsoft SQL Server и вообще все что угодно через ODBC, например Btrieve или Oracle
ADO — появилась после DAO, продолжает развиваться, и имеет гораздо более широкую область применения. Если есть OLE DB провайдер, то можно работать через ADO.
Welcome to ADO
Microsoft® ActiveX® Data Objects (ADO) enable your client applications to access and manipulate data from a database server through an OLE DB provider.
Использовать DAO можно через Microsoft JET или через ODBCDirect. Если Вы при создании DAO.Workspace указываете dbUseODBC, то напрямую обращаетесь к ODBC источнику, соответственно при работе с SQL server через ODBCDirect Вы просто выполняете команды T-SQL, в частности CREATE TABLE и вообще любые DDL. Если Workspace имеет тип dbUseJet, так по умолчанию (там в DBEngine есть DefaultType), то все DAO операции идут через Jet, в частности и CREATE TABLE — это не CREATE TABLE T-SQL, а CREATE TABLE для Jet SQL, а для нее имеется ограничение, о котором я говорила — только для mdb (если я правильно поняла документацию), соответственно Вы не можете через DAO без ODBCDirect выполнить CREATE TABLE и другие DDL. Вроде бы в этом случае они предлагают использовать методы DAO CreateTableDef, CreateQueryDef и т.п., я не пробовала.
А обертка MFC не включала эту возможность, там просто нет параметра, чтобы поменять тип Workspace, поэтому через оберточный класс CDAOWorkspace не получить ODBCDirect.
Я сама никогда не подключала DAO напрямую из C++, только через MFC обертку, из VB идет просто доступ к объектам и там нет проблем установить ODBCDirect, но думаю, что можно через #import или CoCreateInstance, потом GetIDsOfNames и Invoke, или любым другим способом, как компоненты подключаются.
Вообще говоря, если Вы начинаете задачу, наверное, лучше ориентироваться на ADO. Иногда при работе с Access действительно может пригодиться DAO, но это скорее уже личный выбор. При работе с SQL server однозначно лучше использовать ADO, DAO c ODBCDirect — худший выбор (собственно это появилось, когда ADO по-моему еще не было), а DAO Jet вообще по-моему не имеет смысл использовать для SQL Server’а.
Конечно, лучше если Вы посмотрите MSDN, так как я могу и наврать в теории, на практике у меня вот такие выводы.
Пользователь — друг программиста!


- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.


Сообщение было отмечено marusa122 как решение





































