各位大侠,我用的是delphi5,数据库用的是vfp,我用bde连接数据库,用一个query来update一个字段的值,update语句我在vfp的命令窗口调试过,没有问题,但是在delphi中运行就提示出错:
  key violation.
 [microsoft][odbc visual foxpro driver]record is not locked.
请各位大侠帮忙解决问题,多谢多谢多谢多谢

解决方案 »

  1.   

    cjlrQuery3的sql:
    update cj set fenshu=:fenshu where kh=:kh and kmdm=(select kmdm from biaozhun where kmmc=:mingc);
    参数传递:
    with datamodule1.cjlrQuery3 do
      begin
       parambyname('fenshu').value:=strtofloat(form4.edit1.text);
       parambyname('kh').value:=datamodule1.cjlrcxQuery3['kh'];
       parambyname('mingc').value:=form3.edit4.text;
       execsql;
      end;
      

  2.   

    你的datamodule1.cjlrQuery3 是打开的吗?
    with datamodule1.cjlrQuery3 do
      begin
       parambyname('fenshu').value:=strtofloat(form4.edit1.text);
       parambyname('kh').value:=datamodule1.cjlrcxQuery3['kh']; //datamodule1.cjlrQuery3 是打开的吗?在打开的数据集上怎么能执行sql!
       parambyname('mingc').value:=form3.edit4.text;
       execsql;
      end;
      

  3.   

    datamodule1.cjlrQuery3 没打开啊,我打开的是另外一个datamodule1.cjlrcxQuery3
      

  4.   

    key violation.是个很常见的错误,他的意思是关键字问题,但一般都不是这问题,主要是你代码中的问题,你该检查代码才对
      

  5.   

    我就是检查不出代码问题啊,用debug调试过,在上面代码的execsql;处设置了断点,各个变量的值都传进来了,没有问题,我把sql语句放到vfp的命令窗口执行(当然是把参数换成的具体数据),也没有问题,但是在delphi中运行就有那样的提示,并且也是执行到execsql;处停止
      

  6.   

    update cj set fenshu=:fenshu where kh=:kh and kmdm=(select kmdm from biaozhun where kmmc=:mingc);
    上面的句子中=和:要有空格
      

  7.   

    檢查字段fenshu和其它表的字段時否有關聯
      

  8.   

    多谢各位的回帖,我依次按大家的建议检查了:
    1。=和:之间没有空格是可以的,有空格也不出错
    2。我的数据库结构大致是这样的:
      学生表我用了这样几个字段:学籍号,姓名,年级号,班级号。
      成绩表用了这样几个字段:学籍号,考号,科目代码,分数,日期
      课程表用了这样几个字段:科目代码,科目名称
     所以,字段fenshu应该和其他表的字段没有关联,关键字也应该没有问题,因为在vfp的命令窗口我写了相同的update cj set fenshu=98 where kh='10101' and kmdm=(select kmdm from biaozhun where kmmc='语文');只不过把参数都换成了具体数据,可以执行成功,在delphi中,我在程序代码execsql;处设置断点,用debug看到三个参数的数据也都正确传进来了,但就是在execsql;处出错。
    这个问题真的捆饶我太久了,如埂在喉,不吐不快,希望各位大侠帮忙帮忙,不胜感激,问题解决,马上结贴!
      

  9.   

    用这个看行不行
    update cj set fenshu=:fenshu where kh=:kh and kmdm in (select kmdm from biaozhun where kmmc=:mingc);
      

  10.   

    楼上,这个不是问题所在啊,我的select kmdm from biaozhun where kmmc=:mingc返回值是唯一的,可以用=的哦,还有,我换了in,但是问题依旧,我哭啊,我哭
      

  11.   

    update cj set fenshu=:fenshu where kh=:kh and kmdm=(select kmdm from biaozhun where kmmc=:mingc);
    可能在=(select kmdm from biaozhun where kmmc=:mingc);
    这里出的问题,select kmdm from biaozhun where kmmc=:mingc 该语句查询出来的不唯一,
    再检查看看
      

  12.   

    用Update 语句在FoxPro中执行一次,看是不是正确。
      

  13.   

    多谢大家的回帖,一一回应如下:
    1。select kmdm from biaozhun where kmmc=:mingc 语句查出来的记录是唯一的,这点我可以肯定
    2。update语句我在foxpro中执行了,没有问题
    这两点我在前面的回复中已经确定了,不是问题所在,但是问题依旧,我现在简直怀疑是不是delphi5的bug ,,因为我之前发现了delphi5的ado控件的 bug,才转用的bde,但现在这个问题我确实不知道怎么回事,请高手提点啊,多谢多谢了,问题解决一定加分结贴
      

  14.   

    我换了delphi7试了一下,结果问题依旧,估计还是我的问题,但我实在找不到原因,哭啊