Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Выполнение команд, которые возвращают наборы данных




Получение возвращаемых значений

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

Получение значений, возвращенных процедурами через свойство value, происходит в несколько этапов.

1. Создайте параметр, свойству которого Direction присвойте значение output или inputoutput. Удостоверьтесь, что тип данных этого параметра соответствует типу возвращаемого значения.

2. После выполнения процедуры, прочитайте свойство value параметра, который возвращает значение.

Получите возвращаемое значение процедуры через свойство ReturnValue.

3. Создайте параметр, свойству Direction которого присвойте значение

ReturnVaiue.

Примечание

Параметр, который возвращает значение, должен быть первым в коллекции Parameters.

4. Удостоверьтесь, что тип данных этого параметра соответствует типу возвращаемого значения.

Примечание

Инструкции Update, insert и Delete в SQL-запросах возвращают целочисленное значение, указывающее количество записей, которые обработаны инструкцией. Вы можете получить число обработанных записей как возвращаемое значение метода ExecuteNonQuery.

Следующий пример (листинг) показывает, как получить значение, возвращаемое хранимой процедурой с именем CountAuthors. В этом случае предполагается, что первый параметр в коллекции Parameters называется retvalue и его свойство Direction имеет значение ReturnVaiue.

Листинг

' Visual Basic

Dim cntAffectedRecords As Integer

OleDbcommandl.CommandText="CountAuthors"

OleDbCommandl.CommandType=CommandType.StoredProcedure

OleDbConnectionl.Open()

OleDbCommandl.ExecuteNonQuery()

OleDbConnectionl.Close()

cntAffectedRecords=CType(OleDbCommandl.Parameters("retvalue").Value,Integer)

MessageBox.Show("Affected records=" & cntAffectedRecords.ToString)

// C#

int cntAffectedRecords;

oleDbcommandl.CommandText="CountAuthors";

OleDbCommandl.CommandType=CommandType.StoredProcedure;

OleDbConnectionl.Open();

OleDbCommandl.ExecuteNonQuery();

OleDbConnectionl.Close();

cntAffectedRecords=(int)(OleDbCommandl.Parameters["retvalue"].Value);

MessageBox.Show("Affected records=" + cntAffectedRecords.ToString());

Вы можете использовать объект DataCommand, чтобы выполнить процедуру выборки информации непосредственно из базы данных, которая будет доступна только для чтения. В этом случае выполняется SQL-запрос или хранимая процедура, которая содержит инструкцию select. Это аналогично тому, как заполняется набор данных через адаптер данных, за исключением того, что результирующий набор записей попадает в приложение, минуя "посредников".

Возвращенный набор записей помещается в объект DataReader (OleDbDataReader или SqlDataReader). В цикле, путем перебора, можно получить доступ к любой индивидуальной записи полученного набора. Поскольку DataReader обеспечивает доступ к данным в режиме forward-only, read-only, то это достаточно быстрый и эффективный способ получения набора записей из базы данных.

Выполнение команд, которые возвращают набор записей, происходит следующим образом.

1. Добавьте объект DataCommand к вашей форме или компоненте.

2. Определите в свойстве объекта CommandText текст SQL-запроса или имя хранимой процедуры, которые возвращают набор записей.

3. Установите в свойстве CommandType значение CommandType.Text (для SQL-запроса) или CommandType.StoredProcedure (для хранимой процедуры).

4. Если команда имеет параметры, то определите их.

5. Создайте объект DataReader как экземпляр класса OleDbDataReader или SqlDataReader, в зависимости от типа используемого соединения.

 

6. Откройте соединение, связанное с командой данных.

7. Вызовите метод ExecuteReader, адресуйте результаты работы команды объекту DataReader, созданному на шаге 5.

8. В цикле просмотрите полученные данные, используя метод Read.

9. Закройте объект DataReader.

10. Если больше не предполагается использовать метод ExecuteReader, то закройте соединение.

Следующий пример (листинг) показывает, как получить записи из таблицы Authors базы данных Pubs (SQL Server). Пример использует тип команды TableDirect и определяет имя таблицы Authors как текст команды. После выполнения команды (вызов метода ExecuteReader) организован цикл чтения записей в переменную s (создается строка с информацией об авторах, использующая в качестве разделителей пробел, символ табуляции и перевод строки), которая затем отображается в текстовом поле.

Листинг

' Visual Basic

Dim dreader As System.Data.OleDb.OleDbDataReader

OleDbCommandl.CommandText="authors"

OleDbCommandl.CommandType=CommandType.TabieDirect

OleDbConnectionl.Open()

dreader=0leDbCommandl.ExecuteReader(CommandBehavior.CioseConnection)

Dim s As String=""

While dreader.Read()

s &= dreader("au_id").ToString() _

& vbTab & dreader("au_fname").ToString()_

& " " & dreader("au_lname").ToString & ControlChars.CrLf

End While

TextBoxl.Text=s

dreader.Close()

// C#

System.Data.OleDb.OleDbDataReader dreader;

OleDbCommandl.CommandText="authors";

OleDbCommandl.CommandType=CommandType.TabieDirect;

OleDbConnectionl.Open();

dreader=01eDbCommand1.ExecuteReader(CommandBehavior.CioseConnection);

string s="";

while (dreader.Read())

{

s += dreader["au_id"].ToStringO + "\t"

+ dreader["au_fname"].ToStringO + " "

+ dreader["au_lname"].ToStringO + "\n";

}

TextBoxl.Text=s;

dreader.Close ();

 

Следующий пример (листинг) показывает два способа использования объекта DataReader для получения данных. В первой части примера объект DataReader загружает данные в компонент ListBox на Windows-форме (только один столбец author_id таблицы authors). Во второй части примера рассматривается обработчик события SelectedlndexChanged объекта ListBox. Здесь в предложении SELECT SQL-запроса в качестве ключевого поля (параметра) для выбора единственной записи используется значение au_id. Этот параметр получает значение из списка авторов (объект ListBox1). Поскольку объект DataReader ожидает возвращения только одной записи, то информация из него считывается не в цикле (его метод Read вызывается только один раз). В примере проверяется, что имеется не менее одной записи, путем вызова метод Read в условном операторе If- End if.

Два обработчика событий используют различные команды данных: в первом случае не используются параметры, во втором случае команде передается один параметр для идентификации автора.

Листинг

' Visual Basic

Private Sub btnLoadListBox_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnLoadListBox.Click

Dim dreader As System.Data.OleDb.OleDbDataReader

OleDbCommandl.CommandText="authors"

OleDbCommandl.CommandType=CommandType.TableDirect

OleDbConnectionl.Open()

dreader=01eDbCommandl.ExecuteReader()

While dreader.Read()

ListBox1.Items.Add(dreader("au_id"))

End While

dreader.Close() OleDbConnectionl.Close()

End Sub

Private Sub ListBoxl_SelectedIndexChanged(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles ListBoxl.SelectedlndexChanged

Dim dreader As System.Data.OleDb.OleDbDataReader OleDbCommand2.CommandText = _

"SELECT au_id, au_lname, au_fname FROM authors WHERE au_id=?"

0leDbCommand2.CommandType=CommandType.Text

0leDbCommand2.Parameters("au_id").Value=ListBox1.Text

OleDbConnectionl.Open()

dreader=OleDbCommand2.ExecuteReader()

If dreader.Read() Then

txtAuthorlD.Text=dreader("au_id").ToString() txtAuthorLastName.Text=dreader("au_lname").ToString() txtAuthorFirstName.Text=dreader("au_fname").ToString()

End If

dreader.Close ()

OleDbConnectionl.Close ()

End Sub

// C#

private void btnLoadListBox_Click(object sender, System.EventArgs e)

{

System.Data.OleDb.OleDbDataReader dreader;

OleDbCommandl.CommandText="authors";

OleDbCommandl.CommandType=ComrnandType.TableDirect;

OleDbConnectionl.Open();

dreader=OleDbCommandl.ExecuteReader();

while(dreader.Read())

{

ListBox1.Items.Add(dreader["au_id"]);

}

dreader.Close(); OleDbConnectionl.Close();

Button6.Enabled=true;

}

private void ListBoxl_SelectedIndexChanged(object sender, System.EventArgs e)

{

System.Data.OleDto.OleDbDataReader dreader;

OleDbCommand2.CommandText =

"SELECT au_id, au_lname, au_fname FROM authors WHERE au_id=?";

OleDbCommand2.CommandType=ComnandType.Text;

OleDbCommand2.Parameters["au_id"].Value=ListBox1.Text;

OleDbConnectionl.Open();

dreader=OleDbCommand2.ExecuteReader();

if (dreader.Read())

{

txtAuthorlD.Text=dreader["au_id"].ToString(); txtAuthorLastName.Text=dreader["au_lname"].ToString(); txtAuthorFirstName.Text=dreader["au_fname"].ToString();

}

dreader.Close ();

OleDbConnectionl.Close();




Поделиться с друзьями:


Дата добавления: 2014-11-20; Просмотров: 451; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.