Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions src/libraries/System.Data.OleDb/src/OleDbCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ public sealed class OleDbCommand : DbCommand, ICloneable, IDbCommand
private int _changeID;
private int _lastChangeID;

private static readonly bool s_runningOnX86 = RuntimeInformation.ProcessArchitecture == Architecture.X86;

public OleDbCommand() : base()
{
GC.SuppressFinalize(this);
Expand Down Expand Up @@ -411,14 +413,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 (s_runningOnX86)
{
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)Marshal.PtrToStructure((IntPtr)p, typeof(tagDBPARAMBINDINFO_x86));
Comment thread
saurabh500 marked this conversation as resolved.
Outdated
}
}
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)
{
Expand Down
33 changes: 29 additions & 4 deletions src/libraries/System.Data.OleDb/src/OleDbStruct.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/libraries/System.Data.OleDb/src/UnsafeNativeMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down