修改数据库问题,急,在线等待!

时间:2021-07-30 07:28:05
adotable1.edit;
adotable1.fields[1].value:=adotable2.fields[3].asinteger;
adotable1.post;
在循环写的过程中,写到某条记录时会出现错误信息:
‘键列信息不正确。更新影响到过多的行’。
这是怎么回事?

17 个解决方案

#1


按你的条件选择的纪录有多行

#2


不是啊,我循环时用的是adotable1.next;
现在用的是access数据库,原来做asp时用SQL数据库也遇到过,把数据导入到sql 数据库中之后,到数据库里进行修改,有些记录就修改不了,出现同样的错误信息。
怎么解决啊?

#3


是不是某条记录建立了索引 
在其他table里也用过 ?
在Oracle下我遇见过类似的问题  不知道你的情况是否如此。

#4


没有建立索引,而且表之间没有关系。这是为什么呢?
而且很怪,有些记录可以写入,有些就不行。

#5


ADOTable的KeyField设置不正确。
因为ADO更新数据时,默认以键列字段和修改的字段为条件修改数据。如表A结构: ID: Integer not null primary key, Name: Varchar(30) not null
当使用ADOTable来修改这个表时,它会自动生成类似于SQL语句来更新数据:
KeyField设置为ID:
  修改ID: Update A set ID=[newid] where ID=[oldid];
  修改Name: Update A set Name=[newname] where ID=[oldid] and Name=[oldname];

KeyField设置为Name:
  修改ID: Update A Set ID=[newid] where Name=[oldname] and ID=[oldid];
  修改Name: Update A Set Name = [newname] where Name=[oldname];

请注意当KeyField设置为Name时生成的SQL语句,由于Name的值不一定唯一(重命的现象时有发生),这样查询出来的数据有多条,就是说要更新很多条数据。ADO会提出警告,避免出现这样的情况。

要解决问题很简单,就是把你的KeyField设置为表的主键即可。
当然,也可以修改ADOTable的动态属性,以修改ADO生成SQL语句的规则。

#6


用create语句建立表时怎样设置主键?
另外,怎样修改adotable的动态属性?

#7


不明白你究竟想做什么,如果你想更新表的信息,那么你想更新的数据是什么,如果仅仅是adotable2联接的表,那么adotable2联接的表的总记录数与adotable1联接的表的总记录数是否一致,如果相同则可以执行,但还要看你表结构的设计是否允许这样的操作;否则如果adotable2联接的表的总记录数大于adotable1联接的表的总记录数,那么你将会在adotable1联接的表中写入2个相同的数据,如果你在该字段上建立了主键或是索引的话,就会出现这样的错误信息:‘键列信息不正确。更新影响到过多的行’。仅供参考!

#8


不是了,我只是从adotalbe2表中提取了一个值,adotable2不循环的,只当是个变量就行了。
现在的问题是adotable1是动态建立的,所以我才问怎样用sql语句设置它的主键。或者是怎样修改adotable1的动态属性。

#9


以一个学生表为例建表:
Create table student
(
  --学生ID,主键
  stuID int primary key not null,
  --学生姓名
  stuName char(10) not null,
  --学生性别,缺省值为0(男)
  stuSex smallint default 0
check(stuSex >= 0 and stuSex <= 1),
  --学生年龄,规定不能大于20岁
  stuAge int not null
check(stuAge <= 20),
  --学生班级
  stuClass int,
  --学生家庭住址
  stuAddress char(50)
);

关于你所说的adotable的动态属性,我不知道你指的是什么?暂时就这样吧,希望能够对你有所帮助!呵呵

#10


事例:
create table table1
{Sno CHAR(8) NOT NULL UNIQUE,
 Sname char(20)
}

#11


多谢,不过我想更简单一点,把主键设为自动计数,access中有这个类型,但是我不知道这个类型是什么,还请赐教。
:)

#12


你的问题是没有足够的信息来确定一行,Access里面的这个类型就叫作自动编号

#13


自动编号型。
在sql server中是int型,另外要设置标识为是,递增量为1。

#14


this data type is 'AutoNumber'. in the design view.

#15


用autonumber不行啊,字段错误。
我用的就是access,怎样在程序里设置自动编号?

#16


个人认为不要在表中将某字段设计为自动计数,因为在使用的过程中,数值一旦超过整数范围将会引发错误,难以控制,导致程序调试困难

#17


在SQL Server中使用Identity [(Seed, Increment)]设计自动编号,其中Seed表示基数,Increment表示自动增加的大小;而在Access中就是使用的AutoNumber,看看帮助就知道了,嘻嘻

#1


按你的条件选择的纪录有多行

#2


不是啊,我循环时用的是adotable1.next;
现在用的是access数据库,原来做asp时用SQL数据库也遇到过,把数据导入到sql 数据库中之后,到数据库里进行修改,有些记录就修改不了,出现同样的错误信息。
怎么解决啊?

#3


是不是某条记录建立了索引 
在其他table里也用过 ?
在Oracle下我遇见过类似的问题  不知道你的情况是否如此。

#4


没有建立索引,而且表之间没有关系。这是为什么呢?
而且很怪,有些记录可以写入,有些就不行。

#5


ADOTable的KeyField设置不正确。
因为ADO更新数据时,默认以键列字段和修改的字段为条件修改数据。如表A结构: ID: Integer not null primary key, Name: Varchar(30) not null
当使用ADOTable来修改这个表时,它会自动生成类似于SQL语句来更新数据:
KeyField设置为ID:
  修改ID: Update A set ID=[newid] where ID=[oldid];
  修改Name: Update A set Name=[newname] where ID=[oldid] and Name=[oldname];

KeyField设置为Name:
  修改ID: Update A Set ID=[newid] where Name=[oldname] and ID=[oldid];
  修改Name: Update A Set Name = [newname] where Name=[oldname];

请注意当KeyField设置为Name时生成的SQL语句,由于Name的值不一定唯一(重命的现象时有发生),这样查询出来的数据有多条,就是说要更新很多条数据。ADO会提出警告,避免出现这样的情况。

要解决问题很简单,就是把你的KeyField设置为表的主键即可。
当然,也可以修改ADOTable的动态属性,以修改ADO生成SQL语句的规则。

#6


用create语句建立表时怎样设置主键?
另外,怎样修改adotable的动态属性?

#7


不明白你究竟想做什么,如果你想更新表的信息,那么你想更新的数据是什么,如果仅仅是adotable2联接的表,那么adotable2联接的表的总记录数与adotable1联接的表的总记录数是否一致,如果相同则可以执行,但还要看你表结构的设计是否允许这样的操作;否则如果adotable2联接的表的总记录数大于adotable1联接的表的总记录数,那么你将会在adotable1联接的表中写入2个相同的数据,如果你在该字段上建立了主键或是索引的话,就会出现这样的错误信息:‘键列信息不正确。更新影响到过多的行’。仅供参考!

#8


不是了,我只是从adotalbe2表中提取了一个值,adotable2不循环的,只当是个变量就行了。
现在的问题是adotable1是动态建立的,所以我才问怎样用sql语句设置它的主键。或者是怎样修改adotable1的动态属性。

#9


以一个学生表为例建表:
Create table student
(
  --学生ID,主键
  stuID int primary key not null,
  --学生姓名
  stuName char(10) not null,
  --学生性别,缺省值为0(男)
  stuSex smallint default 0
check(stuSex >= 0 and stuSex <= 1),
  --学生年龄,规定不能大于20岁
  stuAge int not null
check(stuAge <= 20),
  --学生班级
  stuClass int,
  --学生家庭住址
  stuAddress char(50)
);

关于你所说的adotable的动态属性,我不知道你指的是什么?暂时就这样吧,希望能够对你有所帮助!呵呵

#10


事例:
create table table1
{Sno CHAR(8) NOT NULL UNIQUE,
 Sname char(20)
}

#11


多谢,不过我想更简单一点,把主键设为自动计数,access中有这个类型,但是我不知道这个类型是什么,还请赐教。
:)

#12


你的问题是没有足够的信息来确定一行,Access里面的这个类型就叫作自动编号

#13


自动编号型。
在sql server中是int型,另外要设置标识为是,递增量为1。

#14


this data type is 'AutoNumber'. in the design view.

#15


用autonumber不行啊,字段错误。
我用的就是access,怎样在程序里设置自动编号?

#16


个人认为不要在表中将某字段设计为自动计数,因为在使用的过程中,数值一旦超过整数范围将会引发错误,难以控制,导致程序调试困难

#17


在SQL Server中使用Identity [(Seed, Increment)]设计自动编号,其中Seed表示基数,Increment表示自动增加的大小;而在Access中就是使用的AutoNumber,看看帮助就知道了,嘻嘻