Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР7.doc
Скачиваний:
16
Добавлен:
05.05.2019
Размер:
851.46 Кб
Скачать
    1. Взаимодействие с sql Server и получение результатов Запуск команд на стороне сервера

Перейдем теперь к вопросу о запуске команд SQL на стороне сервера и получении результатов этих команд. В листинге 5.7 представлена консольная программа, осуществляющая клиентские функции:

  1. соединение с SQL Server;

  2. выполнение команды на стороне сервера;

  3. получение результата выполнения команд;

  4. простейшие операции с наборами получившихся строк.

Листинг 5.7

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

namespace sql13

{

class Program

{

static void Main(string[] args)

{

try

{

// объект получит строки результата запроса

SqlDataReader rd;

// создать соединение

SqlConnection cn = new SqlConnection();

// строка соединения

cn.ConnectionString = "Data Source=DOM;" +

"Initial Catalog=institute;" +

"User Id=sa1;Password=valsidalv";

// осуществить соединение с сервером

cn.Open();

// создать команду

SqlCommand sc = new SqlCommand();

sc.Connection = cn;

sc.CommandType = CommandType.Text;

sc.CommandText = "use institute";

// вначале сделаем текущей базу данных institute

sc.ExecuteNonQuery();

sc.CommandType = CommandType.StoredProcedure;

// теперь подготовимся к запуску хранимой процедуры

sc.CommandText = "dbo.proc1";

// первый параметр

SqlParameter prmt1 = new SqlParameter();

prmt1.ParameterName = "@id";

prmt1.SqlDbType = SqlDbType.Int;

// входной параметр

prmt1.Direction = ParameterDirection.Input;

prmt1.Value = 1;

// второй параметр

SqlParameter prmt2 = new SqlParameter();

prmt2.ParameterName = "@mark";

prmt2.SqlDbType = SqlDbType.Int;

// выходной параметр

prmt2.Direction = ParameterDirection.Output;

// добавить параметры к команде

sc.Parameters.Add(prmt1);

sc.Parameters.Add(prmt2);

// выполнить команду

// для получения выходного параметра

sc.ExecuteNonQuery();

// получим выходной параметр

Console.WriteLine("Value of parameter:" +

sc.Parameters[1].Value.ToString());

Console.WriteLine("----------------------------");

// для получения набора строк

rd = sc.ExecuteReader();

// получить доступ к результирующим строкам

continue1:

while (rd.Read())

{

Console.WriteLine("Name: " + rd[0].ToString());

}

Console.WriteLine("----------------------------");

// если есть еще один набор - продолжим

if (rd.NextResult()) goto continue1;

// закрыть соединение

cn.Close();

}

// обработка возможного исключения

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

}

}

}

Обратите внимание, как организуется работа с параметрами. Это самостоятельные объекты. Предварительно их следует создать, описать и только потом добавить к команде. Если параметр должен возвращать некоторое значение из процедуры, он должен иметь тип output.

Доступ к параметрам может осуществляться как по индексу, так и по его имени. Другими словами, вместо sc.Parameters[1].Value.ToString() можно использовать sc.Parameters ["@mark"].Value.ToString() . Впрочем, для технологии .NET это обычное дело: к набору именованных объектов можно получать доступ и по имени, и по номеру.

Мы знаем, что хранимая процедура может возвращать несколько наборов данных. По умолчанию возвращаются именно все наборы данных. Метод ExecuteReader перегружен. В качестве параметра можно указать аргумент CommandBehavior.SingleResult, и тогда всегда будет возвращаться только один набор данных. Для перехода к следующему набору данных используется метод NextResult, который возвращает значение true, если такой набор имеется.

Не забывайте о типе команды. В листинге 5.7 это продемонстрировано выполнением команды use institute и вызовом хранимой процедуры. Заметьте, что если тип команды StoredProcedure, то ключевое слово execute не используется.