.net 如何加载带有计算列的数据表?

scyqe7ek  于 2023-02-20  发布在  .NET
关注(0)|答案(2)|浏览(142)

我有两个具有相同表的数据集。
数据集1

数据集2

两个表的“FullName”列的表达式属性设置为

[Grade]+'-'+[Class]

对于DataSet 2,我定义了一个方法-“Import”。

// DataSet2.cs file

namespace ConsoleApplication1
{
    public partial class DataSet2
    {
        public void Import(DataSet1 dataSet1)
        {
            this.Group.Load(dataSet1.Group.CreateDataReader());
        }
    }
}

下面的最后一行代码(dataSet2.Import(dataSet1);)抛出InvalidOperationException异常。

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet1 dataSet1 = new DataSet1();
            dataSet1.Group.AddGroupRow(1, "A");
            dataSet1.Group.AddGroupRow(1, "B");

            DataSet2 dataSet2 = new DataSet2();
            dataSet2.Import(dataSet1);
        }
    }
}

这是因为“FullName”列是计算列。我想知道在这种特殊情况下如何绕过此异常?是否可以使DataReader在加载时跳过计算列?或者可能有其他一些“技巧”?
这是我的一个数据集项目中的一个问题的再现,其中有几个表。

ergxz8rk

ergxz8rk1#

请勿使用CreateDataReader,而应使用WriteXmlReadXml

var ds1 = new DataSet1();
ds1.DataTable1.Rows.Add(1, "One");
ds1.DataTable1.Rows.Add(2, "Two");
var ds2 = new DataSet2();
using(var s= new MemoryStream())
{
    ds1.DataTable1.WriteXml(s);
    s.Seek(0, SeekOrigin.Begin);
    ds2.DataTable1.ReadXml(s);
}

在上面的方法中,由于我使用了相同的流进行写和读,我需要重置流位置,这样读语句就可以从头开始读了。

enxuqcxy

enxuqcxy2#

你需要修改导入功能如下

public void Import(DataSet1 dataSet1)
        {
            //this.Group.Load(dataSet1.Group.CreateDataReader());
            foreach(var group in dataSet1.Group)
            {
                GroupRow g  =this.Group.NewGroupRow();
                g.Class = group.Class;
                g.Grade = group.Grade;
                this.Group.AddGroupRow(g);
            }
        }

因为加载函数用于导入所有列,如果您有计算列,则无法使用。

相关问题