我使用ADOQuery或ADOCommand组件来插入数据,结果会出现错误。请各位大侠帮忙看看哪里出的问题。具体情况如下:
我使用的是access数据库,表名为cost,表结构如下:
字段名     类型
Id       自动增长
Date     日期时间
Item     文本 (50)
Money    货币
我在ADOQuery的SQL属性中设置命令为:
insert into cost(Date,Item,Money) values(:Date,:Item,:Money)
点击ok后可以在Paramenters属性中看到Date,Item,Money变量名称。
但当我使用如下代码:
ADOQuery1.Parameters.ParamByName('Date').Value:=edtDate.Text;
ADOQuery1.Parameters.ParamByName('Item').Value:=edtItem.Text;
ADOQuery1.Parameters.ParamByName('Money').Value:=edtMoney.Text;
ADOQuery1.ExecSQL;
进行数据插入的时候结果出现
“INSERT INTO 语句的语法错误。”的错误提示。
但当我将SQL语句改为:
insert into cost(Item) values(:Item)
再使用
ADOQuery1.Parameters.ParamByName('Item').Value:=edtItem.Text;
ADOQuery1.ExecSQL;
就可以添加成功。
但换成其他的字段如Date或Money都不行,还是会出现“INSERT INTO 语句的语法错误。”的错误提示。
使用ADOCommand控件也与使用ADOQuery1控件一样,会出现相同的错误。
不知道是不是因为与表中定义字段类型不符所以出现这样的错误?如果是的话要怎么解决呢?如果不是,那又会是什么问题呢?请各位大侠不吝赐教。

解决方案 »

  1.   

    ADOQuery1.Parameters.ParamByName('Date').Value:=edtDate.Text;
    ADOQuery1.Parameters.ParamByName('Item').Value:=StrToDate(edtItem.Text);
    ADOQuery1.Parameters.ParamByName('Money').Value:=StrToCurr(edtMoney.Text);
      

  2.   

    请将日期内型进行转化。
    我以前也遇到这样的问题。
    如果数据库不是access,那么采用:
    adoquery2.Close;
    adoquery2.SQL.Clear;
    adoquery2.sql.Add('select * from input where 录入员=:lry and 日期=:rq');
    adoquery2.Parameters.ParamValues['lry']:=trim(form1.StatusBar1.Panels[1].Text);
    adoquery2.Parameters.ParamValues['rq']:=FormatDateTime('yyyy-mm-dd',datetimepicker1.Date);
    adoquery2.Open;
    adoquery2.First;
    请看上面的adoquery2.Parameters.ParamValues['rq']:=FormatDateTime('yyyy-mm-dd',datetimepicker1.Date);
    中的格式。
    如果是ACCESS数据库,那么加入'#'来进行参数传递日期型。
      

  3.   

    昨天我采用SQL Server数据库,建了一个与上面类似的表,Date为datetime类型,Money为money类型,然后采用上面的方法进行插入,结果不用作类型转换就成功了,应该是sqlserver有自动转换的功能,但采用access数据库就是死活不行,就是作了类型转换也还是出现“INSERT INTO语句语法错误”的提示。上面这位所说的加入'#'来进行参数传递日期型是要如何使用呢?
      

  4.   

    大哥,先不要收藏,我的问题还没有解决呢?帮帮忙吧,我都快被气死了,试了多种方法,感觉不应该有错误啊,可是就是不行...用insert语句向access数据库插入数据就那么难吗?
      

  5.   

    注意jet engine对日期型常量的要求前后加#。
      

  6.   

    给个实例吧?我用
    insert into cost(Date) values('#2002-1-1#')
    insert into cost(Date) values(#2002-1-1#)
    insert into cost(Date) values("#2002-1-1#")
    试了可是还是提示同样的错误!!
      

  7.   

    ACCESS数据库,那么加入'#'来进行参数传递日期型。insert into table11(a1,a2) values('#2002-01-01#','ddddddd');
      

  8.   

    终于将日期插进access表里了!!!
    在试过诸多看起来没有语病的insert into语句之后,我终于决定要将那个日期类型字段改命了,我想那个字段可能是因为名字的关系导致了错误(至于是什么错误我就不太清楚了,我想会不会是Date本身是一个函数,用在“'insert into cost(Date)...'”里的时候会取出一个什么数据出来,导致了sql语句的语法错误,不过照理说因为在字符串里面,编译的时候应该不会被误认为是一个函数。所以只好期待高手们的说明了),于是将字段名Date改为Dtype,然后再用insert into cost(Dtype) values(#2002-1-1#)插入数据,结果成功了!!!然后我又怀疑,会不会现在我将字段名称改会Date也能插入成功呢?就又将字段名改回Date,在插入,结果还是出现原来的错误,看来问题真的出现在这里。但是难道字段名就不能设置为Date吗?忽然想到以前在SQL Server里有看到当字段名称带有空格的时候,就用"[]"把字段括起来,就试着用下面的语句:insert into cost([Date]) values(#2002-1-1#),结果插入成功。(后来我发现那个字段名为Money的也有这个毛病,也要用[]括起来才可以,至于为什么,不清楚,不知道会不会因为与字段的属性名一样)
    最后,我发现其实插入字符串其实也是可以的,可以不用作类型转换,如果用字符串的话,可以不用在前后加#符号。所以当我作如下修改后,即可成功插入数据到表中:
    ADOQuery1的SQL属性设为: insert into cost([Date],Item,[Money]) values(:Date,:Item,:Money)
    插入代码如下:
    ADOQuery1.Close;
    ADOQuery1.Parameters.ParamByName('Date').Value:=edtDate.Text;
    ADOQuery1.Parameters.ParamByName('Item').Value:=edtItem.Text;
    ADOQuery1.Parameters.ParamByName('Money').Value:=edtMoney.Text;
    try
     ADOQuery1.ExecSQL;
    finally
     ADOQuery1.Close;
    end;
    最后感谢所有上面作出回复的朋友,从你们的回复中我学到了许多。