Alarming server: Beijing occur error. Source: System.Data 
Position: UniqueConstraint ==> Boolean IsConstraintViolated() 
Message: Object reference not set to an instance of an object.   
at System.Data.UniqueConstraint.IsConstraintViolated()     
at System.Data.DataSet.EnableConstraints()     
at System.Data.DataSet.set_EnforceConstraints(Boolean value)     
at System.Data.DataTable.EndLoadData()     
at Suzsoft.Alarming.DataAccess.ServerDataAccess.AddSendAlarming(SendAlarmingsRow dr)     
at Suzsoft.Alarming.Service.SendEMail.OnExecute()代码:
AlarmingDataSet.SendAlarmingsDataTable dt = ServerDataAccess.GetSendAlarmings();
                AlarmingDataSet.SendAlarmingsRow dr = dt.NewSendAlarmingsRow();
                dr.SendAlarmingId = Guid.NewGuid();
                dr.RecordId = Mail.RecordId;
                dr.SendTime = DateTime.Now;
                dr.EngineerId = Mail.EngineerID;
                dr.Action = (short)Action.Email;
                try
                {
                    ServerDataAccess.AddSendAlarming(dr);
                }
                catch (Exception ex)
                {
                    Logger.WriteLog(ex, "Save Send Alarming");
                }public static void AddSendAlarming(AlarmingDataSet.SendAlarmingsRow dr)
        {
            SaveData();
            m_CacheData.SendAlarmings.AddSendAlarmingsRow(dr);
            try
            {
                SendAlarmingsTableAdapter sata = new SendAlarmingsTableAdapter();
                sata.Update(dr);
                IsLive = true;
            }
            catch
            {
                IsLive = false;
            }
        }使用的强类型DataSet.大侠快帮帮我...

解决方案 »

  1.   

    internal override bool IsConstraintViolated()
    {
        Index constraintIndex = this.ConstraintIndex;
        if (constraintIndex.HasDuplicates)
        {
            object[] uniqueKeyValues = constraintIndex.GetUniqueKeyValues();
            for (int i = 0; i < uniqueKeyValues.Length; i++)
            {
                Range range = constraintIndex.FindRecords((object[]) uniqueKeyValues[i]);
                if (1 < range.Count)
                {
                    DataRow[] rows = constraintIndex.GetRows(range);
                    string error = ExceptionBuilder.UniqueConstraintViolationText(this.key.ColumnsReference, (object[]) uniqueKeyValues[i]);
                    for (int j = 0; j < rows.Length; j++)
                    {
                        rows[j].RowError = error;
                        foreach (DataColumn column in this.key.ColumnsReference)
                        {
                            rows[j].SetColumnError(column, error);
                        }
                    }
                    return true;
                }
            }
        }
        return false;
    }
      

  2.   

    应该单步调一下,看一下是哪个变量为null引用
      

  3.   

    lizhizhe2000(武安侯) ( ) 說的正解.
    或者你可能引用的方法沒有加入這個方法的對象
      

  4.   

    设置 断点
    在debug模式下 看那里出的错
    如果是数据绑定
    大多是 因为没有 查询出 需要的数据
    sql 返回数据为空 的可能性比较大
      

  5.   

    第一.这个是偶尔出现.系统已经上线几个月了!
    第二.这是一个Windows Service,多线程.不太好跟踪.
    第三.系统已经发布,我没有测试环境了.
      

  6.   

    同意hertcloud(·£孙子兵法£·) 的说法.
    没有测试环境了可以自己搭一个吗.
    源代码你总该有吧,把那个web service单独拿出来,写一些驱动程序,模拟一些数据,测试一下.
    先把问题的原因找出来.
      

  7.   

    attach process或将service改成console,然后调试运行看那个地方出错。
      

  8.   

    纯猜测
    m_CacheData.SendAlarmings.AddSendAlarmingsRow(dr);
    这句比较有嫌疑!
    m_CacheData是静态变量吧,会不会被其他方法修改?
      

  9.   

    單步執行看看,估計是dataset中的字段類型與定義編量類型不匹配.