rksoftware

Visual Studio とか C# とかが好きです

.NET Standard で使える DataTable

皆さんは .NET Framework で使えた DataTable というクラスをご存知でしょうか?
現在はほとんど使われなくなっているので、現代のコードでは見る機会がなく知らない方が多いのではないかと思います。

しかし、実は古くからの .NET Framework ユーザーには根強い人気がありいまだに愛用している現場も多くあるらしいです。

そんな DataTable ですが、.NET Standard で使えるようになっていることに気が付いたので少し調べてみることにしました。

■ API の違い

.NET Framework と .NET Core など実装ごとに実はいくらか API が異なっています。
しかし、それではいろいろ困るので、統一した規格として .NET Standard というものがあります。どの実装でも最低限持たなければならない API です。
ということは、.NET Standard ⊂ .NET Framework の関係。.NET Framework の機能すべてが .NET Standard で使えるとは限りません。

■ 比較してみた

というわけで、各実装で DataTable の API にどのような違いがあるのか、比較してみました。

基底クラス

.NET Framework .NET Stabdard .NET Core
MarshalByValueComponent MarshalByValueComponent MarshalByValueComponent

一致:1 / 差:0

インタフェース

.NET Framework .NET Stabdard .NET Core
IListSource IListSource IListSource
ISupportInitializeNotification ISupportInitializeNotification ISupportInitializeNotification
ISupportInitialize ISupportInitialize ISupportInitialize
Iserializable Iserializable Iserializable
IXmlSerializable IXmlSerializable IXmlSerializable

一致:5 / 差:0

フィールド

.NET Framework .NET Stabdard .NET Core
protected internal bool fInitInProgress; protected internal bool fInitInProgress; protected internal bool fInitInProgress;

一致:1 / 差:0

コンストラクタ

.NET Framework .NET Stabdard .NET Core
public DataTable(); public DataTable(); public DataTable();
public DataTable(string tableName); public DataTable(string tableName); public DataTable(string tableName);
public DataTable(string tableName, string tableNamespace); public DataTable(string tableName, string tableNamespace); public DataTable(string tableName, string tableNamespace);
protected DataTable(SerializationInfo info, StreamingContext context); protected DataTable(SerializationInfo info, StreamingContext context); protected DataTable(SerializationInfo info, StreamingContext context);

一致:4 / 差:0

プロパティ

.NET Framework .NET Stabdard .NET Core
public CultureInfo Locale { get; set; } public CultureInfo Locale { get; set; } public CultureInfo Locale { get; set; }
public bool HasErrors { get; } public bool HasErrors { get; } public bool HasErrors { get; }
public PropertyCollection ExtendedProperties { get; } public PropertyCollection ExtendedProperties { get; } public PropertyCollection ExtendedProperties { get; }
public string DisplayExpression { get; set; } public string DisplayExpression { get; set; } public string DisplayExpression { get; set; }
public DataView DefaultView { get; } public DataView DefaultView { get; } public DataView DefaultView { get; }
public DataColumnCollection Columns { get; } public DataColumnCollection Columns { get; } public DataColumnCollection Columns { get; }
public ConstraintCollection Constraints { get; } public ConstraintCollection Constraints { get; } public ConstraintCollection Constraints { get; }
public int MinimumCapacity { get; set; } public int MinimumCapacity { get; set; } public int MinimumCapacity { get; set; }
public DataRelationCollection ChildRelations { get; } public DataRelationCollection ChildRelations { get; } public DataRelationCollection ChildRelations { get; }
public SerializationFormat RemotingFormat { get; set; } public SerializationFormat RemotingFormat { get; set; } public SerializationFormat RemotingFormat { get; set; }
public bool IsInitialized { get; } public bool IsInitialized { get; } public bool IsInitialized { get; }
public DataSet DataSet { get; } public DataSet DataSet { get; } public DataSet DataSet { get; }
public DataRelationCollection ParentRelations { get; } public DataRelationCollection ParentRelations { get; } public DataRelationCollection ParentRelations { get; }
public string TableName { get; set; } public string TableName { get; set; } public string TableName { get; set; }
public DataRowCollection Rows { get; } public DataRowCollection Rows { get; } public DataRowCollection Rows { get; }
public bool CaseSensitive { get; set; } public bool CaseSensitive { get; set; } public bool CaseSensitive { get; set; }
public string Namespace { get; set; } public string Namespace { get; set; } public string Namespace { get; set; }
public string Prefix { get; set; } public string Prefix { get; set; } public string Prefix { get; set; }
public override ISite Site { get; set; } public override ISite Site { get; set; } public override ISite Site { get; set; }
public DataColumn PrimaryKey { get; set; } public DataColumn PrimaryKey { get; set; } public DataColumn PrimaryKey { get; set; }

一致:20 / 差:0

イベント

.NET Framework .NET Stabdard .NET Core
public event DataColumnChangeEventHandler ColumnChanging; public event DataColumnChangeEventHandler ColumnChanging; public event DataColumnChangeEventHandler ColumnChanging;
public event DataColumnChangeEventHandler ColumnChanged; public event DataColumnChangeEventHandler ColumnChanged; public event DataColumnChangeEventHandler ColumnChanged;
public event EventHandler Initialized; public event EventHandler Initialized; public event EventHandler Initialized;
public event DataRowChangeEventHandler RowChanged; public event DataRowChangeEventHandler RowChanged; public event DataRowChangeEventHandler RowChanged;
public event DataRowChangeEventHandler RowChanging; public event DataRowChangeEventHandler RowChanging; public event DataRowChangeEventHandler RowChanging;
public event DataRowChangeEventHandler RowDeleting; public event DataRowChangeEventHandler RowDeleting; public event DataRowChangeEventHandler RowDeleting;
public event DataRowChangeEventHandler RowDeleted; public event DataRowChangeEventHandler RowDeleted; public event DataRowChangeEventHandler RowDeleted;
public event DataTableClearEventHandler TableClearing; public event DataTableClearEventHandler TableClearing; public event DataTableClearEventHandler TableClearing;
public event DataTableClearEventHandler TableCleared; public event DataTableClearEventHandler TableCleared; public event DataTableClearEventHandler TableCleared;
public event DataTableNewRowEventHandler TableNewRow; public event DataTableNewRowEventHandler TableNewRow; public event DataTableNewRowEventHandler TableNewRow;
public static XmlSchemaComplexType GetDataTableSchema(XmlSchemaSet schemaSet); public static XmlSchemaComplexType GetDataTableSchema(XmlSchemaSet schemaSet); public static XmlSchemaComplexType GetDataTableSchema(XmlSchemaSet schemaSet);

一致:11 / 差:0

メソッド

.NET Framework .NET Stabdard .NET Core
public void AcceptChanges(); public void AcceptChanges(); public void AcceptChanges();
public virtual void BeginInit(); public virtual void BeginInit(); public virtual void BeginInit();
public void BeginLoadData(); public void BeginLoadData(); public void BeginLoadData();
public void Clear(); public void Clear(); public void Clear();
public virtual DataTable Clone(); public virtual DataTable Clone(); public virtual DataTable Clone();
public object Compute(string expression, string filter); public object Compute(string expression, string filter); public object Compute(string expression, string filter);
public DataTable Copy(); public DataTable Copy(); public DataTable Copy();
public DataTableReader CreateDataReader(); public DataTableReader CreateDataReader(); public DataTableReader CreateDataReader();
public virtual void EndInit(); public virtual void EndInit(); public virtual void EndInit();
public void EndLoadData(); public void EndLoadData(); public void EndLoadData();
public DataTable GetChanges(DataRowState rowStates); public DataTable GetChanges(DataRowState rowStates); public DataTable GetChanges(DataRowState rowStates);
public DataTable GetChanges(); public DataTable GetChanges(); public DataTable GetChanges();
public DataRow GetErrors(); public DataRow GetErrors(); public DataRow GetErrors();
public virtual void GetObjectData(SerializationInfo info, StreamingContext context); public virtual void GetObjectData(SerializationInfo info, StreamingContext context); public virtual void GetObjectData(SerializationInfo info, StreamingContext context);
public void ImportRow(DataRow row); public void ImportRow(DataRow row); public void ImportRow(DataRow row);
public void Load(IDataReader reader, LoadOption loadOption); public void Load(IDataReader reader, LoadOption loadOption); public void Load(IDataReader reader, LoadOption loadOption);
public void Load(IDataReader reader); public void Load(IDataReader reader); public void Load(IDataReader reader);
public virtual void Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler); public virtual void Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler); public virtual void Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler);
public DataRow LoadDataRow(object values, LoadOption loadOption); public DataRow LoadDataRow(object values, LoadOption loadOption); public DataRow LoadDataRow(object values, LoadOption loadOption);
public DataRow LoadDataRow(object values, bool fAcceptChanges); public DataRow LoadDataRow(object values, bool fAcceptChanges); public DataRow LoadDataRow(object values, bool fAcceptChanges);
public void Merge(DataTable table, bool preserveChanges, MissingSchemaAction missingSchemaAction); public void Merge(DataTable table, bool preserveChanges, MissingSchemaAction missingSchemaAction); public void Merge(DataTable table, bool preserveChanges, MissingSchemaAction missingSchemaAction);
public void Merge(DataTable table, bool preserveChanges); public void Merge(DataTable table, bool preserveChanges); public void Merge(DataTable table, bool preserveChanges);
public void Merge(DataTable table); public void Merge(DataTable table); public void Merge(DataTable table);
public DataRow NewRow(); public DataRow NewRow(); public DataRow NewRow();
public XmlReadMode ReadXml(XmlReader reader); public XmlReadMode ReadXml(XmlReader reader); public XmlReadMode ReadXml(XmlReader reader);
public XmlReadMode ReadXml(string fileName); public XmlReadMode ReadXml(string fileName); public XmlReadMode ReadXml(string fileName);
public XmlReadMode ReadXml(Stream stream); public XmlReadMode ReadXml(Stream stream); public XmlReadMode ReadXml(Stream stream);
public XmlReadMode ReadXml(TextReader reader); public XmlReadMode ReadXml(TextReader reader); public XmlReadMode ReadXml(TextReader reader);
public void ReadXmlSchema(string fileName); public void ReadXmlSchema(string fileName); public void ReadXmlSchema(string fileName);
public void ReadXmlSchema(TextReader reader); public void ReadXmlSchema(TextReader reader); public void ReadXmlSchema(TextReader reader);
public void ReadXmlSchema(Stream stream); public void ReadXmlSchema(Stream stream); public void ReadXmlSchema(Stream stream);
public void ReadXmlSchema(XmlReader reader); public void ReadXmlSchema(XmlReader reader); public void ReadXmlSchema(XmlReader reader);
public void RejectChanges(); public void RejectChanges(); public void RejectChanges();
public virtual void Reset(); public virtual void Reset(); public virtual void Reset();
public DataRow Select(); public DataRow Select(); public DataRow Select();
public DataRow Select(string filterExpression); public DataRow Select(string filterExpression); public DataRow Select(string filterExpression);
public DataRow Select(string filterExpression, string sort); public DataRow Select(string filterExpression, string sort); public DataRow Select(string filterExpression, string sort);
public DataRow Select(string filterExpression, string sort, DataViewRowState recordStates); public DataRow Select(string filterExpression, string sort, DataViewRowState recordStates); public DataRow Select(string filterExpression, string sort, DataViewRowState recordStates);
public override string ToString(); public override string ToString(); public override string ToString();
public void WriteXml(string fileName); public void WriteXml(string fileName); public void WriteXml(string fileName);
public void WriteXml(Stream stream, XmlWriteMode mode); public void WriteXml(Stream stream, XmlWriteMode mode); public void WriteXml(Stream stream, XmlWriteMode mode);
public void WriteXml(string fileName, bool writeHierarchy); public void WriteXml(string fileName, bool writeHierarchy); public void WriteXml(string fileName, bool writeHierarchy);
public void WriteXml(XmlWriter writer, bool writeHierarchy); public void WriteXml(XmlWriter writer, bool writeHierarchy); public void WriteXml(XmlWriter writer, bool writeHierarchy);
public void WriteXml(XmlWriter writer); public void WriteXml(XmlWriter writer); public void WriteXml(XmlWriter writer);
public void WriteXml(TextWriter writer, bool writeHierarchy); public void WriteXml(TextWriter writer, bool writeHierarchy); public void WriteXml(TextWriter writer, bool writeHierarchy);
public void WriteXml(TextWriter writer); public void WriteXml(TextWriter writer); public void WriteXml(TextWriter writer);
public void WriteXml(TextWriter writer, XmlWriteMode mode); public void WriteXml(TextWriter writer, XmlWriteMode mode); public void WriteXml(TextWriter writer, XmlWriteMode mode);
public void WriteXml(XmlWriter writer, XmlWriteMode mode); public void WriteXml(XmlWriter writer, XmlWriteMode mode); public void WriteXml(XmlWriter writer, XmlWriteMode mode);
public void WriteXml(Stream stream, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(Stream stream, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(Stream stream, XmlWriteMode mode, bool writeHierarchy);
public void WriteXml(XmlWriter writer, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(XmlWriter writer, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(XmlWriter writer, XmlWriteMode mode, bool writeHierarchy);
public void WriteXml(string fileName, XmlWriteMode mode); public void WriteXml(string fileName, XmlWriteMode mode); public void WriteXml(string fileName, XmlWriteMode mode);
public void WriteXml(string fileName, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(string fileName, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(string fileName, XmlWriteMode mode, bool writeHierarchy);
public void WriteXml(Stream stream, bool writeHierarchy); public void WriteXml(Stream stream, bool writeHierarchy); public void WriteXml(Stream stream, bool writeHierarchy);
public void WriteXml(Stream stream); public void WriteXml(Stream stream); public void WriteXml(Stream stream);
public void WriteXml(TextWriter writer, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(TextWriter writer, XmlWriteMode mode, bool writeHierarchy); public void WriteXml(TextWriter writer, XmlWriteMode mode, bool writeHierarchy);
public void WriteXmlSchema(TextWriter writer, bool writeHierarchy); public void WriteXmlSchema(TextWriter writer, bool writeHierarchy); public void WriteXmlSchema(TextWriter writer, bool writeHierarchy);
public void WriteXmlSchema(XmlWriter writer); public void WriteXmlSchema(XmlWriter writer); public void WriteXmlSchema(XmlWriter writer);
public void WriteXmlSchema(XmlWriter writer, bool writeHierarchy); public void WriteXmlSchema(XmlWriter writer, bool writeHierarchy); public void WriteXmlSchema(XmlWriter writer, bool writeHierarchy);
public void WriteXmlSchema(string fileName); public void WriteXmlSchema(string fileName); public void WriteXmlSchema(string fileName);
public void WriteXmlSchema(string fileName, bool writeHierarchy); public void WriteXmlSchema(string fileName, bool writeHierarchy); public void WriteXmlSchema(string fileName, bool writeHierarchy);
public void WriteXmlSchema(TextWriter writer); public void WriteXmlSchema(TextWriter writer); public void WriteXmlSchema(TextWriter writer);
public void WriteXmlSchema(Stream stream, bool writeHierarchy); public void WriteXmlSchema(Stream stream, bool writeHierarchy); public void WriteXmlSchema(Stream stream, bool writeHierarchy);
public void WriteXmlSchema(Stream stream); public void WriteXmlSchema(Stream stream); public void WriteXmlSchema(Stream stream);
protected virtual DataTable CreateInstance(); protected virtual DataTable CreateInstance(); protected virtual DataTable CreateInstance();
protected virtual Type GetRowType(); protected virtual Type GetRowType(); protected virtual Type GetRowType();
protected virtual XmlSchema GetSchema(); protected virtual XmlSchema GetSchema(); protected virtual XmlSchema GetSchema();
protected virtual DataRow NewRowFromBuilder(DataRowBuilder builder); protected virtual DataRow NewRowFromBuilder(DataRowBuilder builder); protected virtual DataRow NewRowFromBuilder(DataRowBuilder builder);
protected virtual void OnPropertyChanging(PropertyChangedEventArgs pcevent); protected virtual void OnPropertyChanging(PropertyChangedEventArgs pcevent); protected virtual void OnPropertyChanging(PropertyChangedEventArgs pcevent);
protected virtual void OnRemoveColumn(DataColumn column); protected virtual void OnRemoveColumn(DataColumn column); protected virtual void OnRemoveColumn(DataColumn column);
protected virtual void OnRowChanged(DataRowChangeEventArgs e); protected virtual void OnRowChanged(DataRowChangeEventArgs e); protected virtual void OnRowChanged(DataRowChangeEventArgs e);
protected virtual void OnRowChanging(DataRowChangeEventArgs e); protected virtual void OnRowChanging(DataRowChangeEventArgs e); protected virtual void OnRowChanging(DataRowChangeEventArgs e);
protected virtual void OnRowDeleted(DataRowChangeEventArgs e); protected virtual void OnRowDeleted(DataRowChangeEventArgs e); protected virtual void OnRowDeleted(DataRowChangeEventArgs e);
protected virtual void OnRowDeleting(DataRowChangeEventArgs e); protected virtual void OnRowDeleting(DataRowChangeEventArgs e); protected virtual void OnRowDeleting(DataRowChangeEventArgs e);
protected virtual void OnTableCleared(DataTableClearEventArgs e); protected virtual void OnTableCleared(DataTableClearEventArgs e); protected virtual void OnTableCleared(DataTableClearEventArgs e);
protected virtual void OnTableClearing(DataTableClearEventArgs e); protected virtual void OnTableClearing(DataTableClearEventArgs e); protected virtual void OnTableClearing(DataTableClearEventArgs e);
protected virtual void OnTableNewRow(DataTableNewRowEventArgs e); protected virtual void OnTableNewRow(DataTableNewRowEventArgs e); protected virtual void OnTableNewRow(DataTableNewRowEventArgs e);
protected virtual void ReadXmlSerializable(XmlReader reader); protected virtual void ReadXmlSerializable(XmlReader reader); protected virtual void ReadXmlSerializable(XmlReader reader);
protected internal DataRow NewRowArray(int size); protected internal DataRow NewRowArray(int size); protected internal DataRow[] NewRowArray(int size);
protected internal virtual void OnColumnChanged(DataColumnChangeEventArgs e); protected internal virtual void OnColumnChanged(DataColumnChangeEventArgs e); protected internal virtual void OnColumnChanged(DataColumnChangeEventArgs e);
protected internal virtual void OnColumnChanging(DataColumnChangeEventArgs e); protected internal virtual void OnColumnChanging(DataColumnChangeEventArgs e); protected internal virtual void OnColumnChanging(DataColumnChangeEventArgs e);

一致:80 / 差:0

■ 合計

完全に一致!

一致:122 / 差:0
という結果(多分)になりました。

古くからの .NET Framework ユーザーには DataTable を愛している方も多いですが、これなら安心ですね!

ただし、今回は DataTable クラスだけを比較しています。実は、DataTable に関する機能はそれだけでは語り切れないのでそのあたりは、今後また確認して行こうと思います。