diff --git a/src/libraries/System.Data.OleDb/src/OleDbCommand.cs b/src/libraries/System.Data.OleDb/src/OleDbCommand.cs index 0f8581f708e582..23d7124e8434ee 100644 --- a/src/libraries/System.Data.OleDb/src/OleDbCommand.cs +++ b/src/libraries/System.Data.OleDb/src/OleDbCommand.cs @@ -411,14 +411,38 @@ private void CreateAccessor() _dbBindings = bindings; } - private void ApplyParameterBindings(UnsafeNativeMethods.ICommandWithParameters commandWithParameters, tagDBPARAMBINDINFO[] bindInfo) + private unsafe void ApplyParameterBindings(UnsafeNativeMethods.ICommandWithParameters commandWithParameters, tagDBPARAMBINDINFO[] bindInfo) { IntPtr[] ordinals = new IntPtr[bindInfo.Length]; for (int i = 0; i < ordinals.Length; ++i) { ordinals[i] = (IntPtr)(i + 1); } - OleDbHResult hr = commandWithParameters.SetParameterInfo((IntPtr)bindInfo.Length, ordinals, bindInfo); + + OleDbHResult hr; + + if (ODB.IsRunningOnX86) + { + tagDBPARAMBINDINFO_x86[] bindInfo_x86 = new tagDBPARAMBINDINFO_x86[bindInfo.Length]; + for (int i = 0; i < bindInfo.Length; i++) + { + fixed (tagDBPARAMBINDINFO* p = &bindInfo[i]) + { + bindInfo_x86[i] = *(tagDBPARAMBINDINFO_x86*)p; + } + } + fixed (tagDBPARAMBINDINFO_x86* p = &bindInfo_x86[0]) + { + hr = commandWithParameters.SetParameterInfo((IntPtr)bindInfo.Length, ordinals, (IntPtr)p); + } + } + else + { + fixed (tagDBPARAMBINDINFO* p = &bindInfo[0]) + { + hr = commandWithParameters.SetParameterInfo((IntPtr)bindInfo.Length, ordinals, (IntPtr)p); + } + } if (hr < 0) { diff --git a/src/libraries/System.Data.OleDb/src/OleDbStruct.cs b/src/libraries/System.Data.OleDb/src/OleDbStruct.cs index 1254602394db7a..2dfff4fc61101e 100644 --- a/src/libraries/System.Data.OleDb/src/OleDbStruct.cs +++ b/src/libraries/System.Data.OleDb/src/OleDbStruct.cs @@ -33,11 +33,36 @@ typedef struct tagDBPARAMBINDINFO { } #endif -#if (WIN32 && !ARCH_arm) - [StructLayoutAttribute(LayoutKind.Sequential, Pack = 2)] -#else - [StructLayout(LayoutKind.Sequential, Pack = 8)] + + [StructLayout(LayoutKind.Sequential, Pack = 2)] + internal struct tagDBPARAMBINDINFO_x86 + { + internal IntPtr pwszDataSourceType; + internal IntPtr pwszName; + internal IntPtr ulParamSize; + internal int dwFlags; + internal byte bPrecision; + internal byte bScale; + +#if DEBUG + public override string ToString() + { + StringBuilder builder = new StringBuilder(); + builder.Append("tagDBPARAMBINDINFO_x86").Append(Environment.NewLine); + if (IntPtr.Zero != pwszDataSourceType) + { + builder.Append("pwszDataSourceType =").Append(Marshal.PtrToStringUni(pwszDataSourceType)).Append(Environment.NewLine); + } + builder.Append("\tulParamSize =" + ulParamSize.ToInt64().ToString(CultureInfo.InvariantCulture)).Append(Environment.NewLine); + builder.Append("\tdwFlags =0x" + dwFlags.ToString("X4", CultureInfo.InvariantCulture)).Append(Environment.NewLine); + builder.Append("\tPrecision =" + bPrecision.ToString(CultureInfo.InvariantCulture)).Append(Environment.NewLine); + builder.Append("\tScale =" + bScale.ToString(CultureInfo.InvariantCulture)).Append(Environment.NewLine); + return builder.ToString(); + } #endif + } + + [StructLayout(LayoutKind.Sequential, Pack = 8)] internal struct tagDBPARAMBINDINFO { internal IntPtr pwszDataSourceType; diff --git a/src/libraries/System.Data.OleDb/src/OleDb_Util.cs b/src/libraries/System.Data.OleDb/src/OleDb_Util.cs index 0d68b7a11d0fb4..5487ba68852fb0 100644 --- a/src/libraries/System.Data.OleDb/src/OleDb_Util.cs +++ b/src/libraries/System.Data.OleDb/src/OleDb_Util.cs @@ -687,6 +687,8 @@ internal static InvalidOperationException IDBInfoNotSupported() internal const string DbInfoKeywords = "DbInfoKeywords"; internal const string Keyword = "Keyword"; + internal static readonly bool IsRunningOnX86 = RuntimeInformation.ProcessArchitecture == Architecture.X86; + // Debug error string writeline internal static string ELookup(OleDbHResult hr) { diff --git a/src/libraries/System.Data.OleDb/src/UnsafeNativeMethods.cs b/src/libraries/System.Data.OleDb/src/UnsafeNativeMethods.cs index d18c574731bcff..07df57c6c14831 100644 --- a/src/libraries/System.Data.OleDb/src/UnsafeNativeMethods.cs +++ b/src/libraries/System.Data.OleDb/src/UnsafeNativeMethods.cs @@ -409,7 +409,7 @@ HRESULT SetParameterInfo( System.Data.OleDb.OleDbHResult SetParameterInfo( [In] IntPtr cParams, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] rgParamOrdinals, - [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Struct)] System.Data.OleDb.tagDBPARAMBINDINFO[] rgParamBindInfo); + [In] IntPtr rgParamBindInfo); } [Guid("2206CCB1-19C1-11D1-89E0-00C04FD7A829"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComImport, SuppressUnmanagedCodeSecurity]