在一个操作中运行多个SQL语句

时间:2009-04-21 00:30:45

标签: sql ms-access

我正在尝试使用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 个答案:

答案 0 :(得分:10)

ADO不是问题:ACE / Jet引擎在单个操作中不支持多个SQL语句。换句话说,ACE / JET SQL缺少大多数“工业级”SQL产品中的过程语法。有关详细信息,请参阅@ David-W-Fenton的答案。

结论:您需要为每个Connection.Execute语句(即客户端程序代码)发出CREATE TABLE。但是,他们当然可以(也许应该)在同一笔交易中运行。

答案 1 :(得分:4)

ADO到MS Access不支持批处理SQL语句。您需要将每个语句作为单独的执行运行。

答案 2 :(得分:2)

那些认为你可以批量发送多个SQL语句给Jet的人不在想。

Jet是文件服务器数据库引擎 - 没有集中式服务器进程控制客户端与实际数据存储之间的交互。相反,客户端都运行Jet的单个实例,并以Jet锁定文件(LDB)控制的方式协作编辑文件。如果没有集中化的过程来序列化和确定SQL语句的优先级,您就不会希望 Jet能够批量处理多个语句。

那些提出使用ADO并将语句与CrLf分开的人应该编写代码并试一试,然后再回过头来看看他们的推测性建议实际上是多么有用。

答案 3 :(得分:1)

如果您是典型的示例命令集,只需在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

这不是我的头脑,但你应该能够从那里拿走它我希望。

答案 4 :(得分:1)

原始但它可行 - 使用一个SQL语句创建必要数量的查询,然后使用宏连续运行查询。这和ADO / Jet一样好。

答案 5 :(得分:0)

我不知道ADO是否构建在JET OleDB引擎上,我想,如果是这样的话,Jet引擎不支持在一个批处理中执行多个语句,我们尝试分离;并使用GO保留字,但它不起作用。

答案 6 :(得分:0)

我认为你可以在一个ADO Command中运行多个命令。

您需要在此之间使用正确的换行符。即\ n不起作用。

尝试这样的事情: (使用VB语法)

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

oRecordset.Open(oDatabase.m_pConnection, MyQuery )