Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1707292
  • 博文数量: 263
  • 博客积分: 1218
  • 博客等级: 少尉
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-19 02:33
文章分类

全部博文(263)

文章存档

2020年(12)

2019年(2)

2018年(10)

2016年(1)

2015年(20)

2014年(115)

2013年(46)

2012年(37)

2011年(20)

分类: WINDOWS

2013-03-20 17:01:13

DBExpressTSQLConnection, TSQLDataSet, TDataSetProvider, TClientDataSet来查询和修改数据库,时有“Unable to find recod.  No key specified”的错误.除武装解决办法就是:

DataSetProvider.DataSet指定的那个数据集设置主键字段就好了.


例子:

这里是mysql数据库, 数据名是test, 里有一张表:

CREATE TABLE t3 (

  class int(11) COMMENT '班级',

  id int(11)  COMMENT '座号',

  name varchar(6) COMMENT '名字',

  score int(11) COMMENT '分数',

  PRIMARY KEY (class,id) -- 

);

里面已有数据:  insert into t3 values (1, 1, 张三, 50)

                        insert into t3 values( 1, 5, 王六, 50)

                       insert into t3 values( 1, 8, 周七, 50)

                       insert into t3 values(2, 1, 赵五, 50)
 

加入各组件, 并且各组件的属性设置如下:

对象                            对象类型                     属性                                   值

SQLConnection1        TSQLConnection          设置连接到数据库...

SQLDataSet1            TSQLDataSet              SQLConnection                    SQLConnection1

DataSetProvider1        TDataSetProvider           DataSet                             SQLDataSet1        
                                                          updateMode                        upWhereKeyOnly
                                                        
Options.[poAllowCommandText]       true

                                                       ResolveToDataBase                     false

ClientDataSet1         TClientDataSet        ProviderName                     DataSetProvider1

DataSource1            TDataSource             DataSet                             ClientDataSet1

DBGrid1                   TDBGrid                    DataSource                          DataSource1

eScore                    TEdit

btSelect                  TButton

btEdit                     TButton

btApplyUpdates       TButton



其中: DataSetProvider1updateMode设置为upWhereKeyonly表示更新数据库时, DataSetProvider生成的sql语句是根据主键来生成where语句;  

      DataSetProvider1Options 设置为poAllowCommandText表示可以把sql语句写在ClientDataSet1,不然的话我们就必须要写在SQLDataSet1中了. 

加入查询桉询事件代码如下:


  1. procedure TForm1.btSelectClick(Sender: TObject);

  2. begin

  3. try

  4.     ClientDataSet1.Active:=false;

  5.     ClientDataSet1.CommandText:='select * from t3 '+

  6.                                     ' where class =:class and id=:id'; // 带参数sql语句查询

  7.     ClientDataSet1.Params.ParamByName('class').AsInteger:=1;

  8.     ClientDataSet1.Params.ParamByName('id').AsInteger:=1;

  9.     ClientDataSet1.Active:=true;



  10.     Except

  11.         on e:Exception do

  12.             begin

  13.             ShowMessage('查询数据库出错'+e.Message);

  14.             End;

  15.     end;

  16. end;

 



还有更新数据库的按钮事件代码如下:


  1. procedure TForm1.btApplyUpdatesClick(Sender: TObject);

  2. begin

  3. Try

  4.         ClientDataSet1.Edit;

  5.         ClientDataSet1.FieldByName('score').AsInteger := StrToInt(eScore.Text);


  6.         //加入下面几行就不会错了 
  7.         //DataSetProvider1.DataSet.Open; //打开数据集以获得字段属性 

  8.         //With DataSetProvider1.DataSet.FieldByName('class') do // 所有主键字段都要加上[pfInKey]属性

  9.         // ProviderFlags := ProviderFlags + [pfInKey];

  10.         //With DataSetProvider1.DataSet.FieldByName('id') do

  11.         // ProviderFlags := ProviderFlags + [pfInKey];


  12.         
  13.         ClientDataSet1.ApplyUpdates(0);

  14.         ClientDataSet1.Active:=false;//重新查数据库, 获取最新数据

  15.         ClientDataSet1.Active:=true;


  16.         Except

  17.         on e:Exception do

  18.             ShowMessage(e.Message);

  19.     End;

  20. end;
运行: 并输入新成绩进行更新, 会产生异常: “Unable to find recod.  No key specified”,

当加入设置主键字段的代码(注释掉的那部分)时就不会出错了.

转: http://blog.csdn.net/xieyunc/article/details/4140573


阅读(1846) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~