【问题标题】:stored procedure inserts truncated value存储过程插入截断值
【发布时间】:2011-12-15 14:07:46
【问题描述】:

我有一个使用多个输入参数并将它们插入 Sql 数据库的存储过程。一个参数 @CustomerId 存在问题,该参数在插入数据库时​​会被截断(但并非总是如此)。

C#:

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CustomerId", Convert.ToInt32(customerId));
cmd.Connection = sqlConn;
sqlConn.Open();
cmd.ExecuteNonQuery();
sqlConn.Close();

Sql SP: @CustomerId 整数

INSERT INTO dbo.tblOffers 
(CustomerId)
VALUES
    (@CustomerId)

sql 表数据类型:

CustomerId int not null

示例:564276117 被截断为 4276117(但并非一直发生,并且正确插入了大于 560000000 的值) 我究竟做错了什么?谢谢

【问题讨论】:

  • Convert.ToInt32(customerId)... customerId 还不是int?如果它在其余代码中被视为string,那么它可能在到达这里之前就被截断了?
  • 您应该必须将 CustomerId 的字段数据类型更改为 bigint。
  • @AVD - 564276117int 的范围内。
  • 我也考虑过 bigint,但我检查了 int 数据类型,它适合我的值范围。
  • 不,在调试模式下,“customerid”参数不会被截断,但是在生产环境中它有时会被截断 - 在开发环境中我使用 Sql Srv 2008 并在生产环境中使用 2005 是否相关?

标签: sql sql-server


【解决方案1】:

尝试Parameters.Add() 方法而不是AddWithValue

cmd.Parameters.Add("@CustomerId",SqlDbType.Int).Value=CustomerID;

【讨论】:

  • 没关系,不知道这个问题会不会随着这个改变的方法重复
  • 另一个例子,563280137,在相同的条件下存储正常(没有改变)。为什么?
【解决方案2】:

请您尝试如下:使用ToInt64

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CustomerId", Convert.ToInt64(customerId));
cmd.Connection = sqlConn;
sqlConn.Open();
cmd.ExecuteNonQuery();
sqlConn.Close();

【讨论】:

  • 它在开发环境中使用 int32 工作正常,调试模式
  • 他使用的值已经在 int32 的上限范围内了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多