2010-06-13 52 views
0

我的项目中有一个类型化的数据集。我想填充只有一行而不是所有行的数据表。所选行必须基于主键列。我知道我可以修改设计器代码以实现此功能,但是如果我更改设计器中的代码,那么在将来通过设计器更新我的数据时,将会删除此代码。使用键入数据集时选择一行

所以我想改变SelectCommand不是在设计师,而是在启动MyTypedTableAdapter.Fill方法之前。奇怪的是,设计师不会创建一个SelectCommand!它创建所有其他的命令,但不是这一个。如果这样会造成SelectCommand我可能会改变它以这样的方式

this.operatorzyTableAdapter.Adapter.SelectCommand.CommandText += " WHERE MyColumn = 1"; 

这是远不够完美,但至少我不会有修改设计师的作品。不幸的是,正如我之前所说,SelectCommand未被创建。相反,设计师创造了这样的东西:

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
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 Ope_OpeID, Ope_Kod, Ope_Haslo, Ope_Imie, Ope_Nazwisko FROM dbo.Operatorzy"; 
    this._commandCollection[0].CommandType = global::System.Data.CommandType.Text; 
} 

这对我而言没有任何意义。为什么要创建UpdateCommandInsertCommandDeleteCommand但是不要创建SelectCommand?我可以忍受这一点,但this._commandCollection是私人的,所以我不能在类代码之外访问它。

我不知道如何在不改变设计器代码的情况下进入这个集合。我的想法是通过部分类定义公开集合。不过,我想介绍许多类型化的数据集,我真的不想为它们中的每一个创建部分类定义。

请注意,我正在使用.NET 3.5。

我发现this文章有关访问私人性质,但它涉及.NET 4.0

感谢您的时间。

回答

1

在数据集设计器中,首先使用基本(所有行)查询配置表/适配器对。确保它的工作原理和更新/删除等。

然后右键单击“添加查询”并更改SQL文本以包含“WHERE MyId = @Id”。确保你保持相同的列。选择Next并调用生成的方法“FillById()”。

广告当然,在正确的地方使用FillById(id)而不是Fill()。

+0

谢谢Henk。这将有效,但我必须为每个数据集都这样做。你能告诉我更多的事情:是否有办法在一段时间后自动更新数据集(表结构更改)。如果是这样,该怎么做? – Wodzu 2010-06-13 15:23:46