with TStringList.Create() do
  try
    LoadFromFile(FilePath);
    if Count = 0 then Exit;
    S := '';
    for i := 0 to Count - 1 do
    begin
      if UpperCase(Trim(Strings[i])) = 'GO' then
      begin
        DBConnection.Execute(S);
        S := '';
      end
      else
        S := S + Strings[i] + #13 + #10;
    end;
  finally
    Free;
  end;
这段代码是用来建数据库里的表的,FilePath里的文件路径内容都正确,但是我运行却没有建成库,我后来发现是Count=1,但是事实上文件里有好几个表的CREATE TABLE语句,求助怎么样才能解决这个问题?

解决方案 »

  1.   

    是不是go后面有分行?count==1?是不是sql文件没有换行?
      

  2.   

    CREATE TABLE TB_AREATYPE(
      ID            int                IDENTITY (1, 1) NOT NULL,
      AREATYPE      nvarchar(20)       NOT NULL,
      AREANO        nvarchar(10)       NOT NULL,
      OPERID        nvarchar(10)       NOT NULL

    GOSQL文件就是这种格式
      

  3.   

    DBConnection.Execute 执行的SQL脚本不需要 go.去掉go,再试试。
    如果count==1,检查一下Strings[0]的内容。是否包含了全部的SQL语句。
      

  4.   

    我试了,去不去GO结构都一样,我用下面的方法试了一下:
       list := TStringList.Create;
       list.LoadFromFile(FilePath);   ShowMessage(IntToStr(Length(list.Strings[0])) + ':' + list.Strings[0]);结果显示的是3:馀  (后面的是个乱码)
      

  5.   

    TStringList 的分隔符设为换行符
      

  6.   

    看一下你的scripte文件字符集,最好用ansi试试看
      

  7.   

    To 5楼的朋友:分隔符设为换行符怎么设置?
    To  6楼的朋友:我看了一下文件的字符集,它里面只有两个选项,一个是西方,一个是CHINESE_GB2312
      

  8.   

    to icegirl914,我刚测试过,完全可以,建议用工具如ultraedit等查看该文件的十六进制编码,查看是否没行末尾出现#13#10(delphi 表示),或16进制表示为:0D0A,如果是的话就行,不是的话就是你所说的count为0.如果不是,解决方案就是你设置stringlist的Delimiter为你的sql文件的分隔符号.再设置delimiterText,然后使用count也可以满足你的要求..
    请楼主拿去测试,祝你通过
      

  9.   

    谢谢上面回帖的朋友,问题已经解决了,其实我也不知道怎么回事,我原先是在SQL server2000里生成的脚本,我用楼上朋友说的ultraedit工具看,发现有0D0A,但是显示出来是000D000A,是两个字节一个单位的,我现在在原先同事用的一个scripte文件的基础上,自己再把代码打进去,这样一运行建表就成功了,我看过两个文件的不同处就如:可以建表的显示0D0A,建不了表的是000D000A
      

  10.   

    碰到Unicode的情况,可以使用TWideStringList(WideStrings.pas单元定义)替代TStringList解决。