我正在重构由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,我发现应用程序非常难。
我非常感谢对此问题的任何帮助和评论。
答案 0 :(得分:2)
我想出了答案。首先,我创建了一种获得更有效的错误消息的方法。我写了MSDN建议的功能。您可以编写一个函数来从数据集中获取错误。然后我把它放在try / catch中并在控制台上读取输出。
事实证明我正在查询错误的数据库并获取空值。这很容易做到,因为模式名称非常相似,但在我看到列中的值之前,错误消息并不有用。
您可以找到我使用的错误功能here的链接。