当我输入超过列长度的数据时,它不会在 ASP.NET 中引发异常

Posted

技术标签:

【中文标题】当我输入超过列长度的数据时,它不会在 ASP.NET 中引发异常【英文标题】:When I enter data that exceeds the column length it won't throw an exception in ASP.NET 【发布时间】:2011-07-24 22:16:11 【问题描述】:

问题很简单。

我的数据库中有一个数据类型为 NVARCHAR(20) 的列 .. 所以当我尝试在该列中输入例如包含 22 个字符的数据时,它只会忽略最后 2 个字符而不是抛出异常!

这正常吗? .. 以及如何保护数据库免受此类问题的影响?

PS:当然我使用验证控件和服务器验证,但是如何保护数据库,是否存在某种高级约束,而不仅仅是指定列的长度,所以它会抛出异常并且不接受输入的日期??


编辑

try

    using (SqlConnection conn = new SqlConnection(ConnStr))
    
        string Command = "SET NOCOUNT ON; INSERT INTO [Countries] (CountryName, IsVisible) VALUES (@Name, @IsVisible);";

        using (SqlCommand comm = new SqlCommand(Command, conn))
        
            comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20);
            comm.Parameters["@Name"].Value = Name;

            comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);
            comm.Parameters["@IsVisible"].Value = IsVisible;

            conn.Open();
            comm.ExecuteNonQuery();

            return "Successfully added " + Name + " to the countries.";

        
    

catch (SqlException SqlEx)

    string ErrorMessage = "";

    for (int i = 0; i < SqlEx.Errors.Count; i++)
    
        ErrorMessage += SqlEx.Errors[i].Number + " : " + SqlEx.Errors[i].Message + "\n";
    
    return ErrorMessage;

这是我正在使用的代码,顺便说一句,我只是尝试直接从 Sql Management Studio 插入比列长度更大的数据,它实际上显示了您刚刚描述的消息!

【问题讨论】:

通常这会抛出一个异常,说数据将被截断。您应该发布您的代码和架构,也许有人可以帮助指出问题。 @***。看起来是代码的问题! ..请检查我的编辑! 复制:***.com/questions/4628140/… @gbs,但是我的参数长度和数据库中的列长度一样! ..我不认为它完全一样..! 也许您在参数处指定最大长度的事实是,出于某种原因,抑制了异常。您是否已经尝试过不使用参数插入相同的数据? 【参考方案1】:

有几个区域会在数据到达表之前截断数据而不会产生错误。

正如@Richard 针对您的具体情况指出的那样,它正在被 ADO 截断。

如果你调用了一个带有 varchar(20) 参数的存储过程并传递了 22 个字符的数据,SQL Server 中的参数处理引擎也会截断它。

但是,如果您编写的插入状态尝试将 22 个字符直接填充到 varchar(20) 列中,那么您会看到错误。

基本上,参数处理部分正在默默地“修复”它。然而,如果您摆脱参数,那么它将失败。这就是为什么这个问题确实与@gbs 所引用的问题完全相同。

显然,摆脱参数远非理想。

【讨论】:

@Chris Lively。 +1感谢您描绘了整个情况..当然我不会牺牲安全性并摆脱参数。但我只是使用了这个>>“comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar);"你觉得呢? @IKashef:我认为这是一个完全有效的解决方案。 是@gb s 引用了骗子,@gb n 回答了这个问题! @Martin。两问一问,讲的是同一个话题,而且答案和问题很接近。但是 *** 只考虑一个问题是重复的,如果它是一个完全重复的,既不是问题也不是答案。你告诉我一个菜鸟会从@gb提到的问题中得到一个好处!!? ..我很抱歉没有:) ..我不是那么好,我真的没有得到一个词可以使我在我的ADO.NET代码调整中受益以避免错误。它以最简单的方式在此处提供,并提供了几个指出要点的答案! @Martin:感谢您解决这个问题。我把他和这里的另一个成员搞混了。【参考方案2】:

问题出在这两行之间。

   comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20);
   comm.Parameters["@Name"].Value = Name;

SQL Server 从不 会看到超过 20 个字符。 .Net 正在截断。

我不记得 SQLParameter 的文档了,Google 搜索更快。

http://www.eggheadcafe.com/software/aspnet/30873895/sqlparameter-question.aspx

现在,如果您将 SqlParam 的长度指定为 40,那么 .NET 将 自动为您将字符串截断为 40 个字符.. 并且没有 将引发错误(但您可能会丢失数据并且不知道它)。

【讨论】:

哇,我知道对发生的事情有一个简单的解释。我刚刚从 ado.net 代码中的参数中删除了列长度,它就可以工作了。它通过异常和一切:D

以上是关于当我输入超过列长度的数据时,它不会在 ASP.NET 中引发异常的主要内容,如果未能解决你的问题,请参考以下文章

当我自动完成输入字段时,标签会覆盖值,并且加载时也不会获得长度

输入类型编号的跨浏览器样式,使得它们不会超过必要的长度

extjs3 网格单元最大长度输入验证

P1001

算法提高P1001

为啥当我将熊猫数据框用作具有多处理功能的函数的输入时它不会改变