有没有办法确定哪个列导致错误?

时间:2013-09-10 14:16:25

标签: c# sql-server-2008 parameters

我正在开发一个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("--------------------------------------------");
            }
            }

2 个答案:

答案 0 :(得分:0)

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

您必须将列大小增加到50+或100,才能解决问题。要查找导致此问题的列,请添加一些日志或运行SQL事件探查器或从VS启用所有例外 - >调试菜单 - >例外(检查所有例外)。

答案 1 :(得分:0)

就个人而言,我总是会根据包含它们将要使用的数据的表检查我的所有参数。如果表中显示varchar(50),我的参数应该不超过50.我从不写一个存储过程而不做这个和我认为你可以在c#方面明确限制参数定义。不允许用户输入比表字段可以接受的更多信息。

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

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

如果你需要保持大小并且不关心丢失额外的字符,那么你需要在将数据插入数据库之前将数据转换为正确的大小,或者你需要创建一个将拉动的异常进程将无法发送到数据库的记录输出到异常表中,并将它们返回给拥有要修复的原始数据的人员。