Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法确定哪列导致错误?_C#_Sql Server 2008_Parameters - Fatal编程技术网

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

C# 有没有办法确定哪列导致错误?,c#,sql-server-2008,parameters,C#,Sql Server 2008,Parameters,我正在从事一个C#项目,该项目从不同来源收集数据,并将数据存储在SQL Server数据库中。我有时会得到字符串或二进制数据会被截断。错误非常烦人。我想确定导致此错误的列并记录它。除了检查参数长度,还有其他方法吗 我所做的是,如果列是varchar(50),检查数据长度是否大于50。我觉得这就像是一个散步,不知道是否有任何其他整洁的解决方案 编辑 if(data1.Length>50) logIt("col1, data1, condition"); else if(data2

我正在从事一个C#项目,该项目从不同来源收集数据,并将数据存储在SQL Server数据库中。我有时会得到
字符串或二进制数据会被截断。
错误非常烦人。我想确定导致此错误的列并记录它。除了检查参数长度,还有其他方法吗

我所做的是,如果列是
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("--------------------------------------------");
            }
            }

如前所述,在其中一条INSERT语句中,您试图将过长的字符串插入字符串(varchar(50))列


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

就我个人而言,我总是会对照包含参数所用数据的表检查所有参数。如果表中显示varchar(50),则我的参数应不大于50。如果不这样做,我永远不会编写存储过程,我认为您可以简单地限制c#端的参数定义。不允许用户键入超出表字段可接受范围的信息

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

首先,您需要仔细检查传入的数据,并确定当前的列大小是否太小,无法容纳所需的内容。我经常发现,当数据太大时,字段中的信息是垃圾,应该扔掉(例如,关于联系人的注释放在电子邮件字段中而不是电子邮件中)。您甚至可能想考虑是否要验证某些字段中的输入数据。
如果您需要保持大小,并且不担心丢失多余的字符,然后,在将数据插入数据库之前,您需要将数据强制转换为正确的大小,或者您需要创建一个异常进程,将无法发送到数据库的记录提取到异常表中,并将其返回给拥有原始数据的人员进行修复

“等等,我去拿我的水晶球…”对不起,你能给我们一个重新产生问题的代码示例,并指出行和错误吗?。如果你不知道你在使用什么技术,也不知道你是如何使用它们的,我们几乎无法提供帮助。谢谢。这是SQL Server发出的最令人恼火的错误消息之一——恐怕不,据我所知,没有“魔术”来找出哪一列将被截断——你必须像你一样做——根据可接受的最大长度的“已知集”检查每个参数值……我添加了它的外观摘要。