Бинарное преобразование SQL против двоичного преобразования .Net - PullRequest
1 голос
/ 14 июня 2011

У меня есть таблица на сервере MS SQL, например:

CREATE TABLE Setting
(
   ID int NOT NULL,
   Value varbinary(MAX) NOT NULL
)

Информация в столбце «Значение» может быть отформатирована как строка, логическое, целое, десятичное и т. Д. Например:

INSERT INTO Setting (Value) VALUES (CONVERT(VARBINARY(MAX), 5.4))

Чтобы выбрать данные, я мог бы преобразовать значения перед возвратом данных в .Net, но я бы предпочел, чтобы моя процедура выбора возвращала двоичные данные и затем выполняла правильное преобразование типов в .Net. Таким образом, я смогу выбрать несколько настроек, сохраненных в разных форматах одновременно.

Что я не могу понять, так это как преобразовать двоичные данные, возвращаемые в правильные типы (особенно для целых и десятичных). База данных возвращает двоичные данные в байтовом массиве (byte []), но преобразование из байтового массива в целое или десятичное кажется плохо поддерживаемым.

Вначале я склонялся к использованию System.Convert, но он не поддерживает байтовые массивы.

Вторым моим решением было использование System.IO.BinaryWriter и System.IO.BinaryReader. Этот метод дал мне эту ошибку: «Невозможно прочитать за пределами потока».

Пример:

cmd.CommandText = "SELECT CONVERT(VARBINARY(MAX), 2.3)";
byte[] bytes = (byte[])ExecuteSelect(cmd).Rows[0][0];
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.BinaryWriter br = new System.IO.BinaryWriter(ms);
br.Write(bytes);
System.IO.BinaryReader br2 = new System.IO.BinaryReader(ms);
decimal d = br2.ReadDecimal();

Моя третья попытка состояла в том, чтобы использовать System.Runtime.Serialization.Formatters.Binary.BinaryFormatter, но это возвращает сообщение об ошибке: «Конец потока обнаружен до завершения анализа».

Пример:

cmd.CommandText = "SELECT CONVERT(VARBINARY(MAX), 2.3)";
byte[] bytes = (byte[])ExecuteSelect(cmd).Rows[0][0];
System.IO.MemoryStream ms = new System.IO.MemoryStream();
ms.Write(bytes, 0, bytes.Length);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
decimal d = (decimal)bf.Deserialize(ms);

Мое текущее решение состоит в том, чтобы передать тип значения в хранимую процедуру и использовать оператор case для преобразования значения в строку.

Мое предпочтительное решение было бы, если бы я мог получить доступ к функции преобразования MS SQL из .Net без подключения к базе данных.

Я не хочу использовать доморощенную функцию для преобразования. Мне нужно надежное решение.

Моя среда .Net 2008, C # или VB

Любые мысли приветствуются.

1 Ответ

0 голосов
/ 14 июня 2011

Ваша первая попытка была близка, есть BitConverter.ToDouble или все, что вы хотите преобразовать в.

Ваша вторая попытка также была близка, вы просто не перематывали поток перед его чтением (и что за сумасшедший обходной путь ...).

Что касается вашей третьей попытки, вы все еще не усвоили урок относительно ввода / вывода.

Редактировать: Я не уверен, что вы получаете десятичную дробь из этой вещи. Вы должны дважды проверить ваши типы ...

...