【问题标题】:'The conversion of the nvarchar value '267915267915' overflowed an int column.''nvarchar 值 '267915267915' 的转换溢出了一个 int 列。
【发布时间】:2020-01-11 08:30:13
【问题描述】:

我已经广泛搜索了这个问题的解决方案(包括在 StackOverflow 上),但我似乎没有找到具有相同情况的解决方案。我得到的错误是:

nvarchar 值“267915267915”的转换溢出了一个 int 列。

问题是我根本看不到要转换为 int 列的位置。这是我的 C# 代码:

SqlCommand mothershipCommand = new SqlCommand("SELECT [ID] FROM [Order] 
                                               WHERE [OrderNumber] = @OrderNumber", mothershipConnection);
mothershipCommand.Parameters.AddWithValue("@OrderNumber", line.SONumber);
string orderID = mothershipCommand.ExecuteScalar().ToString();

一些背景信息:

  • ID 是一个 int 列,但 SELECT MAX([ID]) 表示 80406 是表中最高的。
  • OrderNumber 是一个 nvarchar(450) 列。
  • line.SONumber 是 319279。

最后一行以字符串 orderID 开头的原来是一个 int,但是在收到这个错误之后我把它改成了一个 long,这并没有帮助,所以最后我试着把它改成一个字符串,以确保错误是不是在我这边。

我没有看到溢出发生在哪里,我也不知道错误消息中的 2679... 数字来自哪里。我有什么遗漏吗?

【问题讨论】:

  • 不要使用AddWithValue(它是evil)。推断@OrderNumber应该是字符串时是整数。
  • 将 SQL Profiler 附加到数据库并观察在线发送的查询可能会显示之前的两个 cmets 都是正确的。
  • 如果 OrderNumber 是一个数字,那么使用数字数据类型而不是 900 字节的字符串不是更有意义,因为您无法轻松索引?

标签: c# sql sql-server


【解决方案1】:

代码包含:

AddWithValue("@OrderNumber", line.SONumber)

因为您没有为 @OrderNumber 参数指定数据类型,所以它将使用 line.SONumber 中的类型,我假设它是整数。
所以你的查询将被执行为

WHERE CAST(line.SONumber AS integer) = 319279

最简单的解决方案是使用:

.Parameters.Add("@OrderNumber",SqlDbType.VarChar,30).Value=line.SONumber.ToString();

【讨论】:

  • CAST(line.SONumber AS bigint) 解决了我需要的问题..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多