Хранимые процедуры. Вызов хранимых процедур в 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!