C# (COM 技術) で Ole Db プロバイダーを作成します。
Ole Db プロバイダーは .NET DLL です。
InvalidCastException に問題があります: 追加情報: 「MyOleDbProvider.RowsetObject」を「IRowset」型にキャストできません。
この問題は、 Ole Db Clientから 'GetRowset' メソッドを実行するときに発生します。msdn で:
HRESULT GetRowset (IUnknown *pUnkOuter,
REFGUID rguidSchema,
ULONG cRestrictions,
const VARIANT rgRestrictions[],
REFIID riid,
ULONG cPropertySets,
DBPROPSET rgPropertySets[],
IUnknown **ppRowset);
「GetRowset」を次のように変換しました
[PreserveSig]
HRESULT GetRowset(
[In] IntPtr pUnkOuter,
[In] ref Guid rguidSchema,
[In] int cRestrictions,
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] object[] rgRestrictions,
[In] ref Guid riid,
[In] int cProperties,
[In] IntPtr rgPropertySets,
[Out, MarshalAs(UnmanagedType.Interface, IidParameterIndex = 4)] out object ppRowset);
実装:
HRESULT IDBSchemaRowset.GetRowset(IntPtr pUnkOuter, ref Guid rguidSchema, int cRestrictions, object[] rgRestrictions,
ref Guid riid, int cProperties, IntPtr rgPropertySets, out object ppRowset)
{
// not significantly begin
...
// not significantly end
var rowsetObject = new RowsetObject(rguidSchema);
if (pUnkOuter == IntPtr.Zero)
{
// always here
ppRowset = rowsetObject;
return HRESULT.S_OK;
}
else
{
ppRowset = rowsetObject.AggregateIn(pUnkOuter);
}
return HRESULT.S_OK;
}
ppRowsetを渡すとInvalidCastException が発生します。
public class RowsetObject : IRowset
{
...
}
[ComImport]
[Guid("0C733A7C-2A1C-11CE-ADE5-00AA0044773D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IRowset
{
...
}
この問題は、クライアントが .NET クライアントの場合にのみ発生します。.NET クライアントは System.Data.OleDb 名前空間を使用します。クライアントがネイティブ クライアントであれば問題ありません。