2010-06-13 1 views
0

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

Так что я хотел изменить 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.

Я нашел this статьи о доступе частных свойств, но это касается .NET 4.0

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

ответ

1

В конструкторе Dataset сначала настройте пару Table/Adapter с базовым (все строки) запросом. Убедитесь, что он работает и обновляет/удаляет и т. Д.

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

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

+0

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