2009-04-21 8 views
7

Estoy tratando de usar ADO para crear varias tablas a la vez, en MS Access. ¿Es posible hacer múltiples declaraciones en una sola operación? Por ejemplo:Ejecutando varias instrucciones SQL en una operación

... 
// 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) 

Esta falla debido a un "Syntax Error in CREATE TABLE statement", aunque cada una de las instrucciones create a trabajar en su propia perfección. ¿Hay alguna manera de hacer este tipo de cosas? También habrá instrucciones para agregar restricciones, agregar indexación, etc., y realmente me gustaría poder hacerlo para no tener que dividir la cadena en partes separadas.

Respuesta

4

ADO to MS Access no es compatible con las sentencias SQL por lotes. Necesita ejecutar cada instrucción como una ejecución separada.

0

No sé si ADO se construye sobre JET OleDB Engine, lo que supongo que, si es así, The Jet Engine no admite la ejecución de múltiples instrucciones en un solo lote, tratamos de separar con; y con la palabra reservada GO, pero no funciona.

+0

ADO no está "construido sobre el motor Jet OleDB", pero ADO * privider * para Jet es ... – RolandTumble

1

Si eres conjunto de muestras de comandos es típico, simplemente hacer algo como esto en VBA o el idioma de su elección:

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 

Esa es la parte superior de mi cabeza, pero debería poder llevarlo desde allí, espero.

0

Creo que puede ejecutar varios comandos en un comando ADO.

Solo necesita líneas de alimentación adecuadas entre entonces. es decir, \ n no funciona.

intentar algo como esto: (con VB Syntaxish)

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

oRecordset.Open(oDatabase.m_pConnection, MyQuery) 
+0

ADO simplemente pasa el código SQL al motor y el motor en cuestión (ACE/Jet) tiene no es compatible con múltiples sentencias de SQL). – onedaywhen

+0

Ah, eso tendría sentido. Pensando en ello, lo he hecho con éxito en SQL Server. – GordyII

1

gente que piensa que puede enviar varias sentencias SQL para Jet en un lote simplemente no están pensando.

Jet es un motor de base de datos de servidor de archivos; no existe un proceso de servidor centralizado que controle la interacción entre los clientes y el almacén de datos real. En cambio, los clientes ejecutan instancias individuales de Jet y editan de forma cooperativa un archivo controlado por el archivo de bloqueo de Jet (LDB). Sin un proceso centralizado para serializar y priorizar las declaraciones SQL, no desea querer Jet para poder procesar múltiples instrucciones en un lote.

Aquellos que ofrecen la sugerencia de usar ADO y separar las declaraciones con un CrLf deben codificarlo y probarlo y luego consultarnos sobre cuán útil es realmente su consejo especulativo.

+0

Ser * un motor de base de datos de servidor de archivos * no es una explicación para no manejar varias instrucciones a la vez. Por ejemplo, sqlite se encarga de eso bastante bien. – mlt

10

ADO no es el problema: el motor ACE/Jet simplemente no es compatible con múltiples instrucciones SQL en una sola operación. En otras palabras, ACE/JET SQL carece de sintaxis de procedimiento que se encuentra en la mayoría de los productos de SQL de 'fortaleza industrial'. Vea la respuesta de @David-W-Fenton para más detalles.

En pocas palabras: Deberá emitir un Connection.Execute por cada CREATE TABLE declaración, es decir, el código de procedimiento del lado del cliente. Pero pueden (quizás deberían) ejecutarse todos en la misma transacción, por supuesto.

2

Crudo, pero funciona: cree el número necesario de consultas con una declaración SQL cada una, luego use una macro para ejecutar las consultas sucesivamente. Eso es lo mejor que se puede hacer con ADO/Jet.

Cuestiones relacionadas