当我输入超过列长度的数据时,它不会在 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 中引发异常的主要内容,如果未能解决你的问题,请参考以下文章