Хранимые процедуры. Вызов хранимых процедур в ADO .NET, передача параметров.



Выполнение в базе данных хранимых процедур вместо отдельных операторов SQL дает пользователю следующие преимущества:

§ необходимые операторы уже содержатся в базе данных;

§ все они прошли этап синтаксического анализа и находятся в исполняемом формате; перед выполнением хранимой процедуры SQL Server генерирует для нее план исполнения, выполняет ее оптимизацию и компиляцию;

§ хранимые процедуры поддерживают модульное программирование, так как позволяют разбивать большие задачи на самостоятельные, более мелкие и удобные в управлении части;

§ хранимые процедуры могут вызывать другие хранимые процедуры и функции;

§ хранимые процедуры могут быть вызваны из прикладных программ других типов;

§ как правило, хранимые процедуры выполняются быстрее, чем последовательность отдельных операторов;

§ хранимые процедуры проще использовать: они могут состоять из десятков и сотен команд, но для их запуска достаточно указать всего лишь имя нужной хранимой процедуры. Это позволяет уменьшить размер запроса, посылаемого от клиента на сервер, а значит, и нагрузку на сеть.

Пример:

Процедура:

 

CREATE PROCEDURE dbo.AddCustomer

@CityName nvarchar(255),

@CustomerName nvarchar(255)

AS

BEGIN

insert into Customer (CustomerName,CityID) values (@CustomerName,(select CityID from City where CityName = @CityName));

END

Вызов процедуры в клиентской программе:

SqlCommand com = new SqlCommand("AddCustomer", con);

com.CommandType = CommandType.StoredProcedure;

com.Parameters.AddWithValue("@CityName", “Гомель”);

com.Parameters.AddWithValue("@CustomerName", “Ковбеня Э.М.”);

try

{

con.Open();

com.ExecuteNonQuery();

}

catch (Exception e)

{}

finally

{

con.Close();

}

 

Некоторые процедуры могут иметь выходной (OUTPUT) параметр:

 

CREATE PROCEDURE InsertEmployee

@TitleOfCourtesy varchar(25),

@LastName varchar(20),

@FirstName varchar(10),

@EmployeeID int OUTPUT

AS

INSERT INTO Employees

(TitleOfCourtesy, LastName, FirstName, HireDate)

VALUES (@TitleOfCourtesy, @LastName, @FirstName, GETDATE());

SET @EmployeeID = @@IDENTITY

Прочитать выходной параметр достаточно просто:

cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4));

cmd.Parameters["@EmployeeID"].Direction = ParameterDirection.Output;

try

{

con.Open();

cmd.ExecuteNonQuery();

int empID = (int)cmd.Parameters["@EmployeeID"].Value;

}

finally

{

con.Close();

}

 

Объект DataReader. Свойства, методы, примеры использования.

 

DataReader позволяет читать данные, возвращенные командой SELECT, по одной строке за раз, в однонаправленном, доступном только для чтения потоке

SqlConnection con = new SqlConnection(connString);

SqlCommand com = new SqlCommand("Select CountryName from Country", con);

List<String> retList = new List<String>();       

{

con.Open();

SqlDataReader reader = com.ExecuteReader();

while (reader.Read())

{

retList.Add(reader.GetValue(0).ToString());

}

}

catch (Exception e){}

finally

{

con.Close();

}

 

Методы:

DataReader представляет наиболее быстрый способ осмысленного доступа к данным и имеет следующие методы:

Read() - Перемещает курсор строки на следующую строку в потоке. Метод Read() возвращает true, если существует следующая строка для прочтения:while (reader.Read()){ }

GetValue() - Возвращает значение, сохраненное в поле с указанным именем столбца или индексом, внутри текущей выбранной строки. Тип возвращенного значения — ближайший тип .NET, наиболее соответствующий “родному” значению, хранимому в источнике данных.

GetValues() - Сохраняет значения текущей строки в массиве. Количество сохраняемых полей зависит от размера массива, переданного этому методу. Можно использовать свойство DataReader.FieldCount для определения действительного числа полей в строке, и использовать эту информацию для создания массива нужного размера

GetInt32(), GetChar(), GetDateTime()и т.д. - Эти методы возвращают значение поля с указанным индексом в текущей строке, причем тип данных специфицируется именем метода. Эти методы не поддерживают типов, допускающих null-значения.

NextResult()- Если команда, которая сгенерировала DataReader, возвратила более одного набора строк, этот метод перемещает указатель на следующий набор строк и устанавливает его непосредственно перед первой строкой.

Close()- Закрывает модуль чтения.

 

while (reader.Read())

{

retList.Add(reader.GetValue(0).ToString());

}


Дата добавления: 2018-05-02; просмотров: 451; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!