- •Visual Studio и sql Server 2005 - начало работы. Проекты.
- •Интеграция в sql Server
- •Хранимые процедуры
- •Пользовательские функции Скалярные функции
- •Табличные функции
- •Триггеры
- •Агрегирующие функции
- •Пользовательские типы данных
- •Программирование на стороне клиента
- •Настройка odbc
- •Программный доступ посредством odbc
- •Классификация api-функций odbc
- •Пример программирования на основе odbc
- •Технология ado.Net Общие сведения
- •Соединение с sql Server
- •Представление базы данных на стороне клиента
- •Средства отображения таблиц
- •Взаимодействие с sql Server и получение результатов Запуск команд на стороне сервера
- •Использование адаптера
- •Контрольные вопросы:
- •Самостоятельная работа:
- •Список литературы:
Пользовательские функции Скалярные функции
Создание пользовательской функции, как и хранимой процедуры, осуществляется путем добавления в проект шаблона Project | User-Defined Function....
Дадим имя модулю myfunc. Содержимое модуля представлено в листинге 4.10. Для работы с пользовательскими функциями мы создали новый проект sql2, но могли бы воспользоваться и старым проектом sql1, т. е. добавили бы пользовательскую функцию в старую сборку, где нами уже создана хранимая процедура.
Листинг 4.10
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
//атрибут
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString myfunc()
{
// Put your code here
return new SqlString("Hello");
}
};
Для создания пользовательской функции на основе модуля из листинга 4.10 следует выполнить последовательность команд из листинга 4.11.
Листинг 4.11
--удаляем функцию и сборку
drop function dbo. myfunc1
drop assembly sql2
go
--регистрируем сборку
create assembly sql2
from 'F:\sql\sql2\sql2\bin\Release\sql2.dll'
with permission_set = safe
go
--создаем пользовательскую функцию
create function myfunc1
(
)
returns nchar(15)
as
external name sql2.UserDefinedFunctions.myfunc
Созданная нами функция является скалярной. Она возвращает строковое значение. Кстати, обратите внимание, что ради совместимости тип возвращаемого значения определен нами как nchar. Теперь функция готова и может быть вызвана, например, командой select dbo.myfunc1 () или использована непосредственно в программе на языке Transact-SQL:
declare @nc nchar(15)
set @nc = dbo.myfunc1()+'!'
Если ваша скалярная функция должна возвратить некоторый скаляр, получаемый в результате выполнения некоторого запроса, то следующий пример может помочь вам это сделать (листинг 4.12).
Листинг 4.12
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static int myfunc(SqlInt32 id)
{
SqlConnection conn = new SqlConnection("context connection=true");
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText =
"select count(*) as 'count' from dbo.students where id>" +
id.ToString();
cmd.Connection = conn;
return (int)cmd.ExecuteScalar();
}
};
Прокомментируем программный код из листинга 4.12.
Обратите внимание, что при задании атрибута задано свойство DataAccess. Это свойство определяет возможность доступа к данным. Метод ExecuteScalar выполняет запрос и возвращает элемент полученной таблицы, находящийся на пересечении первого столбца и первой строки. В данном случае результат выполнения запроса состоит всего из одного элемента.
Для того чтобы получить доступ к данным, приходится также создать объект SqlConnection — соединение.
Строка сmd.connection = conn; необходима, чтобы указать, посредством какого соединения будет осуществлен запрос.