投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/8/13 18:20:15
> Ds.Relations.Add("Rel消費税課税", dt2.Columns("Key"), dt1.Columns("消費税課税"), True)
> 「親列および子列に型が一致する列が含まれていません。」
> というエラーメッセージ」が現れます。

dt2 の Key 列と、dt1 の 消費税課税 列の型が一致しているかを確認して下さい。
たとえば、Integer の「100」と Decimal の「100」は別物となります。
データベース側の列の型ではなく、DataTable 上の列の型を確認するという点に注意して下さい。

Dim ds As New DataSet()
Dim dt1 = ds.Tables.Add()
Dim dt2 = ds.Tables.Add()
dt2.PrimaryKey = New DataColumn() { dt2.Columns.Add("Key"GetType(Integer)) }
dt1.Columns.Add("消費税課税"GetType(Decimal))  '違う型にしてみる 

' System.Data.InvalidConstraintException: 
' 「親列および子列に型が一致する列が含まれていません。」 
ds.Relations.Add("Rel消費税課税", dt2.Columns("Key"), dt1.Columns("消費税課税"), True)


なお上記では、単一列を主キーとしたリレーションを貼っていますが、複合キーとなる場合には、
列指定の部分を、DataColumn の配列として渡すことも出来ます。


> dt1.TableName = "クエリ1"
TableName は後付でも構いません。実際の環境に沿った名前をつけましょう。
(特に指定しなければ、DataSet に割り当てられる際に自動的に命名されます)


> Da.Fill(Ds, Rs, dt1.TableName)

OleDbDataAdapter.Fill( DataSet, Recordset, TableName ) のかわりに
OleDbDataAdapter.Fill( DataTable, Recordset ) を使うこともできます。
後者は、階層型 Recordset の展開にも使えます。

なお、既にデータの入っている DataTable に追加格納する場合には、
実行前に OleDbDataAdapte.MissingSchemaAction プロパティの値を調整しておいてください。


> Rs = New ADODB.Recordset

可能であれば、ADO.NET のみでの操作に揃える事をお奨めします。
.NET 環境における ADO の併用は推奨されていません。


.NET での ADO の使用に関するロードマップ
http://j.mp/KB308044JP
》 ADO および ADO MD は、Microsoft .NET Framework 環境で十分にはテストされていません。
》 特に、サービスベースのアプリケーションまたはマルチスレッド アプリケーションでは、
》 断続的に問題が発生することがあります。


[FIX] 高負荷下で ADO を .NET COM interop または Java で使用するとアクセス違反が発生する
http://j.mp/KB321415JP
》  以下の 2 つのコーディング例を使用することで、この問題が発生する可能性を低く抑えることができます。
》 ・ COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する。 (Marshal.ReleaseComObject)
》 ・ ADO プライマリ相互運用アセンブリ (primary interop assembly) を使用する。 


上記で、プライマリ相互運用アセンブリ (PIA) を使うように案内されていますが、
ADO の場合、IA と PIA とでオブジェクト解放の手順が異なることに注意して下さい。

たとえば、普段、Recordset の Fields オブジェクトの存在を意識することは少ないかもしれませんが、
IA の場合は、これを 「ReleaseComObject しなければいけない」とされていますし、
PIA の場合は逆に、 「ReleaseComObject してはいけない(できない)」という違いがあります。
※ Recordset や Connection については、ReleaseComObject する必要あり。