怎以用DELPHI执行成批SQL语句?
我在给别人做一个软件,我想能不能做一个软件发给对方,然后把*.sql文件发给他,让他执行(类似SQL SERVER的查询分析器)这样我就不要过去附加数据库了,那地方比较远!

解决方案 »

  1.   

    建议使用ADOCommand来执行,在查询分析器当中多语句之间使用"go"分隔,在这当中则使用";"(分号)分隔,即可(注:此方法仅限MSSQL).
      

  2.   

    还有一个问题有个错误:"多步操作产生错误,请检查每一步的状态值 "
    procedure TUserInfo.FormShow(Sender: TObject);
    begin
      //到这里有错误,如果去掉一个就可以?
      ADODataSet1.Active:=true;
      ADOQuery1.Active:=true;
    end;
      

  3.   

    偶做有现成的,直接从文本文件里读SQL语句!其实你直接调存储过程,把那两个文件附加上就可以了,不必手工附加!
    EXEC sp_attach_db @dbname = N'pubs', 
       @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', 
       @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'
      

  4.   

    一个方法很简单,将你要执行的语句写到一个TXT文件中,在程序代码中如下:
    adoquery1.sql.clear;
    adoquery1.sql.loadfromfile('xx.txt');
    adoquery1.excute;
      

  5.   

    做过类似的功能,不过是oracle脚本,调用sqlplus来完成的,但是SQLSERVER的俺就不太知道了
      

  6.   

    to tybeer() :
    这个*.txt文件是不是就是SQL查询分析器中保存的*.SQL文件把它改为*.TXT,要不要改动?
      

  7.   

    D2006的loadfromfile有问题!还不如调用存储过程(exec ...),用查询分析器可以把存储过程加进去
      

  8.   

    *.sql和*.txt除了文件扩展名不同外,其它都是一样D
      

  9.   

    我以前是这样做的procedure TF_GZCL.P2Click(Sender: TObject);
    VAR
      myinifile:Tinifile;
      TYPES,SQLS:STRING;
      X,Y:INTEGER;
    begin
      OPENDIALOG1.InitialDir:=ExtractFilePath(Paramstr(0))+'..\SQLP\';
      IF OPENDIALOG1.Execute THEN
      BEGIN
        try
          myinifile:=Tinifile.Create(OPENDIALOG1.FileName);
        except
          abort;
          APPLICATION.MessageBox('文件读取错误!','林康软件',MB_OK+MB_ICONWARNING);
          EXIT;
        end ;
        TYPES:=myinifile.Readstring('SQLPROGRAM','PROGNAME','ERROR');
        Y:=STRTOINT(myinifile.Readstring('SQLPROGRAM','SQLCOUNT','0'));    IF (TYPES='ERROR') OR (Y=0) THEN
        BEGIN
          APPLICATION.MessageBox('文件格式不正确,不能执行!','林康软件',MB_OK+MB_ICONWARNING);
          EXIT;
        END;
        IF MESSAGEDLG('程序执行包内容为【'+TYPES+'】,确认执行吗?',mtconfirmation,[MBYES,MBNO],1)<>Mryes THEN
        BEGIN
          EXIT;
        END;
        FOR X:=1 TO Y DO
        BEGIN
          ADOGZB.Close;
          ADOGZB.SQL.Clear;
          SQLS:=myinifile.Readstring('SQLPROGRAM','SQLT'+INTTOSTR(X),'');
          TYPES:=myinifile.Readstring('SQLPROGRAM','TYPE'+INTTOSTR(X),'');
          WHILE POS('TABLENAME',SQLS)>0 DO
          BEGIN
            SQLS:=COPY(SQLS,1,POS('TABLENAME',SQLS)-1)+'GZ'+F_MAIN.StatusBar1.Panels[1].Text+COPY(SQLS,POS('TABLENAME',SQLS)+9,LENGTH(SQLS)-(POS('TABLENAME',SQLS)+8));
          END;
          ADOGZB.SQL.Add(SQLS);
          TRY
            IF TYPES='2' THEN ADOGZB.ExecSQL ELSE ADOGZB.Open;
          EXCEPT
            APPLICATION.MessageBox(PCHAR('程序包中共有【'+INTTOSTR(Y)+'】个任务,系统已成功执行了【'+INTTOSTR(X-1)+'】个任务,程式出现错误,不能继续执行!'),'林康软件',MB_OK+MB_ICONWARNING);
            EXIT;
          END;
        END;
        APPLICATION.MessageBox(PCHAR('程序包中【'+INTTOSTR(Y)+'】个任务全部执行成功,请查验!'),'林康软件',MB_OK+MB_ICONWARNING);
      END;
    end;
    ----------------------------------
    INI 文件里的格式如下
    [SQLPROGRAM]
    PROGNAME=补发扣款清零处理
    SQLCOUNT=3
    TYPE1=2
    SQLT1=UPDATE TABLENAME SET 其他补发=0,扣款一=0,扣款二=0,扣款三=0
    TYPE2=2
    SQLT2=UPDATE TABLENAME SET 基础=0,职务=0,浮动=0,级别=0,工龄=0,事业津贴=0,职岗津贴=0,综合补贴=0,特岗=0,地方补贴=0,考勤奖=0,差贴=0,通讯费=0,误节车医=0,房贴=0,离退休=0,定补经费=0,其他=0,其他补发=0,养老金=0,医疗金=0,公积金=0,失业金=0,廉保金=0,所得税=0,扣款一=0,扣款二=0,扣款三=0 WHERE RIGHT(LEFT(编号,9),1)='8'
    TYPE3=1
    SQLT3=SELECT * FROM TABLENAME ORDER BY 编号
      

  10.   

    平时根本不需要修改程序,只需要改INI文本就行了,用户自己修改