从内存流中检索DataTable。

时间:2011-09-14 19:33:37

标签: c# serialization datatable deserialization memorystream

我有一个数据表,它是从列名称数组格式化的,即。

        DataTable ThisTable = new DataTable();

        for (int i = 0; i <= col.GetUpperBound(0); i++)
        {
            try
            {
                ThisTable.Columns.Add(new DataColumn(col[i].ToString(), typeof(string)));
            }
            catch (Exception e)
            {
                MessageBox.Show("Uploader  Error"+e.ToString());
                return null; 
            }
        }
然后我使用BinaryFormatter对象来序列化/反序列化内存流,以便我可以将流中的数据读入表中。用户基本上将上传将被读入数据库的Excel工作表。虽然我意识到这是可能的,我不想将表格写入磁盘然后在中阅读。

然而,当我从Deserialize()调用中检索数据表时,我没有收到错误,但是我得到一个空数据集。

Mem将是我的内存流对象。

        BinaryFormatter bformat = new BinaryFormatter();
        bformat.Serialize(Mem, ThisTable);
        Mem.Seek(0, SeekOrigin.Begin);
        byte[] bt = Mem.ToArray();


        Stream s = new MemoryStream(bt);
        Mem.Position = 0;            
        s.Position = 0; 
        ThisTable = (DataTable)bformat.Deserialize(Mem); 
        DS.Tables.Add(ThisTable);

        return DS;

2 个答案:

答案 0 :(得分:0)

我建议使用OpenXml SDK将Excel文件读入DataTable。

看一下M_R_H的答案,举个例子:

From Excel to DataTable in C# with Open XML

您还可以在此处查看amurra的答案,以获取另一个示例:

reading Excel Open XML is ignoring blank cells

答案 1 :(得分:0)

除非您发布的示例代码中存在错误,否则您不会使用任何数据填充DataTable,而只是创建列。您可以通过DataTable.Rows.Add()

向DataTable添加行
foreach(var o in myDataSource)
{
    ThisTable.Rows.Add(o.Prop1, o.Prop2, etc);
}