Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Здравствуйте!

Я хочу реализовать подключение библиотеки к sql server, для того чтобы потом я мог использовать её методы в sql запросах.
Первое что я сделал, это создал простой проект в visual studio :
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

namespace TestLib
{
    public class Main
    {
        private const int Sale = 30;

        [SqlFunction]
        public static int AddTax()
        {
            return Sale;
        }
    }
}

Все теперь я имею библиотеку.

Теперь я в sql server создаю ASSEMBLY:
CREATE ASSEMBLY TestLib
FROM N'F:\TSqlAssembly\TestLib.dll'


Дальше я пытаюсь создать функцию
USE [TestDb]
GO
CREATE FUNCTION sde.GetTax(@o int)
RETURNS int
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME TestLib.Main.AddTax

Это кричит при создании функции
Msg 6505, Level 16, State 2, Procedure GetTax, Line 1
Не удалось обнаружить тип "Main" в сборке "TestLib".


Может мне кто нибудь помочь, может я что-то не учел?
18 фев 16, 10:38    [18833625]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Nechto,

а просто начать с изучения примера из бол?
18 фев 16, 10:51    [18833695]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
WarAnt
Nechto,а просто начать с изучения примера из бол?

Почитал
ALTER AUTHORIZATION ON DATABASE::TEST TO sa;
ALTER DATABASE TEST SET TRUSTWORTHY ON

USE TestDb
GO
CREATE ASSEMBLY TestLib
FROM N'D:\TestLib.dll'
WITH PERMISSION_SET = UNSAFE -- неограниченный доступ
GO

CREATE FUNCTION dbo.GetTax()
RETURNS int
AS
EXTERNAL NAME TestLib.Main.AddTax


Но проблема осталась, почему-то не может найти Main
18 фев 16, 13:14    [18834790]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Nechto,

у вас используется namespace в сборке, поэтому вы должны указать полный путь к функции в сборке

CREATE FUNCTION dbo.GetTax()
RETURNS int
AS
EXTERNAL NAME TestLib.[TestLib.Main].AddTax
18 фев 16, 13:17    [18834817]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Точно вот только на статью наткнулся.
http://stackoverflow.com/questions/7823488/sql-server-could-not-find-type-in-the-assembly
18 фев 16, 13:20    [18834831]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Вот еще проблема была с Select. Решение проблемы
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO


Ну и собственно запрос
USE TestDb
GO
SELECT dbo.GetTax() -- return 30
18 фев 16, 13:34    [18834949]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Nechto
Почитал

Но проблема осталась, почему-то не может найти Main


И где же вы в примере увидели Main? или вообще namespace?
18 фев 16, 13:51    [18835135]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
WarAnt
Nechto
Почитал

Но проблема осталась, почему-то не может найти Main


И где же вы в примере увидели Main? или вообще namespace?


Уже все проверено и работает.
18 фев 16, 15:37    [18836144]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Все что выше в теме работает, без проблем.

Столкнулся с другой проблемой. В сборке я стал использовать стороннюю библиотеку ESRI.ArcGis.Version.dll
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using ESRI.ArcGis.Version 

namespace TestLib
{
    public class Main
    {
        private const int Sale = 30;

        [SqlFunction]
        public static int AddTax()
        {
            return Sale;
        }
    }
}

Пробую создать assembly со сторонней библиотекой
USE TEST
GO
CREATE ASSEMBLY ESRIArcGisVersion
AUTHORIZATION dbo
FROM N'D:\Project\ESRI.ArcGis.Version.dll'
WITH PERMISSION_SET = UNSAFE
GO
CREATE ASSEMBLY TestLib
AUTHORIZATION dbo
FROM N'D:\Project\TestLib.dll'
WITH PERMISSION_SET = UNSAFE

В итоге ESRIArcGisVersion assembly создает. А вот TestLib не создает, ругается:
автор
Сборка "TestLib" ссылается на сборку "esri.arcgis.version, version=10.0.0.0, culture=neutral, publickeytoken=8fc3cc631e44ad86.", которая отсутствует в текущей базе данных. SQL Server попытался обнаружить и автоматически загрузить указанную сборку из того же места, где расположена ссылающаяся сборка, но операция не удалась (причина:(The system cannot find the file specified)). Загрузите указанную сборку в текущую базу данных и повторите запрос заново.
25 фев 16, 13:07    [18861882]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Nechto,

на какой язык вам перевести текст ошибки?
автор
SQL Server попытался обнаружить и автоматически загрузить указанную сборку из того же места, где расположена ссылающаяся сборка, но операция не удалась (причина:(The system cannot find the file specified)). Загрузите указанную сборку в текущую базу данных и повторите запрос заново.
25 фев 16, 14:03    [18862222]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Я понимаю что написано в Error. Я не знаю как сделать чтобы он находил по ссылке dll?
25 фев 16, 14:10    [18862267]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Nechto,

CREATE ASSEMBLY [esri.arcgis.version]
AUTHORIZATION dbo
FROM N'D:\Project\ESRI.ArcGis.Version.dll'
WITH PERMISSION_SET = UNSAFE
25 фев 16, 14:41    [18862474]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
felix_ff
Nechto,

CREATE ASSEMBLY [esri.arcgis.version]
AUTHORIZATION dbo
FROM N'D:\Project\ESRI.ArcGis.Version.dll'
WITH PERMISSION_SET = UNSAFE


Ошибка осталась, поменялась только причина
автор
Сборка "TestLib" ссылается на сборку "esri.arcgis.version, version=10.0.0.0, culture=neutral, publickeytoken=8fc3cc631e44ad86.", которая отсутствует в текущей базе данных. SQL Server попытался обнаружить и автоматически загрузить указанную сборку из того же места, где расположена ссылающаяся сборка, но операция не удалась (причина: несоответствие версии, культуры или открытого ключа). Загрузите указанную сборку в текущую базу данных и повторите запрос заново.
25 фев 16, 15:00    [18862654]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Nechto,

select name, clr_name from sys.assemblies 

покажите что у вас сейчас там есть в базе
25 фев 16, 15:24    [18862859]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
felix_ff
Nechto,

select name, clr_name from sys.assemblies 

покажите что у вас сейчас там есть в базе


Странно почему clt_name version 0.0.0.0

К сообщению приложен файл. Размер - 5Kb
25 фев 16, 15:30    [18862921]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Nechto
felix_ff
Nechto,

select name, clr_name from sys.assemblies 

покажите что у вас сейчас там есть в базе


Странно почему clt_name version 0.0.0.0


STGeomProjectAssembly это TestLib.
25 фев 16, 15:36    [18862972]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Nechto,

у вас в проекте референс на сборку esri.arcgis.version по версии и культуре совпадает с тем что вы грузите из файла на диске D: ?
25 фев 16, 15:56    [18863125]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
и меня еще вот что смущает, у вас сборка под среду X86, а версия сервера какая?

select @@VERSION
25 фев 16, 16:03    [18863191]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
felix_ff
Nechto,

у вас в проекте референс на сборку esri.arcgis.version по версии и культуре совпадает с тем что вы грузите из файла на диске D: ?

Runtime Version v2.0.50727
Version 10.0.0.0
Culture пусто

Выходит что совпадает.
25 фев 16, 16:05    [18863207]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
felix_ff
и меня еще вот что смущает, у вас сборка под среду X86, а версия сервера какая?

select @@VERSION


Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
25 фев 16, 16:08    [18863232]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Nechto,

перестройте проект под платформу X64
25 фев 16, 16:10    [18863249]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
felix_ff
Nechto,

перестройте проект под платформу X64


Как раз этим занимаюсь. Проверю отпишусь.
25 фев 16, 16:13    [18863276]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Все равно выдает тоже ту же ошибку.

Теперь у меня проект dll 64х
А библиотека esri 86х
25 фев 16, 16:26    [18863399]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Создал две библиотеки, с разной разрядностью:
x86DLL.dll
x64DLL.dll


Создал две сборки с разной разрядностью, и подключил к ним библиотеки:
// - x86 данная сборка не загружается
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using x86DLL;
namespace x86Project
{
    public class X86
    {
        [SqlFunction(DataAccess = DataAccessKind.Read)]
        public static SqlString GetVersion()
        {
            return x86DLL.Base.Version();
        }
    }
}

// - x64
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using x64DLL;
namespace x64Project
{
    public class X64
    {
        [SqlFunction(DataAccess = DataAccessKind.Read)]
        public static SqlString GetVersion()
        {
            return x64DLL.Base.Version();
        }
    }
}
Все содержимое скопировал на С:\TSqlAssembly

Далее создал SQL запросы для загрузки сборок:
USE BASE

GO
IF  EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'x64Project.dll' and is_user_defined = 1)
DROP ASSEMBLY [x64Project.dll]
GO
IF  EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'x86Project.dll' and is_user_defined = 1)
DROP ASSEMBLY [x86Project.dll]

GO
IF  EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'ESRI.ArcGIS.Version.dll' and is_user_defined = 1)
DROP ASSEMBLY [ESRI.ArcGIS.Version.dll]
GO
IF  EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'x86DLL.dll' and is_user_defined = 1)
DROP ASSEMBLY [x86DLL.dll]
GO
IF  EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'x64DLL.dll' and is_user_defined = 1)
DROP ASSEMBLY [x64DLL.dll]

GO -- библиотека х86
CREATE ASSEMBLY [ESRI.ArcGIS.Version.dll] AUTHORIZATION dbo
FROM N'C:\TSqlAssembly\ESRI.ArcGIS.Version.dll'
WITH PERMISSION_SET = UNSAFE;
GO -- библиотека х86
CREATE ASSEMBLY [x86DLL.dll] AUTHORIZATION dbo
FROM N'C:\TSqlAssembly\x86DLL.dll'
WITH PERMISSION_SET = UNSAFE;
GO -- библиотека х64
CREATE ASSEMBLY [x64DLL.dll] AUTHORIZATION dbo
FROM N'C:\TSqlAssembly\x64DLL.dll'
WITH PERMISSION_SET = UNSAFE;
GO
CREATE ASSEMBLY [x64Project.dll] AUTHORIZATION dbo
FROM N'C:\TSqlAssembly\x64Project.dll'
WITH PERMISSION_SET = UNSAFE;
GO
CREATE ASSEMBLY [x86Project.dll] AUTHORIZATION dbo
FROM N'C:\TSqlAssembly\x86Project.dll'
WITH PERMISSION_SET = UNSAFE;

select * from sys.assemblies


Далее я приступил к установке MSSQL Server 2012 x86, на свой ноутбук.
После, установки проверил загрузку сборок. В Итоге все сборки загрузились без особых проблем, и х86 и х64;

Далее, я приступил к установке того же дистрибутива MSSQL Server 2012 x64, на свой ноутбук.
После, установки проверил загрузку сборок. В итоге загружаются все сборки кроме, одной x86Project.dll, так как эта сборка имеет ссылку на x86DLL.dll.

Вывод: сборка со ссылкой на dll(x86), не загружается в MSSQL Server 2012 x64.

Вопрос: можно ли это как-то победить?
27 фев 16, 14:38    [18871356]     Ответить | Цитировать Сообщить модератору
 Re: Создание assembly и функции  [new]
Nechto
Member

Откуда:
Сообщений: 829
Уважаемые, но помогите пожалуйста. Не могу найти решения. :(
29 фев 16, 10:40    [18875998]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить