Как вызвать код C# из T-SQL, SQL ServerC#

Место общения программистов C#
Ответить
Anonymous
 Как вызвать код C# из T-SQL, SQL Server

Сообщение Anonymous »

Небольшой контекст: мне нужно средство для вставки/выбора/сравнения чисел с плавающей запятой одинарной и двойной точности без потерь в базу данных SQL Server без использования параметров, я подумал, что буду умным и вызову DLL как сверхбыструю функцию.
Я написал и протестировал этот класс C# (который я хорошо протестировал):

Код: Выделить всё

using System;
using System.Linq;
using System.Reflection;

namespace SqlServerCast
{
public class SqlServerCast
{
static public char ByteOrder;

public enum ByteOrderEnum {
BigEndian = 1,     /*  The most significant byte (highest address) is stored first. */
LittleEndian = 0   /*  The least significant byte (lowest address) is stored first. */}

public static void Main()
{
Assembly assem = typeof(SqlServerCast).Assembly;
Object o = assem.CreateInstance("SqlServerCast", false,
BindingFlags.ExactBinding,
null, new Object[] { 2 }, null, null);
}

public SqlServerCast(char val)    //  constructor
{
if (val != 0) ByteOrder = (char) ByteOrderEnum.BigEndian;
else ByteOrder = (char) ByteOrderEnum.LittleEndian;
}

public static double CastToDBL(string str) {return BitConverter.ToDouble(StringToByteArray(str), 0);}

public static float CastToSGL(string str)  {return BitConverter.ToSingle(StringToByteArray(str), 0);}

private static string Dash = "-", NullStr = null;
public static string CastFromDBL(double dbl) {
switch (ByteOrder)
{
case (char)ByteOrderEnum.BigEndian:   //  actually, network byte order, big endian
byte[] bytes = BitConverter.GetBytes(dbl);
return BitConverter.ToString(bytes.Reverse().ToArray()).Replace(Dash, NullStr);
case (char)ByteOrderEnum.LittleEndian:
return BitConverter.ToString(BitConverter.GetBytes(dbl)).Replace(Dash, NullStr);
default:
return null;
}
}

public static string CastFromSGL(float sgl)
{
switch (ByteOrder)
{
case (char)ByteOrderEnum.BigEndian:   //  actually, network byte order, big endian
byte[] bytes = BitConverter.GetBytes(sgl);
return BitConverter.ToString(bytes.Reverse().ToArray()).Replace(Dash, NullStr);
case (char)ByteOrderEnum.LittleEndian:
return BitConverter.ToString(BitConverter.GetBytes(sgl)).Replace(Dash, NullStr);
default:
return null;
}
}

private static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
switch (ByteOrder) {
case (char) ByteOrderEnum.BigEndian:   //  actually, network byte order, big endian
return bytes.Reverse().ToArray();
case (char) ByteOrderEnum.LittleEndian:
return bytes;
default:
return null;
}
}
}
}
...пытаюсь следовать предписаниям SO и MSDN для библиотек DLL, вызываемых T-SQL, и пока получаю эту ошибку:
Сообщение 6544, уровень 16, состояние 1, строка 1

Создать сборку для сборки «SqlServerCast» не удалось, поскольку сборка «SqlServerCast» имеет неправильный формат или не является чистой сборкой .NET.

Непроверяемый PE-заголовок/собственная заглушка.

Может ли кто-нибудь дать мне пошаговый путь к успеху здесь? Я застрял...
Кстати: я знаю о создании хэшей, но пока не думаю, что это проблема.

Подробнее здесь: https://stackoverflow.com/questions/713 ... sql-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»