小弟做了一个借书的功能,想在借阅信息表插入一行数据的 但我插入数据的时候报错了 
错误:“不正常地定义参数对象,提供了不一致或不完整的信息。”
可能问题出在红字上 向各路高手请教。。
程序如下:
procedure Tfrm_jsqr.Button1Click(Sender: TObject);
var
b:integer;
c:string;
begin
b:=data1.ADOqr.fieldbyname('书籍总数').Value;
if b=0 then
application.MessageBox('此书全部外借中','提示',64)
  else
  begin
     with data1.ADOdzxx do
     begin
         close;
         sql.clear;
         sql.Add('select * from 读者信息表 where ID=:c');
         parameters.ParamByName('c').Value:=edit1.Text;
         open;
     end;
     data1.ADOdzxx.Active:=true;
     with data1.ADOjyxx do
     begin
        close;
        sql.Clear;
        sql.Add('insert 借阅信息表 value (:a,:b,:c,:d,:e,:f)');
        parameters.ParamByName('a').Value:=edit2.Text;
        parameters.ParamByName('b').Value:=data1.ADOdzxx.fieldbyname('姓名').Value;
        parameters.ParamByName('c').Value:=datetostr(date());
        parameters.ParamByName('d').Value:=datetostr(date());
        parameters.ParamByName('e').Value:=null;
        parameters.ParamByName('f').Value:=null;
        open;
     end;
     data1.ADOjyxx.Active:=true;
  end;
  b:=b-1;
end;补充:借阅信息表的a b c d e f 类型分别为 varchar varchar datetime datetime int datetime 
最后的俩个 我是允许为空的

解决方案 »

  1.   

    parameters.ParamByName('a').Value:=edit2.Text这个错了,varchar要加'',你改为:
    parameters.ParamByName('a').Value:=QuotedStr(edit2.Text)
      

  2.   

    楼主你这种写法存在严重问题,而且datetostr有严重的本地化问题,建议写法:with data1.ADOjyxx do
      begin
        Close;
        Sql.Clear;
        Sql.Add('Select * From 借阅信息表 Where 1=2');
        Open;
        Append;
        FieldByName('FieldName').AsString := edit2.Text;
        FieldByName('FieldName').AsDateTime := Date();
        Post
      end;代码没有实测,仅供风格参考
      

  3.   

    引用楼主:
    parameters.ParamByName('a').Value:=edit2.Text;
    parameters.ParamByName('b').Value:=data1.ADOdzxx.fieldbyname('姓名').Value;
    parameters.ParamByName('c').Value:=datetostr(date());
    parameters.ParamByName('d').Value:=datetostr(date());
    parameters.ParamByName('e').Value:=null;
    parameters.ParamByName('f').Value:=null; 
    你这种写法有严重的问题。datetostr(date());这个Date()有本地化的时间,写法不对:改为:FieldByName('FieldName').AsDateTime := Date();
    parameters.ParamByName('a').Value:=QuotedStr(edit2.Text);
      

  4.   

    不正常地定义参数对象,提供了不一致或不完整的信息
    是sql 这个控件的参数错误 好好检查下你的SQL 语句是否正确 
    如果正确 在去 sql.Parameters 看看参数的类型 是否设置正确   我也遇到到这种问题  后面看了下参数才知道   最主要是 SQL 语句的语法可能有错误 
    参数 控件无法 正确的取到参数  比如  经常有参数为  ftunkonw  要自己正确的去设置
      

  5.   

    把open改为ExecSql   
    还有居然open了..就没必要再active=true了..
     对于楼上的前辈们说的..  我以前也是varchar..和楼主一样的写法..但是没有报错过..
      

  6.   

    where 1=2
    呵呵,是不是为了不让他查询出记录而提高速度?
    学习了!
      

  7.   

    对,Where 1=2就是只取表结构,不取表记录。
      

  8.   

    给你的代码为什么不好好看看,而且手动调试一下呢,都告诉你的代码是有问题的,你哪样写即使在你电脑上没问题,到别的电脑运行就可能出错,这些都是因为你的DateToStr是有本地化问题,改用:with data1.ADOjyxx do
      begin
        Close;
        Sql.Clear;
        Sql.Add('Select * From 借阅信息表 Where 1=2');
        Open;
        Append;
        FieldByName('FieldName').AsString := edit2.Text;
        FieldByName('FieldName').AsDateTime := Date();
        Post
      end;
      

  9.   


    完全按照您的来写的 报错:未找到fieldname 
      

  10.   

    FieldName是字段名,要替换为你自己的字段名