2013-03-30 58 views
1

我只需要做反向转换为this question曝光。如何将内存流转换为System.Data.Linq.Binary?

我有一个MemoryStream并希望将它保存在我的SQL CE数据库的System.Data.Linq程序二进制领域(仅供参考我使用EF代码优先)。

将MemoryStream实际上是一个XML,这比一个字符串字段的最大尺寸,所以我发现没有其他的方法比在二进制存储它(关于这个问题的建议真正理解)。

我的代码(适于)

private Stream _userLayout; 
    _userLayout = new MemoryStream(); 
    DXGridControl_Table.SaveLayoutToStream(_userLayout); 
    MyDatabse.SomeTable.SomeBinaryField = _userLayout.???? 

回答

3

首先是

 byte[] buffer = new byte[LENGTH]; 
     MemoryStream memoryStream = new MemoryStream(buffer); 

在您的例子,你可以使用

 DXGridControl_Table.SaveLayoutToStream(_userLayout); 
     byte[] doSomethingwithyourData = _userLayout.GetBuffer(); 
     var length = _userLayout.Length; 

有了这些信息,你可以写二进制数据什么的。

注意,缓冲区包含分配的字节,这可能是未使用的。 例如,如果将字符串“test”写入到MemoryStream 对象中,则从GetBuffer返回的缓冲区的长度为256,而不是 4,未使用252个字节。要仅获取缓冲区中的数据,请使用ToArray方法 ;但是,ToArray会在内存中创建数据的副本。

或者

Binary binary = new Binary(_userLayout.ToArray()); 

像对方回答说,有二进制的隐式转换:

public static implicit operator Binary(byte[] value) { 
    return new Binary(value); 
} 

您请求的例子。 ,使用方法的一个小例子:

namespace Stackoverflow.Hannish.SaveLayout 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.IO; 
    using System.Text; 
    using System.Windows.Forms; 

    public partial class Form1 : Form 
    { 
     /// <summary> 
     /// Here we store the layout data as a string. This is the data, that 
     /// gets saved to disk/database/etc. 
     /// </summary> 
     private string layoutdata = string.Empty; 

     public Form1() 
     { 
      this.InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // Just some FooBar data. 
      var data = new List<DataValue> 
          { 
           new DataValue { Id = 1, Name = "Xyz", IsCool = true }, 
           new DataValue { Id = 2, Name = "Abc", IsCool = false } 
          }; 

      this.gridControl1.DataSource = data; 
     } 

     private void bnLoadLayout_Click(object sender, EventArgs e) 
     { 
      using (var stream = new MemoryStream()) 
      { 
       var strdata = Encoding.Default.GetBytes(this.layoutdata); 
       stream.Write(strdata, 0, strdata.Length); 
       stream.Seek(0, SeekOrigin.Begin); 
       this.gridView1.RestoreLayoutFromStream(stream); 
      } 
     } 

     private void bnSaveLayout_Click(object sender, EventArgs e) 
     { 
      using (var stream = new MemoryStream()) 
      { 
       this.gridView1.SaveLayoutToStream(stream); 
       this.layoutdata = Encoding.Default.GetString(stream.ToArray()); 
      } 
     } 
    } 
} 

而一些字节到文件魔术:

private void bnLoadBinLayout_Click(object sender, EventArgs e) 
    { 
     using (FileStream fstream = File.Open("Layoutdata.bin", FileMode.Open)) 
     { 
      int length = (int)fstream.Length; 
      byte[] buffer = new byte[length]; 
      fstream.Read(buffer, 0, length); 

      var memstream = new MemoryStream(buffer); 
      this.gridView1.RestoreLayoutFromStream(memstream); 
     } 
    } 

    private void bnSaveBinLayout_Click(object sender, EventArgs e) 
    { 
     using (FileStream fstream = File.Create("Layoutdata.bin")) 
     { 
      var memstream = new MemoryStream(); 
      this.gridView1.SaveLayoutToStream(memstream); 
      fstream.Write(memstream.GetBuffer(), 0, (int)memstream.Length); 
     } 
    } 

...只是作为例子。 DevExpress GridView可以使用SaveLayoutToXml()保存布局本身;

+0

Jedzia,关爱给您的评论的一个例子”有了这些信息,你可以写二进制数据。什么?”。适用于这种情况下你可以看到,我不太习惯用流和二进制类型的工作,所以请容许我 – Hannish

+2

我补充说:‘关于使用一个小例子:’在上面的回答,真希望帮助:) – Jedzia

+0

鉴于伟大而彻底的例子,我认为这是最好的答案,非常感谢你! – Hannish

4

MemorySteam类有ToArray()方法:

MemoryStream.ToArray Method

写入流内容到一个字节数组,而不管位置属性的。

此方法返回的MemoryStream的内容的副本作为字节数组。如果当前实例是在提供的字节数组上构造的,则返回此实例有权访问的数组部分的副本。有关详细信息,请参阅MemoryStream构造函数。

这种方法时,MemoryStream的关闭工作。

随着byte[]就可以轻松搞定Binary实例,因为Byte[] to Binary implicit conversion可用:

MyDatabse.SomeTable.SomeBinaryField = (Binary) _userLayout.ToArray(); 
+0

谢谢马尔钦抽出时间来回答。我必须在这里丢失一些非常简单的东西,但是当我键入“(Binary)_userLayout.ToArray();”或者像这样投射((Binary)_userLayout).ToArray();我得到一个“无法键入System.IO.MemoryStream转换为System.Data.Linq.Binary。任何想法,为什么发生这种情况? – Hannish

1

给你的第二个问题和你的(可能的)来回转换数据的概念错误。

将那个有趣的DevExpress XML保存在ntext数据列中。

NTEXT:与(2^30-2)/ 2(536870911)字符的最大长度可变长度Unicode数据。存储大小(以字节为单位)是输入字符数的两倍。

SQL Server Compact 4.0 Data Types

+0

谢谢Jedzia。你的回答提出了两个问题...如何我是否定义了一个ntext字段w? ith代码优先方法(字符串属性被转换为数据库中的nchar字段),链接中的注释是什么意思? “字符串函数不再支持ntext”。谢谢 – Hannish

+0

事实上,这是对我来说似乎是最好的选择,因为我可以完全避免转换到/从二进制转换,因为有趣的DevExpress组件也有一个“SaveLayoutToXML”方法,我假设我可以直接存储在这样的一个数据库字段。 – Hannish

+0

请看看http://stackoverflow.com/questions/11365186/ntext-with-more-than-4000-characters-in-sql-server-ce-in-windows-phone?answertab=oldest#tab-顶部关于定义ntext字段(阅读并检查微软KB的东西)。 – Jedzia

相关问题