我要把很长的数据插入到表中,如果用string拼装起来提示错误
[Error]   Unit1.pas(29):   String   literals   may   have   at   most   255   elements 
字段类型是varchar(500000);想问大家有没好的办法?
procedure TForm1.Button1Click(Sender: TObject);
var str,str1,str2,str3,str4:string;
begin
  str1:='使得法国第三方豆腐干豆腐干梵蒂冈的豆腐干豆腐干第三方个1';
  str2:='八岁的三大法宝撒到了分别萨洛夫洛夫德洛夫不是大风2';
  str3:='撒旦法士大夫摩萨德皮肤开始大幅士大夫撒旦法士大夫3';
  str4:='士大夫撒旦法送达法律士大夫士大夫士大夫士大夫士大夫士大夫4';
  ASQLite3Query1.SQL.Clear;
  ASQLite3Query1.SQL.Add('insert into dbRevSms values('+edit1.Text);
  ASQLite3Query1.SQL.Add(str1);
  ASQLite3Query1.SQL.Add(str2);
  ASQLite3Query1.SQL.Add(str3);
  ASQLite3Query1.SQL.Add(str4);
  ASQLite3Query1.SQL.Add(edit2.Text+')');//这样拼装sql.add有错误的。
 // showmessage(ASQLite3Query1.SQL.CommaText);
  ASQLite3Query1.Open;
end;

解决方案 »

  1.   

    超过255个字符了。这样就可以了啊sql.add('aaaaaaaaaaaa'+'bbbbbbbbbbb');//但是不要大于255字符,大于255请使用+分割成2段
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var str,str1,str2,str3,str4:string;
    begin
      str1:='使得法国第三方豆腐干豆腐干梵蒂冈的豆腐干豆腐干第三方个1';
      str2:='八岁的三大法宝撒到了分别萨洛夫洛夫德洛夫不是大风2';
      str3:='撒旦法士大夫摩萨德皮肤开始大幅士大夫撒旦法士大夫3';
      str4:='士大夫撒旦法送达法律士大夫士大夫士大夫士大夫士大夫士大夫4';
      ASQLite3Query1.SQL.Clear;
      ASQLite3Query1.SQL.Add('insert into dbRevSms values('''+edit1.Text);
      ASQLite3Query1.SQL.Add(str1);
      ASQLite3Query1.SQL.Add(str2);
      ASQLite3Query1.SQL.Add(str3);
      ASQLite3Query1.SQL.Add(str4);
      ASQLite3Query1.SQL.Add(edit2.Text+''')');//这样拼装sql.add有错误的。
     // showmessage(ASQLite3Query1.SQL.CommaText);
      ASQLite3Query1.Open;
    end;
      

  3.   

    还有你插SQL不要直接写在sql里。
    用赋值
    inset into a (a) values (:a);
      

  4.   

    insert into table (strField) values('abc')字符串要用''包起来
      

  5.   

    那创建表的时候呢
    如果create 很多字段(60个)  
    create table tablename (字段1,字段2字段60)?
    这样写也是提示错误
      

  6.   

    稍微改进了下
    procedure TForm1.Button1Click(Sender: TObject);
    var str,str1,str2,str3,str4:string;
    begin
      str1:='使得法国第三方豆腐干豆腐干梵蒂冈的豆腐干豆腐干第三方个1';
      str2:='八岁的三大法宝撒到了分别萨洛夫洛夫德洛夫不是大风2';
      str3:='撒旦法士大夫摩萨德皮肤开始大幅士大夫撒旦法士大夫3';
      str4:='士大夫撒旦法送达法律士大夫士大夫士大夫士大夫士大夫士大夫4';
      ASQLite3Query1.SQL.Clear;
      ASQLite3Query1.SQL.Add('insert into dbRevSms values('''+edit1.Text+''','''+str1+str2+str3+str4+''','''+edit2.Text+''')');
      showmessage(ASQLite3Query1.SQL.CommaText);
      ASQLite3Query1.Open;
    end;结果:数据插进去了,而且也能显示到dbgrid中。
    但是用数据库打开则看不到数据,为什么呢?
      

  7.   

    2个问题:
    1.在数据库中字段内容巨大的时候,一般情况下是不能直接看到其内容的,只能选中打开才能看到。如果不是就不知道你是什么情况了。
    2. 看到你的做法,想给你点建议。插入数据字字符字段的时候,由于字符内容不确定,可能含有特殊字符,如果采用
      
      'insert into dbRevSms values(''' + edit1.Text + ''')'
      
      这种使用各字符串拼装成一个大字符串的方法,然后用大字符串去提交给SQL解析,由于小字符串的内容不确定,可能造成SQL解析不正确,或者是造成不可预料的后果(极端情况下,例如数据库被删除等,与SQL注入式攻击类似)。
      所以此类需要使用字符串变量的语句应该使用控件中提供的参数功能,如下所示
      
      fQry.Close;
      fQry.SQL.Clear;
      fQry.SQL.Text := 'insert into dbRevSms values(:TemStr1)';
      fQry.ParamCheck := True;
      with fQry.Parameters.ParamByName('TemStr1') do
      begin
        DataType := ftString;
        Value := '乱七八糟的内容等等';
      end;
      fQry.ExecSQL;
      
      如此,不管你的字符串的内容到底是什么,都可以保证你要的插入功能正常执行。
      

  8.   

    楼上的回答正确,一般需要对数据内容进行逐行过滤,否则可能插入成功了,但是执行了很多不知道什么的东西
    一般如果内容非常多的话,建议使用ansistring等代替255长度的string
      

  9.   

    SQL.Add('insert into dbRevSms (a1,a2,a3...) '
                +'Values(:d1,:d2,:d3...')   ;
          Parameters.ParamByName('d1').Value:=...;
          Parameters.ParamByName('d2').Value:=...;
          Parameters.ParamByName('d2').Value:=...;
          .
          .
          .
          ExecSQL;
      

  10.   

    写个存储过程 insert 算了
      

  11.   

    使用存儲過程或用多個SQL.Add分開寫,如:
        qry_weekdetail.Close;
        qry_weekdetail.SQL.Clear;
        qry_weekdetail.SQL.Add( ' SELECT D.CB,D.BM,D.KB,D.XB,C.COLAID AS GH,D.Full_Name AS XM,C.WEEKS,C.TTL,''>''+'''+Trim(dxSpinEdit2.Text)+'''+''Hr'' as TJ,');
        qry_weekdetail.SQL.Add( ' CONVERT(nvarchar(10),DATEADD(DAY,7*( '''+Trim(p)+'''-DATEPART(WEEK,GETDATE())),DATEADD(DAY,2-DATEPART(WEEKDAY,GETDATE()),GETDATE())),120)+''~''+ ');
        qry_weekdetail.SQL.Add( ' CONVERT(nvarchar(10),DATEADD(DAY,6,DATEADD(DAY,7*( '''+Trim(p)+'''-DATEPART(WEEK,GETDATE())),DATEADD(DAY,2-DATEPART(weekday,GETDATE()),GETDATE()))),120) as Isdatetimes ');
        qry_weekdetail.SQL.Add( ' FROM ( SELECT COLAID,SUM(HR) AS TTL,WEEKS FROM (SELECT A.COLAID,A.COLWKT+A.COLJBT+A.COLXXRJB+A.COLJJRJB as HR, ');
        qry_weekdetail.SQL.Add( ' DATEPART(WK,DATEADD(DAY,-1,A.COLRQ)) as WEEKS FROM HR_EMPLOYEE_DAY A ) B WHERE WEEKS='''+ Trim(p)+''' GROUP BY COLAID,WEEKS ');
        qry_weekdetail.SQL.Add( ' ) C LEFT JOIN Res_Hrd_Temp D ON C.COLAID=D.Account_Id where C.TTL>'''+ Trim(dxSpinEdit2.Text)+''' AND D.BM='''+ Trim(z)+''' Order by C.TTL desc ');
        qry_weekdetail.Open;
      

  12.   

    qry_weekdetail.SQL.Add()中加的就是SQL语句,你在查询分析器里面怎么写,这里也怎么写就可以 了
      

  13.   

    你用adotable来实现
    adotable.fieldbyname('').asstring:='';
    这样就不用怕字段长了
      

  14.   

    先赋值到一个TSTRINGLIST里,再用循环
      

  15.   

    什么数据库?mssql不可能有varchar(500000)
    最大varchar(8000),或varchar(max)(sql2005开始支持,最多2G)
    哦。sqlite?
    procedure TForm1.Button1Click(Sender: TObject);
    var str,str1,str2,str3,str4:string;
    begin
      str1:='使得法国第三方豆腐干豆腐干梵蒂冈的豆腐干豆腐干第三方个1';
      str2:='八岁的三大法宝撒到了分别萨洛夫洛夫德洛夫不是大风2';
      str3:='撒旦法士大夫摩萨德皮肤开始大幅士大夫撒旦法士大夫3';
      str4:='士大夫撒旦法送达法律士大夫士大夫士大夫士大夫士大夫士大夫4';
      ASQLite3Query1.SQL.Clear;
      ASQLite3Query1.SQL.Add('insert into dbRevSms values('+quotedstr(
      edit1.Text+str1+str2+str3+str4+edit2.Text
      )+')');
      showmessage(ASQLite3Query1.SQL.Text);
      ASQLite3Query1.Open;
    end;