我在MS SQL服务器中有一个表,如下所示:
CREATE TABLE Setting
(
ID int NOT NULL,
Value varbinary(MAX) NOT NULL
)
Value列中的信息可以格式化为字符串,布尔值,整数,小数等。例如:
INSERT INTO Setting (Value) VALUES (CONVERT(VARBINARY(MAX), 5.4))
要选择数据,我可以在将数据返回到.Net之前转换值,但我更喜欢我的select过程返回二进制数据,然后在.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语句将值转换为字符串。
我首选的解决方案是,如果我可以从.Net访问MS SQL的转换函数而无需连接到数据库。
我不想使用自行开发的函数来进行转换。我需要一个可靠的解决方案。
我的环境是.Net 2008,C#或VB
任何想法都会受到赞赏。
答案 0 :(得分:0)
您的第一次尝试已经结束,有BitConverter.ToDouble
或您要将其转换为的任何内容。
你的第二次尝试也很接近,你只是在阅读它之前没有倒回流(这是一种疯狂的回旋方式......)。
关于您的第3次尝试,您仍未学习有关I / O的课程。
编辑:我不相信你从那个东西得到一个小数。你应该仔细检查你的类型......