У меня есть таблица на сервере 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
Любые мысли приветствуются.