填充命令给出"未能启用约束"错误。我该如何解决?

时间:2014-09-24 17:41:07

标签: c# asp.net dataset constraints tableadapter

问题

我正在重构由C#.NET 4.5项目中的开发人员编写的项目,该项目包含dataset.xsd。我被要求提高项目的效率。基本上,问题是因为tableadapter使用数据库中整个表中的数据填充我的数据集。这是几百万行数据。

问题

我有一条线基本上就是这样做的。

this.customersTableAdapter.Fill(this.derpDataset.Customers);

所以我决定做这样的事情(不想改变.xsd):

//This references a class written in order to get the database manually instead of using the .xsd
SqlConnection sqlConnection = DB_Connection.OpenDatabase();
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM COMDB WHERE ID = " + ID.ToString() + ";", sqlConnection);

 this.customersTableAdapter.Adapter.SelectCommand = sqlCommand;
 this.customersTableAdapter.Adapter.Fill(this.derpDataset.Customers);

代码

基本上,.xsd有很多自动生成的东西,但我只需要绕过它并填充更优化的查询。

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
        private void InitCommandCollection() {
            this._commandCollection = new global::System.Data.SqlClient.SqlCommand[1];
            this._commandCollection[0] = new global::System.Data.SqlClient.SqlCommand();
            this._commandCollection[0].Connection = this.Connection;
            this._commandCollection[0].CommandText = "SELECT customerID, name, SSN FROM dbo.tblActualCustomerValueFloat";
            this._commandCollection[0].CommandType = global::System.Data.CommandType.Text;
        }

这是自动生成的填充功能。

 public virtual int Fill(customersTableAdapter dataTable) {
        this.Adapter.SelectCommand = this.CommandCollection[0];
        if ((this.ClearBeforeFill == true)) {
            dataTable.Clear();
        }
        int returnValue = this.Adapter.Fill(dataTable);
        return returnValue;
    }

错误

这令人沮丧,因为我收到一个对我来说毫无意义的新错误。它说:

A first chance exception of type 'System.Data.ConstraintException' occurred in System.Data.dll

异常快照说明以下内容:

{"Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints."}

我不会使用以下fix,因为它会破坏我的代码中的下一行。

CustomerDataSet.Runs_CustomerRow runRow = derpDataset.Runs_Customer.First(t => t.ID == ID);

尝试

  • 尝试更改.xsd并导致整个事情崩溃。
  • 这说服我根本不要弄乱.xsd。决定在这里搜索并找到here
  • 阅读MSDN提供的herehere文档。
  • 谷歌搜索,但没有发现类似的问题。也许this,但不是他的修正案?
  • 上面提供的代码

我知道我想做什么,这个想法很简单,但鉴于项目依赖于.xsd,我发现应用程序非常难。

我非常感谢对此问题的任何帮助和评论。

1 个答案:

答案 0 :(得分:2)

我想出了答案。首先,我创建了一种获得更有效的错误消息的方法。我写了MSDN建议的功能。您可以编写一个函数来从数据集中获取错误。然后我把它放在try / catch中并在控制台上读取输出。

事实证明我正在查询错误的数据库并获取空值。这很容易做到,因为模式名称非常相似,但在我看到列中的值之前,错误消息并不有用。

您可以找到我使用的错误功能here的链接。