private void CreateAccessor() { Debug.Assert(System.Data.CommandType.Text == CommandType || System.Data.CommandType.StoredProcedure == CommandType, "CreateAccessor: incorrect CommandType"); Debug.Assert(null == _dbBindings, "CreateAccessor: already has dbBindings"); Debug.Assert(HasParameters(), "CreateAccessor: unexpected, no parameter collection"); // do this first in-case the command doesn't support parameters UnsafeNativeMethods.ICommandWithParameters commandWithParameters = ICommandWithParameters(); OleDbParameterCollection collection = _parameters !; OleDbParameter[] parameters = new OleDbParameter[collection.Count]; collection.CopyTo(parameters, 0); // _dbBindings is used as a switch during ExecuteCommand, so don't set it until everything okay Bindings bindings = new Bindings(parameters, collection.ChangeID); for (int i = 0; i < parameters.Length; ++i) { bindings.ForceRebind |= parameters[i].BindParameter(i, bindings); } bindings.AllocateForAccessor(null, 0, 0); ApplyParameterBindings(commandWithParameters, bindings.BindInfo !); UnsafeNativeMethods.IAccessor iaccessor = IAccessor(); OleDbHResult hr = bindings.CreateAccessor(iaccessor, ODB.DBACCESSOR_PARAMETERDATA); if (hr < 0) { ProcessResults(hr); } _dbBindings = bindings; }
// optional interface, unsafe cast private UnsafeNativeMethods.ICommandWithParameters ICommandWithParameters() { Debug.Assert(null != _icommandText, "ICommandWithParameters: null ICommandText"); UnsafeNativeMethods.ICommandWithParameters value = (_icommandText as UnsafeNativeMethods.ICommandWithParameters); if (null == value) { throw ODB.NoProviderSupportForParameters(_connection.Provider, (Exception)null); } return(value); }
private 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); if (hr < 0) { ProcessResults(hr); } }
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; 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) { ProcessResults(hr); } }