Запуск нескольких операторов SQL в одной операции - PullRequest
8 голосов
/ 21 апреля 2009

Я пытаюсь использовать ADO для создания нескольких таблиц одновременно в MS Access. Можно ли сделать несколько операторов в одной операции? Например:

...
// I have omitted the field details 
CString sQuery = "CREATE TABLE [Table1] (..., PRIMARY KEY ([ID])); \nCREATE TABLE [Table2] (..., PRIMARY KEY ([ID]));";
oRecordset.Open(oDatabase.m_pConnection, sQuery)

Это происходит из-за "Syntax Error in CREATE TABLE statement", хотя каждый из операторов create отлично работает самостоятельно. Есть ли способ сделать это? Будут также операторы для добавления ограничений, добавления индексации и т. Д., И я действительно хотел бы иметь возможность сделать это так, чтобы мне не приходилось разбивать строку на отдельные части.

Ответы [ 7 ]

10 голосов
/ 21 апреля 2009

ADO не проблема: механизм ACE / Jet просто не поддерживает несколько операторов SQL в одной операции. Другими словами, в ACE / JET SQL отсутствует процедурный синтаксис, встречающийся в большинстве продуктов SQL промышленного уровня. См. Ответ @ David-W-Fenton для более подробной информации.

Итог: вам нужно будет ввести Connection.Execute для каждого оператора CREATE TABLE, то есть процедурный код на стороне клиента. Но, конечно, все они могут (возможно, должны) выполняться в одной транзакции.

4 голосов
/ 21 апреля 2009

ADO для MS Access не поддерживает пакетные операторы SQL. Вам нужно запускать каждый оператор как отдельное выполнение.

2 голосов
/ 21 апреля 2009

Люди, которые думают, что вы можете отправить несколько операторов SQL в Jet в пакете, просто не думают.

Jet - ядро ​​базы данных файлового сервера - отсутствует централизованный серверный процесс, управляющий взаимодействием клиентов и реального хранилища данных. Вместо этого все клиенты запускают отдельные экземпляры Jet и совместно редактируют файл таким образом, который контролируется файлом блокировки Jet (LDB). Без централизованного процесса сериализации и определения приоритетов операторов SQL вы бы не захотели бы Jet иметь возможность обрабатывать несколько операторов в пакете.

Те, кто предлагает использовать ADO и разделять операторы с помощью CrLf, должны его кодировать и попробовать, а затем вернуться к нам о том, насколько полезен их умозрительный совет.

1 голос
/ 31 октября 2011

Грубо, но это работает - создайте необходимое количество запросов с одним оператором SQL каждый, затем используйте макрос для последовательного выполнения запросов. Это примерно так же хорошо, как это можно сделать с помощью ADO / Jet.

1 голос
/ 21 апреля 2009

Если типовой набор команд является типичным, просто сделайте что-то подобное в VBA или на языке по вашему выбору:

public sub ExeuteBatch(BatchString as String)
    var s as string  
    var abatch as array  
    sbatch = replace(sbatch, "\n", "")
    abatch = split(BatchString, ";")
    for each s in abatch
        ** adodb execute s here **
    next s
end sub

Это не в моей голове, но я надеюсь, ты сможешь взять это оттуда.

0 голосов
/ 21 апреля 2009

Я думаю, что вы можете запустить несколько команд в одной команде ADO.

Вам просто нужны правильные переводы строк между ними. то есть \ n не работает.

Попробуйте что-то вроде этого: (С использованием синтаксиса VB)

MyQuery = "Select * from Whatever " & vbLf <br>
MyQuery = MyString & "Select * from SomethingElse " & vbLF

oRecordset.Open(oDatabase.m_pConnection, MyQuery )
0 голосов
/ 21 апреля 2009

Я не знаю, построен ли ADO через JET OleDB Engine, что, как я полагаю, если это так, Jet Engine не поддерживает выполнение нескольких операторов в одном пакете, мы попытались разделить с помощью; и с зарезервированным словом GO, но оно не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...