0

我正在开发一个 C# 项目,该项目从不同来源收集数据并将数据存储在 SQL Server 数据库中。我有时会收到String or binary data would be truncated.非常烦人的错误。我想确定是哪一列导致了这个错误并记录下来。除了检查参数长度还有其他方法吗?

我所做的是如果列是varchar(50),检查数据长度是否大于 50。我觉得这就像一个绕行,想知道是否有任何其他巧妙的解决方案。

编辑

  if(data1.Length>50) logIt("col1, data1, condition");
    else if(data2.Length>80) logIt("col2, data2, condition");
else {
    SqlParameter p1 = (new SqlParameter("@p1", DbType.String));
                 p1.Value = string.IsNullOrEmpty(data1) ? SqlString.Null : (object)data1;
                 s1.Parameters.Add(p1);

    SqlParameter p2 = (new SqlParameter("@p2", DbType.String));
                 p2.Value = string.IsNullOrEmpty(data2) ? SqlString.Null : (object)data2;
                 s1.Parameters.Add(p2);

    s1.ExecuteNonQuery("UPDATE mytable SET col1=@p1,col2=@p2 WHERE condition=@condition");
    }


void logIt(string p){
     using (StreamWriter writer = new StreamWriter("log.txt"))
            {
              writer.WriteLine("Caused by:"+ p);
              writer.WriteLine(DateTime.Now);
              writer.WriteLine("--------------------------------------------");
            }
            }
4

2 回答 2

0

正如您所提到的,在其中一个 INSERT 语句中,您试图将太长的字符串插入到字符串 (varchar (50)) 列中。

您必须将列大小增加到 50+ 或 100,才能解决此问题。要查找导致此问题的列,请放置一些日志或运行 SQL Profiler 或从 VS -> Debug Menu -> Exceptions 启用所有异常(检查所有异常)。

于 2013-09-10T14:22:33.870 回答
0

就个人而言,我总是会对照包含它们将在其中使用的数据的表检查我的所有参数。如果表显示 varchar (50),我的参数应该不超过 50。我从不编写存储过程而不这样做,我假设您可以在 c# 端类似地限制参数定义。不允许用户输入超出您的表格字段可以接受的信息。

如果您从其他数据库或 Excel 电子表格中提取数据,那么您可能会遇到不同的问题。

首先,您需要仔细检查传入的数据,并确定您当前拥有的列大小对于所需的内容是否太小。我经常发现当数据太大时,字段中的信息是垃圾,应该被丢弃(例如关于联系人的注释被放置在电子邮件字段中而不是电子邮件)。您甚至可能要考虑是否应该验证某些字段中的输入数据。

如果您需要保持大小并且您不担心丢失多余的字符,那么您需要在将数据插入数据库之前将数据转换为正确的大小,或者您需要创建一个异常过程来提取记录无法将其发送到数据库中的异常表中并将它们返回给拥有要修复的原始数据的人。

于 2013-09-10T14:30:50.190 回答