- •Visual Studio и sql Server 2005 - начало работы. Проекты.
- •Интеграция в sql Server
- •Хранимые процедуры
- •Пользовательские функции Скалярные функции
- •Табличные функции
- •Триггеры
- •Агрегирующие функции
- •Пользовательские типы данных
- •Программирование на стороне клиента
- •Настройка odbc
- •Программный доступ посредством odbc
- •Классификация api-функций odbc
- •Пример программирования на основе odbc
- •Технология ado.Net Общие сведения
- •Соединение с sql Server
- •Представление базы данных на стороне клиента
- •Средства отображения таблиц
- •Взаимодействие с sql Server и получение результатов Запуск команд на стороне сервера
- •Использование адаптера
- •Контрольные вопросы:
- •Самостоятельная работа:
- •Список литературы:
Взаимодействие с sql Server и получение результатов Запуск команд на стороне сервера
Перейдем теперь к вопросу о запуске команд SQL на стороне сервера и получении результатов этих команд. В листинге 5.7 представлена консольная программа, осуществляющая клиентские функции:
соединение с SQL Server;
выполнение команды на стороне сервера;
получение результата выполнения команд;
простейшие операции с наборами получившихся строк.
Листинг 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 не используется.