2016-04-11 8 views
0

私はMs SQLサーバーでDLLをアセンブリしたい。私はこのDLLを使用したCLRアセンブリ

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

を実行すると、ここで コード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"; 
} 

}

その後、私は(ミスをしたSQL

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

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

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

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

でそのように書くアセンブリのためのアセンブリを作成できませんでしたアセンブリが不正であるか、純粋な.netアセンブリでないためです。Unverifiable PE Header/n ativeスタブ)。 私は何をしなければならないのですか?

答えて

0

FileCompressCLRは部分クラスとしてマークする必要があります。

すべてのSQLCLRクラスは、UDFであっても、CLRプロシージャでも部分クラスである必要があります。使用しているSQLサーバーのバージョン

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

。 UDFから呼び出し可能なフレームワークAPIは、多くの制限があります。

しかし、System.IOがサポートされているようです。 Partialクラスに変更してみてください。

希望します。

注:

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, 

System.DirectoryServices名前空間はサポートされていません:SQL ServerでCLRの統合でサポートされている

ライブラリ/名前空間があります。

関連する問題