2016-04-11 5 views
0

Je veux assembler ma DLL dans le serveur Ms sql. dll code iciCLR Assemblage avec dll

using System; 
    using System.Data; 
    using System.Data.SqlClient; 
    using System.Data.SqlTypes; 
    using Microsoft.SqlServer.Server; 
    using System.IO; 
    using System.IO.Compression; 

public class FileCompressCLR 
{ 
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, DataAccess =  DataAccessKind.None)] 

//Загрузка файла в виде бинарника, на входе Полный путь к файлу 
public static SqlBytes LoadFile(string FileName) 
{ 
    FileStream file = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read); 

    MemoryStream ms = new MemoryStream(); 
    int sourcebyte = file.ReadByte(); 
    while (sourcebyte != -1) 
    { 
     ms.WriteByte((byte)sourcebyte); 
     sourcebyte = file.ReadByte(); 
    } 

    file.Close(); 
    return new SqlBytes(ms); 
} 

//Загрузка файла в виде бинарника с компрессией, на входе Полный путь к файлу 
public static SqlBytes LoadCompressFile(string FileName) 
{ 
    FileStream file = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read); 
    byte[] buffer = new byte[file.Length]; 
    file.Read(buffer, 0, buffer.Length); 
    file.Close(); 

    MemoryStream ms = new MemoryStream(); 

    DeflateStream compress = new DeflateStream(ms, CompressionMode.Compress, true); 
    compress.Write(buffer, 0, buffer.Length); 

    compress.Close(); 
    compress = null; 

    return new SqlBytes(ms); 
} 

//Выгрузка файла в указанный источник 
public static string SaveFile(string FileName, SqlBytes CompressedFile) 
{ 
    if (CompressedFile.IsNull) 
     return "Error"; 

    try 
    { 

     FileStream file = File.Create(FileName); 

     int sourcebyte = CompressedFile.Stream.ReadByte(); 
     while (sourcebyte != -1) 
     { 
      file.WriteByte((byte)sourcebyte); 
      sourcebyte = CompressedFile.Stream.ReadByte(); 
     } 

     file.Close(); 
    } 

    catch (Exception) 
    { 
     return "Error"; 
    } 

    return "OK"; 
} 

//Выгрузка файла в указанный источник с предварительной декомпрессией 
public static string SaveDecompressFile(string FileName, SqlBytes CompressedFile) 
{ 
    if (CompressedFile.IsNull) 
    return "Error"; 

    DeflateStream decompress = new DeflateStream(CompressedFile.Stream, CompressionMode.Decompress, true); 

    try 
    { 

     FileStream file = File.Create(FileName); 

     int sourcebyte = decompress.ReadByte(); 
     while (sourcebyte != -1) 
     { 
      file.WriteByte((byte)sourcebyte); 
      sourcebyte = decompress.ReadByte(); 
     } 

     file.Close(); 
    } 

    catch (Exception) 
    { 
     return "Error"; 
    } 

    finally 
    { 
     decompress.Close(); 
     decompress = null; 
    }  

    return "OK"; 
} 

}

Puis-je écrire comme ça dans sql

--Включаем выполнение пользовательских сборок 
SP_CONFIGURE 'clr enabled', 1 
GO 
RECONFIGURE 
GO 

--Создаём тестовую БД для демострации 
CREATE DATABASE TestDB 
GO 

--Модули базы данных (например, пользовательские функции или хранимые процедуры), 
--которые используют контекст олицетворения, могут обращаться к ресурсам, 
--находящимся вне базы данных. 
ALTER DATABASE TestDB SET TRUSTWORTHY ON 
GO 

--Переходим в нашу БД 
USE TestDB 
GO 

Quand j'exécutons ce

--Регистрируем сборку 
**CREATE ASSEMBLY FileCompressCLR 
FROM 'C:\CLR\FileCompressCLR.dll' 
WITH PERMISSION_SET = UNSAFE; 
GO** 

j'ai erreur (créer l'assemblage pour l'assemblage échoué parce que l'assembly est mal formé ou pas un pur assembly .net Unverifiable PE Header/n talon actif). Ce que je dois faire, pour que tout fonctionne, pouvez-vous m'aider?

Répondre

0

FileCompressCLR doit être marqué comme classe partielle.

Toute la classe SQLCLR que ce soit des procédures UDF ou CLR doit être une classe partielle.

https://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.90).aspx

Quelle version de SQL Server que vous utilisez. Il peut y avoir de nombreuses restrictions, car les API Framework peuvent être appelées depuis UDF.

Mais il semble que System.IO soit supporté. Essayez de le changer en classe partielle et voir.

Espérons que ça aide.

Note:

Les bibliothèques/espaces de noms pris en charge par l'intégration du CLR dans SQL Server sont:

CustomMarshalers, 
Microsoft.VisualBasic, 
Microsoft.VisualC, 
mscorlib, 
System, 
System.Configuration, 
System.Data, 
System.Data.OracleClient, 
System.Data.SqlXml, 
System.Deployment, 
System.Security, 
System.Transactions, 
System.Web.Services, 
System.Xml, 
System.Core.dll, 
System.Xml.Linq.dll, 

L'espace de noms System.DirectoryServices est pas pris en charge.