sql数据库自增id在强类型数据集中出现溢出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql数据库自增id在强类型数据集中出现溢出相关的知识,希望对你有一定的参考价值。

我使用sqlserver2000,表中id为自增的int(4),强类型数据集中的对应字段id的类型也是System.Int32,但是当我插入的数据量超过short的范围即32767时,出现溢出错误
为了问题清楚一些,贴上一些异常信息,望知情者予以告知,将不甚感激
如下

[OverflowException: 值对于 Int16 太大或太小。]
System.Convert.ToInt16(Int32 value) +2560957
System.Int32.System.IConvertible.ToInt16(IFormatProvider provider) +8
System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) +2562644
System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType) +842

[OverflowException: 将参数值从 Int32 转换到 Int16 失败。]
System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType) +904
System.Data.SqlClient.SqlParameter.GetCoercedValue() +58
......
System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +199
HotelsDataSetTableAdapters.HotelsTableAdapter.GetDataById(Int32 id) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\booking\44dfbf35\daccd2bd\App_Code.0h5nhueq.9.cs:2904
写入数据库的时候没有错,数据库中的int类型可以存储大于32767的id,通过其他字段查询数据库也没有错,但是通过这些大于32767的id查询时就会出错

源错误:

行 2873: this.Adapter.SelectCommand.Parameters[0].Value = ((int)(id));
行 2874: HotelsDataSet.HotelsDataTable dataTable = new HotelsDataSet.HotelsDataTable();
行 2875: this.Adapter.Fill(dataTable);
行 2876: return dataTable;
行 2877:

问题已解决,是数据集的配置问题,以前的数据库中id用了smallint,后来改成了int,数据集的表中也改成了system.int32
但是没有重新刷新适配器的相应方法,所以用这些方法的时候就出错了,还是要谢谢各位热情相助。

参考技术A System.Convert.ToInt16(Int32 value)???????????????

short -> System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767)

不管你再怎么转换,System.Convert.ToInt16(最大的值也只能够32767)

你就直接用int类型好了!
参考技术B 把数据库中的id的类型改成bigint就ok了啊 参考技术C 还是建议用bigint吧

数据库如何设置主键(ID)自动增长啊(SQL语句)?

参考技术A 自动增长列(auto_increment)
sqlserver数据库
(identity)
oracle数据库(
sequence)
给主键添加自动增长的数值,列只能是整数类型
CREATE
TABLE
stu(
classId
int
primary
key
auto_increment,
name
varchar(50)
);
auto_increment是用于主键自动增长的,从1开始增长,当你把第一条记录删除时,再插入第二跳数据时,主键值是2,不是1
_____________________________________________________
INSERT
INTO
student(name)
values(‘abc’);
闫焱琢.
参考技术B 在创建表的时候可以设置,方法如下,用一下sql语句。
create table tableName(
id int identity(1,1) primary key,
data varchar(50))解释:其中identity(1,1)代表自增,第一个1代表从1开始计数,第二个1代表每次增长1。
参考技术C 如果是新增列可以如下
alter
table
table1
add
id
int
identity
not
null;
如果是修改,可到SSMS中选中该字段,然後点修改,在右边最下方修改“标识”为是
参考技术D 如果是新增列可以如下
alter
table
table1
add
id
int
identity
not
null;
如果是修改,可到SSMS中选中该字段,然後点修改,在右边最下方修改“标识”为是

以上是关于sql数据库自增id在强类型数据集中出现溢出的主要内容,如果未能解决你的问题,请参考以下文章

在强类型数据集中添加新行?

sql 字符串型ID 如何自增?

数据库id自动增长,数据不停的删除和插入,这样的话id字段会不断的变大,直到溢出?这个问题是怎么解决的?

关于SQL优化,你需要掌握这些

sql的自增列如何重置

mysql一个表id不是自增的,而且已经有数据了,现在想将id设为自增的sql语句: