Запуск нескольких операторов 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 зарезервированным словом, но оно не работает.