我使用SQL企业管理器将一个数据库使用SQL生成脚本,生成有1000多行
我现在想在Delphi7.0中调用这个SQL语句执行,但LoadFromFile出来的
语句出现乱码。不知如何,我使用TStringList,SQL.LoadFromFile,
Memo1.LoadFromFile出来的都存在乱码。如何才能把这个超长的SQL语句执行?思路:我想把一个生成SQL脚本,可以让用户自己建立数据库,我只需要将生成的
SQL脚本中的相应的数据库替换成用户的数据库名。使用StringReplace语句。注:SQL生成默认是以SQL为后缀,我自己新建一个文本文件再拷贝也不行。

解决方案 »

  1.   

    把脚本分成两个文件,一个只create database的,另外一个create其他的,create database的用delphi直接调用,create 其余项的由于分很多事务,就是很多go,所以最好用delphi 调用osql命令来做
      

  2.   

    分成多个文件,然后
    SQL.LoadFromFile
      

  3.   

    建议按事务分开处理。
    如果语句太多,建议先upload到服务器上,然后在服务器端运行。否则执行中出现异常,在客户端的rollback控制可能会让你抓狂。
      

  4.   

    ps,sql server服务器可以直接运行sql文件,而不只是sql语句:)
      

  5.   

    在SQL查询分析器中可以调入执行,有没有在DOS状态下来执行此语句,如
    RUN -S服务器名 -U用户名 -P密码 ‘c:\sql.sql’ 这样命令这样,我可以调用winExec执行
      

  6.   

    of course,there is.
    pick help article with 'Command' in SQL online help.(i hope it is, forgive me for so long a long not use sql)
      

  7.   

    能不能放在SQL数据库IMAGE类型的字段中,不知提出来会不会变乱码,试试!
    大家有什么高见,发表发表如何新建数据库,当表很多的时候,我以前是以附加的方式,
    但必须在服务器上执行。
      

  8.   

    一行一行地读,判断语句的类型,用Open和ExceSqL分别执行
      

  9.   

    现在我使用 osql -S 服务器名 -U 用户名 -P 密码 -i SQL文件脚本
    可以完成任务,在delphi中使用winexec(上面的命令,sw_Hide)
    1、如何才能知道命令有没有正确执行。2、怎么可以等待上面的DOS任务结束后,才继续下面的任务。  我是这样,在master..database中寻找数据库名,有说明数据库创建成功。
      再打开这样数据库,计算里面的表数,即sysobject 中xtype='U'有没有和我创建的数量是不是一样,但有个问题,就是2,这条DOS命令一执行,就紧跟执行下面的语句,可能还有一些表没有创建好。所以怎么才知道这个DOS已经结束
      

  10.   

    我建数据库都是用存储过程的,应用程序直接调用sql太畸形了吧
      

  11.   

    我的SQL教本文件都不止1000行,呵呵,也没有出过问题,下面是这个函数,你应该可以看的懂的;procedure TFrmSJKAZ.ExecSQLFile(sFileName:String);
    var
     i :integer;
     FileLn :TStringList ;
    begin
      adqTool.Close ;
      adqTool.SQL.Clear ;
      if FileExists(sFileName)  then
        begin
          FileLn :=TStringList.Create ;
          FileLn.LoadFromFile(sFileName);
    //进度条的变化
          PBJDT.Max := FileLn.Count;
          PBJDT.Min := 0;
          PBJDT.Position := 0;
          self.Refresh;      for i :=0 to FileLn.Count-1 do
            begin
              if Trim(FileLn.Strings[i])<>'' then
                begin
                  if Pos('--',Trim(FileLn.Strings[i]))<>1 then
                    begin
                      if pos('DDDDDDDDDD',Trim(FileLn.Strings[i]))>0 then
                        FileLn.Strings[i]:=StringReplace(FileLn.Strings[i],'DDDDDDDDDD',trim(EdtAZLJ.Text)+'\FX'+sJSLX+'DB.MDF',[rfReplaceAll]);
                      if pos('LLLLLLLLLL',Trim(FileLn.Strings[i]))>0 then
                        FileLn.Strings[i]:=StringReplace(FileLn.Strings[i],'LLLLLLLLLL',trim(EdtAZLJ.Text)+'\FX'+sJSLX+'DB_LOG.LDF',[rfReplaceAll]);
                      if UpperCase(Trim(FileLn.Strings[i]))='GO' then
                        begin
                          try
                            adqTool.ExecSQL ;
                          except
                          end;
                          adqTool.SQL.Clear ;
                        end
                      else
                         adqTool.SQL.Add(FileLn.Strings[i]);
                    end;
                end;
              PBJDT.Position := i;
              self.Refresh;
            end;
          FileLn.Free ;
          PBJDT.Position := PBJDT.Max;
          self.Refresh;
          bSQL := True;
        end
      else
        begin
          MessageBox(Handle,'SQL文件不存在!','提示信息',MB_ICONINFORMATION+MB_OK);
          bSQL := False;
        end;
    end;
    其中,'DDDDDDDDDD'和‘LLLLL’部分是我为了建立数据库名称时替换用的。
      

  12.   

    这个原来偶也搞过,总的感觉是焦头烂额!Load时发现go好像就报错!没有时也报错!