Выбор одной строки при работе с типизированными наборами данных

У меня есть типизированный набор данных в моем проекте. Я хотел бы заполнить таблицу данных только одной строкой вместо всех строк. Выбранная строка должна основываться на столбце первичного ключа. Я знаю, что могу изменить код дизайнера для достижения этой функциональности, однако, если я изменю код в дизайнере, я рискую, что этот код будет удален, когда я буду обновлять свои данные через дизайнер в будущем.

Поэтому я хотел изменить 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;
}

На мой взгляд, это не имеет смысла. Зачем создавать UpdateCommand, InsertCommand и DeleteCommand, но не создавать SelectCommand? Я мог бы смириться с этим, но this._commandCollection является закрытым, поэтому я не могу получить к нему доступ вне кода класса.

Я не знаю, как попасть в эту коллекцию, не меняя код дизайнера. Идея, которая у меня есть, состоит в том, чтобы выставить коллекцию через частичное определение класса. Однако я хочу ввести много типизированных наборов данных, и я действительно не хочу создавать частичное определение класса для каждого из них.

Обратите внимание, что я использую .NET 3.5.

Я нашел эту статью о доступе к частной собственности но это касается .NET 4.0

Спасибо за ваше время.


person Wodzu    schedule 13.06.2010    source источник


Ответы (1)


В конструкторе наборов данных сначала настройте пару «Таблица/адаптер» с помощью базового запроса (все строки). Убедитесь, что он работает и обновляет/удаляет и т.д.

Затем щелкните правой кнопкой мыши «Добавить запрос» и измените текст SQL, включив в него «ГДЕ MyId = @Id». Убедитесь, что вы сохраняете те же столбцы. Выберите «Далее» и вызовите сгенерированный метод «FillById()».

Конечно, используйте FillById(id) вместо Fill() в нужных местах.

person Henk Holterman    schedule 13.06.2010
comment
Спасибо, Хенк. Это сработает, но мне придется делать это для каждого набора данных. Не могли бы вы сказать мне еще одну вещь: есть ли способ автоматически обновлять набор данных через некоторое время (изменение структуры таблицы). Если да, то как это сделать? - person Wodzu; 13.06.2010