我正在尝试使用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语句都可以完美地运行。有没有办法做这种事情?还会有语句添加约束,添加索引等,我真的希望能够这样做,这样我就不必将字符串分成不同的部分。
答案 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 )