with form1.ADOQuery2 do
begin
close;
SQL.Clear;
sql.Add('insert into materials(a,b,c,d,e,');
Sql.add('f,g,h,i,j,');
Sql.add('k,l,m,n,o,p,q)');
sql.add('values(:a,:b,:c,:d,:e,');
sql.add(':f,:g,:h,:i,:j,');
sql.add(':k,:l,:m,:n,:o,:p,:q)');
parameters.ParamByName('a').value:=trim(edit2.Text);
parameters.ParamByName('b').value:=trim(edit1.Text);
parameters.ParamByName('c').value:=trim(edit3.Text);
parameters.ParamByName('d').value:=trim(edit4.Text);
parameters.ParamByName('e').value:=trim(edit5.Text);
parameters.ParamByName('f').value:=trim(edit6.Text);
parameters.ParamByName('g').value:=trim(edit7.Text);
parameters.ParamByName('h').value:=trim(edit8.Text);
parameters.ParamByName('i').value:=trim(edit9.Text);
parameters.ParamByName('j').value:=trim(edit10.Text);
parameters.ParamByName('k').value:=trim(edit11.Text);
parameters.ParamByName('l').value:='';
parameters.ParamByName('m').value:='';
parameters.ParamByName('n').value:='';
parameters.ParamByName('o').value:='';
parameters.ParamByName('p').value:='';
parameters.ParamByName('q').value:='';
execsql;

我用的是access数据库
上述代码中a到q都是数据表materials的字段(在我的原程序中字段都是汉字,这里用字母代替了,由于字段比较多,我在程序中用分行显示),其中a、b数据类型在access数据表中显示的是“文本”,其他的都是“数字”,我的界面中edit1,edit2输入的都是汉字加字母组合的字符串,而其他的edit都输入的是数字。l到m在数据表中是空值,界面中也不输入具体值。

但我运行时,输入相关内容后总是显示“insert into 语句的语法错误”,不知道这是哪里出错了,请教各位高人,谢谢!

解决方案 »

  1.   

    acess不了解,對于number type:是否需要strtoint(trim(edit5.text))一下?edit的內容好像是數組
      

  2.   

    如果字段类型是字符串那么在insert语句的赋值部分要加转义字符',如insert into table1(a,b)values('aaa',1)(此处假设a字段为字符串类型,b字段为数字类型)。而把他变成delphi代码就要便车这样:
    sql.Add('insert into table1(a,b)values(:a,:b)');
    parameters.ParamByName('a').value:=''''+trim(edit2.Text)+''''; //字符串前后加'
    parameters.ParamByName('b').value:=trim(edit1.Text);  //是数字保持原状建议你使用sql.savetofile('c:/1.txt');查看最终提交的语句到底是什么。
      

  3.   

    with form1.ADOQuery2 do 
    begin 
    close; 
    SQL.Clear; 
    sql.Add('insert into materials (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q)'
           + 'values(:a,:b,:c,:d,:e,:f,:g,:h,:i,:j,:k,:l,:m,:n,:o,:p,:q)'); parameters.ParamByName('a').value:=trim(edit2.Text); 
    parameters.ParamByName('b').value:=trim(edit1.Text); 
    parameters.ParamByName('c').value:=strtoint(edit3.Text); //注意区分输入值的类型
    parameters.ParamByName('d').value:=strtoint(edit4.Text); 
    parameters.ParamByName('e').value:=strtoint(edit5.Text); 
    parameters.ParamByName('f').value:=strtoint(edit6.Text); 
    parameters.ParamByName('g').value:=strtoint(edit7.Text); 
    parameters.ParamByName('h').value:=strtoint(edit8.Text); 
    parameters.ParamByName('i').value:=strtoint(edit9.Text); 
    parameters.ParamByName('j').value:=strtoint(edit10.Text); 
    parameters.ParamByName('k').value:=strtoint(edit11.Text); 
    parameters.ParamByName('l').value:=''; 
    parameters.ParamByName('m').value:=''; 
    parameters.ParamByName('n').value:=0; 
    parameters.ParamByName('o').value:=0; 
    parameters.ParamByName('p').value:=0; 
    parameters.ParamByName('q').value:=0; 
    execsql; 
    end;
      

  4.   

    程序没任何问题。问题出在数据上:
    其中a、b数据类型在access数据表中显示的是“文本”,其他的都是“数字”
    那么除Edit1,Edit2可以是文本,其它必须是数字内容,且
    parameters.ParamByName('l').value:=''; 
    要写成
    parameters.ParamByName('l').value:=0; 
    最好在
    parameters.ParamByName('c').value:=trim(edit3.Text);
    前判一下它的内容是否为数字
    简单的:
    try
    strtoint(trim(edit3.text));
    except
     ShowMessage('请在Edit3.Text中输入数字');
     exit;
    end;
      

  5.   

    我用的是parameters.ParamByName('d').value:=strtofloat(edit4.Text); 出现的错误是“''is not a valid floating point value ”。这个问题昨天困扰我好久,今天就把strtofloat给删了,就出现了上述错误。此外我用Internetroot 的方法
    ''''+trim(edit2.Text)+''''仍然出现“insert into 语句的语法错误”错误。
      

  6.   

    一定是字段数据类型的问题 
    好好检查一下类型 看看出错的地方 比如数字型是整数还上浮点数
    推荐你一款软件 《万能查询分析器》 能在access上用的 根sqlserver的一样
    到那里执行insert 就能更方便的看出是那里的问题
    http://www.skycn.com/soft/31613.html  ----万能查询分析器
      

  7.   

    所有edit.text只能给字符串赋值,你看一下数据库中的每个字段,如果不是字符串都要在赋值时用相应的函数对edit。text进行转换。
      

  8.   

    你用ShowMessage(SQL.text);
    看看 
    然后再把你得到的SQL语句考备到ACCess里的SQL里去运行一遍
    就知道哪儿的问题了
      

  9.   

    如果你的parameters.ParamByName('d').value:=strtofloat(edit4.Text); 
    出现''is not a valid floating point value ,说明你的edit4.Text为空,而''是不能转为数字的
    你要将edit3~edit11的text都设为数字,如果没有值,将它们的text设为'0'
      

  10.   

    sql := 'INSERT INTO A(A1,A2,A3)' ;
    sql := sql + 'VALUES(' + ''''+B1+''''+',';
    sql := sql + ''''+B2+''''+',';
    .......
    sql := sql + ');edit1.text := sql ;
    try
     q.sql.text ::= sql ;
     q.execsql;
    except
      ///
    end;
    然后把生成的SQL在查询分析器中运行一下就行了。