Access sql ошибка синтаксиса при определении поля

Uswer

1763 / 1241 / 322

Регистрация: 26.06.2017

Сообщений: 3,411

1

19.05.2021, 23:49. Показов 2104. Ответов 13

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем добра!

Возникла необходимость из программы используя ADO.NET, а ещё конкретнее OleDb провайдер, создать таблицу в базе данных Access. И сразу возникло несколько вопросов:
1. В каких случаях в запросе слова заключаются в квадратные кавычки?
2. Каким образом в запросе задаются значения по умолчанию для полей таблицы?
3. Самый главный вопрос — что не так с этим запросом, вываливается ошибка «Ошибка синтаксиса при определении поля»:

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE [07_2021] (
[Код] [DBTYPE_I4] IDENTITY NULL,
[ID игрока] [DBTYPE_STR] NOT NULL,
[Имя] [DBTYPE_STR] NULL,
[ДатаНачальная] [DBTYPE_DATE] NULL,
[ДатаПоследняя] [DBTYPE_DATE] NULL,
[Рейтинг] [DBTYPE_R8] NULL,
[Фраги] [DBTYPE_I4] NULL,
[Время в игре] [DBTYPE_DATE] NULL
) ON [PRIMARY];
 
ALTER TABLE 07_2021 WITH NOCHECK ADD 
CONSTRAINT [PK_07_2021] PRIMARY KEY CLUSTERED (
[ID игрока]
) ON [PRIMARY];

Я в SQL-запросах слаб, сильно не пинайте.

Не по теме:

Вопрос умышленно не задан в ветке Access потому, что сам Access не используется, а выполняется лишь доступ к mdb-файлу как к хранилищу. Вся работа делается через драйвер OleDb.



0



5089 / 4103 / 1026

Регистрация: 29.08.2013

Сообщений: 26,008

Записей в блоге: 3

20.05.2021, 00:16

2

Цитата
Сообщение от Uswer
Посмотреть сообщение

что сам Access не используется

ага, попробуйте без аксесса на ПК это запустить)

иди в ветку по аксессу — вам все расскажут
ну или книжку откройте



0



1763 / 1241 / 322

Регистрация: 26.06.2017

Сообщений: 3,411

20.05.2021, 08:03

 [ТС]

3

Цитата
Сообщение от qwertehok
Посмотреть сообщение

попробуйте без аксесса на ПК это запустить

Без проблем. Вы не внимательны я писал:

Цитата
Сообщение от Uswer
Посмотреть сообщение

из программы используя ADO.NET

если Вы не знаете, что такое ADO.NET и с чем его едят, то и не говорите ничего.

Цитата
Сообщение от qwertehok
Посмотреть сообщение

или книжку откройте

Офигительный совет, сам бы я ни за что не догадался.



0



5089 / 4103 / 1026

Регистрация: 29.08.2013

Сообщений: 26,008

Записей в блоге: 3

20.05.2021, 10:19

4

Цитата
Сообщение от Uswer
Посмотреть сообщение

если Вы не знаете, что такое ADO.NET и с чем его едят, то и не говорите ничего.

жалко мне вас, вот пытаюсь помочь чем могу)
а вы агритесь
что-то я не вижу очереди специалистов в вашей теме

а что такое DBTYPE_I4?

вроде нет таких типов
https://docs.microsoft.com/ru-… access-sql

Цитата
Сообщение от Uswer
Посмотреть сообщение

сам бы я ни за что не догадался.

конечно, ведь быстрее на других проблему переложить чем самому искать ответ))



0



1763 / 1241 / 322

Регистрация: 26.06.2017

Сообщений: 3,411

20.05.2021, 10:55

 [ТС]

5

Цитата
Сообщение от qwertehok
Посмотреть сообщение

а вы агритесь

Я не агрюсь. Вы указали, что без Accessa запрос отправить нельзя, а я изначально сказал, что есть программа, из которой OleDb провайдеру отправляется запрос. И Access в этом обмене вообще ни при чём! Именно поэтому я и написал комментарий «не по теме».

Цитата
Сообщение от qwertehok
Посмотреть сообщение

а что такое DBTYPE_I4?

Это тип данных, который должен понимать провайдер OleDb. Соответствие типов взято отсюда. Однако мне не совсем понятно зачем вообще это сопоставление указано мелкомягкими, если в запросе применяются какие-то другие типы (как я понял равные SQL-server).

Цитата
Сообщение от qwertehok
Посмотреть сообщение

жалко мне вас

Не надо меня жалеть, просто помогите дельным советом, ведь именно для этого и существует форум!

Цитата
Сообщение от qwertehok
Посмотреть сообщение

ведь быстрее на других проблему переложить чем самому искать ответ

Интересно для кого написан п.3.3 правил форума?



0



1556 / 988 / 376

Регистрация: 31.05.2012

Сообщений: 3,486

20.05.2021, 12:11

6

В синтаксисе по CREATE TABLE нет ни каких DBTYPE_I4 и прочее, а есть например integer. default для поля есть, но работает по-моему для jet ole db и ado, в остальных случаях реализуется только средствами VBA. Квадратные скобки обязательны если в качестве имени поля зарезервированное sql-слово, или в нем есть запрещенный символ для имени, пробел например. Список зарезервированных слов при желании можно найти



1



1763 / 1241 / 322

Регистрация: 26.06.2017

Сообщений: 3,411

20.05.2021, 13:58

 [ТС]

7

Цитата
Сообщение от Аватар
Посмотреть сообщение

нет ни каких DBTYPE_I4 и прочее, а есть например integer

Вот не понимаю я почему Integer, а не Int как для ядра SQL-сервера? Для указанного типа, применительно к ядру SQL-сервера, преобразование будет таким: в коде имеем тип System.Int32 (колонка «Тип платформы .NET Framework» в таблице сопоставления), в запросе для поля данного типа мы укажем его как Int (колонка «Тип ядра СУБД SQL Server»). Всё логично и понятно, а для OleDb мне не понятно. Внятно никто объяснить не может почему так и где та логическая цепочка, которая даёт это понимание.



0



1556 / 988 / 376

Регистрация: 31.05.2012

Сообщений: 3,486

20.05.2021, 14:19

8



0



1763 / 1241 / 322

Регистрация: 26.06.2017

Сообщений: 3,411

20.05.2021, 14:34

 [ТС]

9

Аватар, вооот Вы сами и дали ответ на Ваш вопрос про DBTYPE_I4. По ссылочке видно соответствие типов. Но не фурычит в моём случае



0



1556 / 988 / 376

Регистрация: 31.05.2012

Сообщений: 3,486

20.05.2021, 14:51

10

У меня не было вопроса про DBTYPE_I4. Вопрос у кого-то другого был, не?



0



5089 / 4103 / 1026

Регистрация: 29.08.2013

Сообщений: 26,008

Записей в блоге: 3

20.05.2021, 21:46

11

Uswer, вы переписали запрос? работает?



0



1763 / 1241 / 322

Регистрация: 26.06.2017

Сообщений: 3,411

21.05.2021, 08:16

 [ТС]

12

qwertehok, да переписал, более или менее разобрался в проблеме, но пока не проверял (времени не хватает). А что?



0



1619 / 1096 / 241

Регистрация: 14.08.2018

Сообщений: 3,604

Записей в блоге: 4

21.05.2021, 12:32

13

Uswer, никакого типа DBTYPE_I4 в MS Access не существует, там есть тип Длинное целое, который равен Int32 или просто int:
Длинное целое — для целых чисел от -2 147 483 648 до +2 147 483 647. Для хранения требуется 4 байта.
Задание размера поля



0



1763 / 1241 / 322

Регистрация: 26.06.2017

Сообщений: 3,411

21.05.2021, 15:23

 [ТС]

14

Лучший ответ Сообщение было отмечено qwertehok как решение

Решение

Всем, кто участвовал в обсуждении темы, сообщаю:
1. Access, как программа для работы с данными, ни коим образом не участвует в информационном обмене Клиент-Хранилище. Клиент (моя программа) используя объекты ADO.NET выполняет запросы к провайдеру OleDb, а тот в свою очередь, к ядру БД Access (в частности MS Jet 4.0). На той платформе, на которой произвожу отладку, MS Office не установлен вообще и Access-а там нет в помине.
2. Тип DBTYPE_I4 существует и может/должен применяться при построении запроса и последующей его отправки через COM-интерфейс OleDb (ADO) [не путать с ADO.NET]. Этот интерфейс является устаревшим и не рекомендуется его применять, хотя никто не запрещает это делать.
3. При работе с объектами ADO.NET используется синтаксис Transact-SQL и соответствующие ему типы данных. В этом и заключалась моя основная ошибка, т.е. в запросе были указаны неправильные типы данных. Плюс к этому ядро БД Access имеет различную с MS SQL-Server транскрипцию запросов. Как минимум для CREATE TABLE запроса незначительные различия есть.

Не по теме:

В целом в проблеме пришлось разбираться самому, но не без помощи некоторых форумчан (без обид, но в этой ветке никто толком объяснить ничего не смог).

Всем спасибо!



2



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

21.05.2021, 15:23

14

I want to alter a table and add multiple columns to my table but I am getting error

syntax error in field definition

I am working with vb.net and MS Access 2013.

Here is my code:

cmd.Connection = con

cmd.CommandText = "ALTER TABLE Game_Player ADD QUESTIONS TEXT(50),USER_ANSWER TEXT(10),TIME TEXT(10),SECOND (10),lbl_Lock TEXT(10),lbl_vis TEXT(10)"
cmd.ExecuteNonQuery()

HansUp's user avatar

HansUp

95.7k11 gold badges76 silver badges135 bronze badges

asked Feb 17, 2016 at 19:03

Ashutosh's user avatar

3

Access SQL does support adding multiple columns with one ALTER TABLE statement.

The field definition error likely occurs due to the lack of a data type for the SECOND field. However two of the column names, SECOND and TIME, are reserved words. (Also see the link @Andrew provided.) Those names may also trigger errors, but it’s not always easy to predict when they will cause trouble. The safest alternative would be to choose column names which are not reserved words. If you must keep those names, bracket them in your SQL statement …

ALTER TABLE Game_Player
ADD COLUMN
    QUESTIONS TEXT(50),
    USER_ANSWER TEXT(10),
    [TIME] TEXT(10),
    [SECOND] TEXT(10),
    lbl_Lock TEXT(10),
    lbl_vis TEXT(10)

I included the COLUMN keyword and assumed TEXT as the data type for SECOND.

Community's user avatar

answered Feb 17, 2016 at 19:32

HansUp's user avatar

HansUpHansUp

95.7k11 gold badges76 silver badges135 bronze badges

0

От:

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 >>

Уйдемте отсюда, Румата! У вас слишком богатые погреба.
http://rsdn.org/File/5743/rsdnaddict.GIF

От:

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&amp;start=1&amp;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 >>

Уйдемте отсюда, Румата! У вас слишком богатые погреба.
http://rsdn.org/File/5743/rsdnaddict.GIF

От:

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, так как я могу и наврать в теории, на практике у меня вот такие выводы.

Пользователь — друг программиста!

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

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

Регистрация на форуме тут, о проблемах пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите восстановить пароль

Поиск по форуму
Расширенный поиск

Страница 1 из 2 1 2 Следующая >

Почему возникает эта ошибка.
Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘[Стипендія нарахування].[Середній бал]? (база данных в Access 2010)

SELECT [Стипендія нарахування].[Середній бал]
IF([Середній бал]<4,»0″,
IF([Середній бал]=5,»950″,
IF([Середній бал]>=4 And <5,»800″)) AS [Стипендія]
FROM [Стипендія нарахування];

Сообщение об ошибке при использовании специальных символов в базах данных Access

В этой статье перечислены специальные символы, которые не следует использовать при работе с именами объектов базы данных или именами полей во всех версиях Access.

Оригинальный номер базы знаний: 826763

Эта статья применима к файлам баз данных Microsoft Access (.mdb) или (.accdb), а также к файлу проекта Microsoft Access (.adp).

Симптомы

При использовании специальных символов в Access возникает одна из следующих проблем.

Проблема 1

В имени поля таблицы используется один из следующих специальных символов:

  • Знак над символом (`)
  • Восклицательный знак (!)
  • Точка (.)
  • квадратные скобки ([])
  • Пробел
  • Непечатаемые символы

В этом случае отобразится следующее сообщение об ошибке:

Недопустимое имя поля.
Убедитесь, что имя не содержит точку (.), восклицательный знак(!), квадратные скобки ([]), пробел или непечатаемый символ, например символ возврата каретки. Если вы вставляете имя из другого приложения, попробуйте нажать клавишу ESC и ввести имя еще раз.

При использовании этих специальных символов в имени таблицы отобразится следующее сообщение об ошибке:

Введенное имя объекта ‘TableName‘ не соответствует правилам именования объектов Microsoft Office Access.

Проблема 2

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

Если имя поля содержит пробел, вопросительный знак (?) или знак @, отобразится следующее сообщение об ошибке:

Ошибка синтаксиса во введенном выражении.
Задано значение для операции без оператора

Если имя поля содержит кавычки («) или апостроф (‘), отобразится следующее сообщение об ошибке:

Введенное выражение содержит ошибочную строку.
Строка может содержать до 2048 знаков, включая знаки открывающей и закрывающей кавычек.

Если имя поля содержит знак решетки (#), отобразится следующее сообщение об ошибке:

Введенное выражение содержит недопустимое значение даты.

Если имя поля содержит знак процента (%), тильду (

), точку с запятой (;) или скобки ([]), отобразится следующее сообщение об ошибке:

Ошибка синтаксиса во введенном выражении.
Пропущен операнд или оператор, введен недопустимый знак или лишняя запятая, либо задана строка без кавычек.

Если имя поля содержит фигурные скобки (), отобразится следующее сообщение об ошибке:

Неверно сформированный код GUID в выражении запроса ‘ObjectName

Если имя поля содержит квадратные скобки ([]) или круглые скобки (()), отобразится следующее сообщение об ошибке:

Во введенном выражении отсутствует закрывающая скобка, квадратная скобка (]) или вертикальная черта (|).

Проблема 3

У вас есть запрос, содержащий выражения запроса. Выражения запроса включают поля, содержащие специальные символы. При выполнении запроса предлагается ввести значение параметра. Как правило, эта проблема возникает при использовании следующих специальных символов:

  • знак «больше» (>);
  • знак «меньше» (<);
  • Точка (.)
  • Звездочка (*)
  • Двоеточие (:)
  • Крышка (^)
  • Знак плюс (+)
  • Обратная косая черта ()
  • Знак равенства (=)
  • амперсанд (&);
  • Косая черта (/)

Обходной путь

Чтобы устранить эту проблему, не используйте специальные символы. Если в выражениях запроса необходимо использовать специальные символы, заключите их в квадратные скобки ([]). Например, если вы хотите использовать знак «больше» (>), используйте [>].

Дополнительная информация

Microsoft Access не ограничивает использование специальных символов, таких как знак решетки (#), точка (.) или кавычки («) в именах объектов базы данных или в именах полей базы данных. Однако при использовании специальных символов могут возникнуть непредвиденные ошибки. Поэтому корпорация Майкрософт рекомендует не использовать специальные символы в именах объектов базы данных в базе данных Access или в проекте базы данных. В этой статье рассматриваются специальные символы, которые не следует использовать во избежание известных проблем с ними.

При работе с Access или другим приложением, например приложением Microsoft Visual Basic или приложением Active Server Pages (ASP), не следует использовать следующие специальные символы:

Соглашения об именовании в Access

Корпорация Майкрософт рекомендует не использовать точку (.), восклицательный знак (!), знак ударения (`), квадратные скобки ([ ]), пробел ( ) или кавычки («) внутри имен функций, имен переменных, имен полей или имен объектов базы данных, таких как таблицы и формы.

Использование следующих специальных символов в Access приводит к возникновению известных проблем. В следующих сценариях описано, когда не следует использовать специальные символы:

Что значит пропущен оператор в выражении запроса access

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Здравствуйте.

Вобще на форме выбирется ДАТА в dateTimePicker, затем хочу сделать ЗАПРОС на ВЫБОРКУ из таблицы (Access) по этой дате . ну если дата совпала, то потом все вывожу в dataGridView1

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=»+dateTimePicker1.Value+»», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
B.SelectCommand.Connection.Open();
B.SelectCommand.ExecuteNonQuery();
B.SelectCommand.Connection.Close();
DataTable C = new DataTable();
B.Fill(C);
dataGridView1.DataSource = C;

ну вобщем когда я на форме выбираю дату и нажимаю кнопку поиск ВЫЛАЗИЕТ вот такая ОШИБКА:

Код
Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘Дата=03.12.2008 0:00:00’.
Код
SELECT * FROM Содержание_заказа WHERE Дата=03.12.2008 0:00:00

Помогите разобраться с этой проблемой.
Заранее спасибо.

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

kuller, dateTimePicker1.Value.ToString(«dd.MM.yyyy»);

Добавлено через 36 секунд
kuller, а вообще в каком формате дата хранится в базе?

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

Вот так выглядит у меня в Access 2003 запрос на выборку поля с датой

SELECT Table1.ID, Table1.Field1
FROM Table1
WHERE (((Table1.Field1)=#1/10/2008#));

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Код
Дата содержит синтаксическую ошибку в выражении запроса ‘Дата=#03.12.2008 0:00:00#’.
Код
SELECT * FROM Содержание_заказа WHERE Дата=#03.12.2008 0:00:00#

Добавлено через 4 минуты и 4 секунды
и так ошибка(((

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE (([Содержание_заказа].[Дата]=» + dateTimePicker1.Value + «))», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
Код
Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘(([Содержание_заказа].[Дата]=03.12.2008 0:00:00))’.

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

kuller, попробуйте прогнать запрос с хардкодом

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата= #12/03/2008#», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
B.SelectCommand.Connection.Open();
B.SelectCommand.ExecuteNonQuery();
B.SelectCommand.Connection.Close();
DataTable C = new DataTable();
B.Fill(C);
dataGridView1.DataSource = C;

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=#12/03/2008#», .

ну т.к. в БД нет строки с такой датой то у меня выскочила табличка:

Код
MessageBox.Show(«Извените, по вашему запросу ничего не найдено», .

значит все работает, но это для статического варианта даты . а вот как теперь это исправить для динамически меняющейся даты.

Добавлено через 1 минуту и 8 секунд
Вот поставил 20/11/2008:
и в dataGridView1 вывелись ВСЕ найденные РЕЗУЛЬТАТЫ .. причем верные)))))

Добавлено через 3 минуты и 34 секунды
ВЫВОД:

дату надо получить из dateTimePicker1.Value и привести к виду:

#ч/м/г#,а потом только вызывать запрос.

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=#»+dateTimePicker1.Value.ToString(«dd/MM/yyyy»)+»#», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
B.SelectCommand.Connection.Open();
B.SelectCommand.ExecuteNonQuery();
B.SelectCommand.Connection.Close();
DataTable C = new DataTable();
B.Fill(C);
dataGridView1.DataSource = C;

Это сообщение отредактировал(а) Partizan — 4.12.2008, 12:28

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Да уж(
и так не работате((((

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=#»+dateTimePicker1.Value.ToString(«MM/dd/yyyy»)+»#», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
Код
Дата содержит синтаксическую ошибку в выражении запроса ‘Дата=#11.20.2008#’.
Код
SELECT * FROM Содержание_заказа WHERE Дата=#11.20.2008#

Добавлено через 5 минут
Причем по моему не так:
ToString(«MM/dd/yyyy»)
а вот так:
ToString(«dd/MM/yyyy»)
ну всеравно не пашет((((

Это сообщение отредактировал(а) kuller — 4.12.2008, 12:32

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Правила форума
При создании новой темы не забывайте указывать используемую СУБД.

VINNY-PYX
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя

 
Сообщения: 125
Зарегистрирован: 02.02.2004 (Пн) 17:24
Откуда: из роддома
  • ICQ

Создать таблицы в Access 2003 с помощью SQL

Мне нужно создать две таблицы и потом связать их. Для оракула делал так:

Код: Выделить всё


CREATE TABLE permitions (

  id NUMBER PRIMARY KEY,

  name varchar(16)

);

CREATE TABLE users (

  id NUMBER PRIMARY KEY,

  login varchar(16),

  pass varchar(32),

  perm REFERENCES permitions(id)

);

Но ВБ ругается: «ошибка синтаксиса при определении поля». Я думаю это изза REFERENCES так как первая таблица успешно создается.

Как мне вооплотить замысел?

Если вручную добавить таблицу users, то при исполнении

Код: Выделить всё


CREATE TABLE staff (

  id NUMBER PRIMARY KEY,

  pid NUMBER,

  firstname varchar(20),

  middlename varchar(20),

  lastname varchar(20),

  salary NUMBER,

  CONSTRAINT pers_id

   FOREIGN KEY (pid)

   REFERENCES users(id)

   ON DELETE CASCADE

);

вылазит ошибка: «отношение должно быть задано для одинакового количества с одинаковыми типами данных»

Как исправить?

И еще: триггеры работают?


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.08.2007 (Пн) 8:00

Триггеров в настольной базе данных нет.

Типа данных NUMBER тоже нет, используй INT или DECIMAL.

Lasciate ogni speranza, voi ch’entrate.


VINNY-PYX
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя

 
Сообщения: 125
Зарегистрирован: 02.02.2004 (Пн) 17:24
Откуда: из роддома
  • ICQ

Сообщение VINNY-PYX » 16.08.2007 (Чт) 0:11

При програмном добавлении таблицы ADOX.Catalog.Tables.Count не изменяется до перезапуска программы. как это исправить?


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.08.2007 (Чт) 7:45

А как добавляешь?

Refresh делаешь?

Lasciate ogni speranza, voi ch’entrate.


VINNY-PYX
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя

 
Сообщения: 125
Зарегистрирован: 02.02.2004 (Пн) 17:24
Откуда: из роддома
  • ICQ

Сообщение VINNY-PYX » 17.08.2007 (Пт) 18:08

спс. рефрешить католог надо было. Я refresh в ADOX.Catalog’е искал, а он был в ADOX.Catalog.Tables.


Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя

 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край
  • ICQ

Сообщение Денис » 17.08.2007 (Пт) 22:17

VINNY-PYX

Чтобы поймать юзера — думай, как юзер: В Access открой редактором новый запрос на создание таблицы, визуально создай все поля, а затем открой полученный запрос в SQL-виде.

Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.



Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Понравилась статья? Поделить с друзьями:
  • Abbyy finereader 14 код ошибки 258
  • Abbyy finereader 11 код ошибки 1284
  • Abblendlicht prufen ошибка bmw e53
  • Abb частотник ошибка f0022
  • Abb ошибка ff30