Запуск нескольких операторов SQL в одной операции

Я пытаюсь использовать 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 ответов

Решение

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

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

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

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

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

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

Если типовой набор команд является типичным, просто сделайте что-то подобное в 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

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

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

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

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

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

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

oRecordset.Open(oDatabase.m_pConnection, MyQuery )

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

Другие вопросы по тегам