将数据类型bigint转换为int出错 [SQL Server]

4

我需要使用存储过程将电话号码插入数据库。但是在插入时会显示以下错误:

SqlException: 将数据类型bigint转换为int时出错。

long phoneNumber = Convert.ToInt64(Phone.Text);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@phone",phoneNumber);

cmd.ExecuteNonQuery();

对于这个参数,DBType是Int64,SQLDbType是BigInt。

我在SQL Server中使用了BigInt作为列的数据类型。

那么问题可能出在哪里呢?

我发现,1999999999[<2^32]可以正确插入,而2999999999[>2^32]不能。

如果您需要更多信息,请告诉我。

谢谢!


3
为什么你不使用 varchar?或者 char? - Michaël
2
电话号码应该以字符串形式存储,以保留前导零,但您能发布插入语句吗?此外,表上有任何触发器吗? - Martin Smith
1
在 SProc 中,@phone 的定义是什么?是 bigint 类型吗? - RichardTheKiwi
1
SQL列的数据类型之前是int吗?最近你将其改为了bigint吗?你是在应用程序运行时进行的更改吗? - shahkalpesh
@Richard,问题出在数据类型上,我将其从Int改为bigint后,它完美地运行了。但是,根据@martin和@malinois的说法,将其存储为字符串是更好的做法。如果您能将您的解决方案发布为答案,我会接受它。谢谢。 - Ananth
@shahkalpesh.. 我没有改变类型.. - Ananth
2个回答

4

请参阅此int、bigint、smallint和tinyint

bigint
整数数据范围从-2^63(-9,223,372,036,854,775,808)到2^63-1(9,223,372,036,854,775,807)。存储大小为8个字节。

int
整数数据范围从-2^31(-2,147,483,648)到2^31 - 1(2,147,483,647)。存储大小为4个字节。int的SQL-92同义词是integer。

OP说:

我发现1999999999[<2^32]可以被正确插入,而2999999999[>2^32]不能

1,999,999,999适合于int,因为它小于2,147,483,647,但2,999,999,999不适合,因为它大于2,147,483,647

您最好使用varchar(10)来存储电话号码。如果您担心字符串中会有除数字以外的字符,您可以像这样进行验证:

您可以像这样验证您的字符串:

declare @PhoneNumber varchar(10)
select @PhoneNumber='123e0'
if @PhoneNumber LIKE '%[^0-9]%'
    print 'NOT NUMERIC'
else
    print 'NUMERIC'

select @PhoneNumber='1234567890'
if @PhoneNumber LIKE '%[^0-9]%'
    print 'NOT NUMERIC'
else
    print 'NUMERIC'

以下是运行上述代码后的结果:
NOT NUMERIC
NUMERIC

2

使用varchar(10)或char(10)代替bigint。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接