sqlstr="use MyDB" & vbcrlf & "go" & vbcrlf & "select * from MyTable" & vbcrlf & "go"
cn.execute sqlstr

解决方案 »

  1.   

    谢谢victorycyz(中海,学SQL Server的菜鸟) ,不过问题其实是这样的:
    我希望将数据库的Sql文件使用一个类似安装程序的东西来在ADO中执行,而不再需要打开查询分析器了。sql文件是数据库的所有的创建对象的内容。
      

  2.   

    to: Fanks(凡可)
    我做了,还是不行,比如我给的串为:
    CString strSQL="Use master \r\n\go \r\n\create database abcd \r\n\go ";
    运行还是不行!出现的错误警告是:IDispatch error #3092。
    但是使用下面的语句又可以:
    1:将strSQL分成:Use master-》执行execute
       再将strSQL赋值:CREATE database abcd 又可以了。
    2:将strSQL赋值:strSQL="declare @a int \r\n select @a=count(*) from sysfiles";
       也可以执行,不会错误。to:aierong(皑婀瑢-数据库XML.NET联盟会局长) 
    请问是不是在command中这样使用:在一个显示的事务中,使用command命令,多次执行后统一提交?
    麻烦各位再给一点意见吧!!!!!谢谢了!!!!!!
      

  3.   

    命令串不要包含go。go不是SQL命令。查询分析器中的go命令是不发送给SQL Server的,他只是区分“批处理”的标志。
      

  4.   

    包含成百上千条命令也没关系,而且包括begin tran等命令,分布在多个串(批处理中)也没有关系(只要是从一个connection),只是其中不要有go。做一个“安装程序”,看到go就剔除;或者将go之前的串发送给服务器,然后再从go后边的命令开始整理串。
      

  5.   

    谢谢 w_rose(w_rose);
    刚才试验了你所说的,
    对于语句:strSQL="Use master \r\ngo \r\n\create database abcd \r\n\go ";
    去掉go,成为strSQL="Use master \r\ncreate database abcd ";执行成功,但是,如果我希望的是:
    Use master 
    go
    create database abcd
    go
    use abcd
    go
    create table dd(
       col1 int,
       col2 char(5)
    )
    go
    于是我就写:strSQL="Use master \r\ncreate database abcd \r\n use abcd \r\n create table dd(\r\n col1 int,\r\n col2 char(5)\r\n)";
    结果就发生执行错误,然后我把语句改成两句:
    strSQL="Use master \r\ncreate database abcd ";
    strSQL2="use abcd \r\n create table dd(\r\n col1 int,\r\n col2 char(5)\r\n)";
    分别执行就成功了,请问这是为什么呢?
      

  6.   

    我是在Command 对象中使用的上述语句,不知是不是有关系?
      

  7.   

    我没有在串中用过use(我用不同的connection登录时指定数据库名)。不过,再串中使用use应该可行。只是,use也许要求:必须是批处理的“第一条”命令。所以,如果你编“安装程序”,在逐行读取sql文件时看到单独一行只有一个go命令时就将前边的命令写成的串发送服务器,这与查询分析器的执行方式就一致,不会出错了。
      

  8.   

    还有其它不下十种命令,例如create procedure等等,要求必须是批处理中第一条可执行命令。要注意查一下命令手册。
      

  9.   

    我将Command 对象换成 Connection 对象,使用上面的语句可以一条语句就做完所有的事情,不过还没有试过创建存储过程和触发器是不是也可以胜任。谢谢 w_rose(w_rose) 的关照,我试一下再告诉你结果。
      

  10.   

    我刚才试了创建存储过程和触发器:
    strSQL="Use master \r\ncreate database abcd \
    \r\nuse abcd \r\ncreate table dd( col1 int, col2 char(9)  )\
    \r\ncreate proc fir \r\nas\r\nbegin raiserror('abc',16,1) end\
    \r\ncreate trigger infir on dd for insert \r\nas\
    \r\nbegin if (select col1 from inserted)<10 \
    \r\nraiserror('ddd',16,1) end";
    TRACE(strSQL);得到:
    Use master 
    create database abcd 
    use abcd 
    create table dd( col1 int, col2 char(9)  )
    create proc fir 
    as
    begin raiserror('abc',16,1) end
    create trigger infir on dd for insert 
    as
    begin if (select col1 from inserted)<10 
    raiserror('ddd',16,1) end如果在查询分析器中加入go即为:
    Use master 
    go
    create database abcd 
    go
    use abcd 
    go
    create table dd( col1 int, col2 char(9)  )
    go
    create proc fir 
    as
    begin raiserror('abc',16,1) end
    go
    create trigger infir on dd for insert 
    as
    begin if (select col1 from inserted)<10 
    raiserror('ddd',16,1) end
    go
    在查询分析器中可以成功执行,但是在connection对象的execute中返回“未指定错误”!!
      

  11.   

    在查询分析器中每两个go之间的语句,在你的strSQL都要单独作为单个处理发给服务器执行。create proc、create trigger等如果不是批处理的第一条语句,是会出错。另外你的编程环境不能显示数据库系统所报的错误么?按说,excute对象出错是应该返回数据库系统给出的比较贴切的错误解释信息。
      

  12.   

    换句话说,如果你将你录入查询分析器中的所有的go都删除,只保留最后一个,如果还能执行成功,那么你在strSQL中所写的才能说应该一次性全都执行。
      

  13.   

    to :w_rose(w_rose)
    在生成的一个数据库安装程序的sql文件中,肯定有很多Create开头的批处理,那是不是就必须要将这个文件的每个批处理在程序中分离开,各自单独执行呢?
      

  14.   

    提醒:
    不管是用SQL語句還是存儲過程,別忘了加上:
    SET NOCOUNT ON 
    SET ANSI_WARNINGS OFF
    否則,處理SQL返回信息會挺麻煩