【问题标题】:The conversion of the varchar value overflowed an int column ASP.NETvarchar 值的转换溢出了一个 int 列 ASP.NET
【发布时间】:2015-04-29 20:41:10
【问题描述】:

我在 ASP.NET 中有一个 SqlDataSource,它返回错误

未处理的 System.Data.SqlClient.SQLException,varchar 值 '5157964168' 的转换溢出了一个 int 列

我不确定它为什么抱怨 int 列,因为我的代码中没有任何东西是 int 列。我应该寻找什么?

protected void SqlDataSourceA_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
 e.Command.Parameters["@ID"].Value = DropDownListID.SelectedValue;
}

protected void Page_Load(object sender, EventArgs e)
{
  SqlDataSourceA.SelectCommand = "SELECT ID, FolderName FROM DR_Folders where parentID=CONVERT(BIGINT,@ID) AND parentID!=0 order by FolderName ASC";
}

<asp:SqlDataSource ID="SqlDataSourceA" runat="server" 
    ConnectionString="<%$ ConnectionStrings:AConnectionString %>" 

        SelectCommand="">
        <SelectParameters>
          <asp:Parameter Name="ID" DbType="String" />           
        </SelectParameters>
</asp:SqlDataSource>

我在DropDownListID.SelectedValue 中看到5157964168。我不明白为什么它没有进入@ID 并正确执行。 @ID 不是字符串吗?

我也尝试过Type="String" 而不是DbType,因为我不确定其中的区别。

【问题讨论】:

  • 看起来 ID 对我来说是一个 INT。你的数据库定义是什么意思?
  • 您正在将 @ID 转换为 BIGINT
  • 我的列 ID 和 parentID 是 BIGINT。 @ID 然而不是。它应该是 SQL 世界中的字符串或 varchar 并转换为 BIGINT。以上数字对 BIGINT 有效。
  • 虽然我不认为这种情况是这种情况,但有时会有一个触发器将数据发送到具有 int 列的表

标签: c# asp.net sql-server sqldatasource sqlexception


【解决方案1】:

与其将@ID 转换为 BIGINT,不如将 parentID 转换为 VARCHAR:

SqlDataSourceA.SelectCommand = "SELECT ID, FolderName FROM DR_Folders where CONVERT(VARCHAR, parentID)=@ID AND parentID!=0 order by FolderName ASC";

尽管将 INT 与 VARCHAR 进行比较可能是在自找麻烦。

【讨论】:

  • 我看不出建议的更改会如何发生该错误。你确定这是在执行吗?您是否设置了断点以确保?
  • 是的,我查过了。它已设置。我感觉这是在 SQL 调用之后发生的。由于这些 SQLDataSources 绑定到 DropDownLists 是否有可能实际上是错误?我注意到我现在得到了一个新值 5162322298,即使跟踪我仍然看到旧值 5157964168
  • 在 SQL 中运行时,我在执行 SELECT ID, FolderName FROM DR_Folders where CONVERT(VARCHAR, parentID)=5157964168 AND parentID!=0 order by FolderName ASCSELECT ID, FolderName FROM DR_Folders where CONVERT(VARCHAR, parentID)='5157964168' AND parentID!=0 order by FolderName ASC 消息 248,级别 16,状态 1,第 1 行时收到相同的消息 varchar 值“5157964168”的转换溢出了一个 int 列。如果我不在 ID 周围使用单引号,它会更改为 5162322298
  • 我什至在数据库中设置了我的列 VARCHAR,但仍然遇到同样的错误。
  • 我怀疑您给出的查询可能是一个红鲱鱼。另一张海报提到了触发器。我会看一下,看看触发器在某处被触发。此外,如果您有更多详细信息,请将它们粘贴到您的 OP 中,任何信息都会使其更容易解决。
【解决方案2】:

SqlParameter 类允许您在创建它们时定义 SqlDataType,如 MSDN 上的此构造函数参考 (https://msdn.microsoft.com/en-us/library/h8f14f0z%28v=vs.110%29.aspx) 中所示。这也可以在此 MSDN 文章 (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.dbtype%28v=vs.110%29.aspx) 中显示的事后设置

下面是一个示例,说明如何更新代码以确保已设置:

protected void SqlDataSourceA_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
 e.Command.Parameters["@ID"].Value = DropDownListID.SelectedValue; // May need parsing to Int64 here
 e.Command.Parameters["@ID"].DbType = DbType.Int64;
}

通过将参数显式设置为 BIGINT,您不必在 SQL 中进行转换,因此您的命令如下:

  SqlDataSourceA.SelectCommand = "SELECT ID, FolderName FROM DR_Folders where parentID=@ID AND parentID!=0 order by FolderName ASC";

【讨论】:

  • 如果不能将 BigInt 传递给查询,您可能想尝试“CAST(@ID as BIGINT)”而不是“CONVERT(BIGINT,@ID)”,看看是否这样有帮助。
  • 我尝试了上述方法并删除了 CONVERT 以及您在评论中写的 CAST。两者的错误相同。一起删除参数是可行的,当然会返回错误的数据。
  • 您是否尝试过运行 SQL Trace 来查看实际发送的语句,以便您可以在 SQL Management Studio 中运行它来调试它?这一切都基于您系统上安装的 SQL Server 工具。通过以这种方式隔离它可能更容易解决。
【解决方案3】:

好吧,通过将数据库列从 BIGINT 更改为 VARCHAR 并将 SQL 更改为

,我得到了错误消失
SqlDataSourceA.SelectCommand = "SELECT ID, FolderName FROM DR_Folders where parentID=@ID AND parentID!='0' order by FolderName ASC";

虽然这并不能真正回答为什么我在使用 BIGINT 时遇到了所有问题,但也许最好将它们从头到尾都是文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多