OleDbParameter.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. //
  2. // System.Data.OleDb.OleDbParameter
  3. //
  4. // Authors:
  5. // Rodrigo Moya ([email protected])
  6. // Tim Coleman ([email protected])
  7. //
  8. // Copyright (C) Rodrigo Moya, 2002
  9. // Copyright (C) Tim Coleman, 2002
  10. //
  11. //
  12. // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
  13. //
  14. // Permission is hereby granted, free of charge, to any person obtaining
  15. // a copy of this software and associated documentation files (the
  16. // "Software"), to deal in the Software without restriction, including
  17. // without limitation the rights to use, copy, modify, merge, publish,
  18. // distribute, sublicense, and/or sell copies of the Software, and to
  19. // permit persons to whom the Software is furnished to do so, subject to
  20. // the following conditions:
  21. //
  22. // The above copyright notice and this permission notice shall be
  23. // included in all copies or substantial portions of the Software.
  24. //
  25. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  26. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  27. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  28. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  29. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  30. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  31. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  32. //
  33. using System;
  34. using System.Data;
  35. using System.Data.Common;
  36. using System.ComponentModel;
  37. namespace System.Data.OleDb
  38. {
  39. #if NET_2_0
  40. [TypeConverterAttribute ("System.Data.OleDb.OleDbParameter+OleDbParameterConverter, " + Consts.AssemblySystem_Data)]
  41. public sealed class OleDbParameter : DbParameter, IDbDataParameter, ICloneable
  42. #else
  43. [TypeConverterAttribute (typeof (OleDbParameterConverter))]
  44. public sealed class OleDbParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
  45. #endif
  46. {
  47. #region Fields
  48. string name;
  49. object value;
  50. int size;
  51. bool isNullable;
  52. byte precision;
  53. byte scale;
  54. DataRowVersion sourceVersion;
  55. string sourceColumn;
  56. #if NET_2_0
  57. bool sourceColumnNullMapping;
  58. #endif
  59. ParameterDirection direction;
  60. OleDbType oleDbType;
  61. DbType dbType;
  62. OleDbParameterCollection container;
  63. IntPtr gdaParameter;
  64. #endregion
  65. #region Constructors
  66. public OleDbParameter ()
  67. {
  68. name = String.Empty;
  69. size = 0;
  70. isNullable = true;
  71. precision = 0;
  72. scale = 0;
  73. sourceColumn = String.Empty;
  74. gdaParameter = IntPtr.Zero;
  75. }
  76. public OleDbParameter (string name, object value)
  77. : this ()
  78. {
  79. this.name = name;
  80. this.value = value;
  81. OleDbType = GetOleDbType (value);
  82. }
  83. public OleDbParameter (string name, OleDbType dataType)
  84. : this ()
  85. {
  86. this.name = name;
  87. OleDbType = dataType;
  88. }
  89. public OleDbParameter (string name, OleDbType dataType, int size)
  90. : this (name, dataType)
  91. {
  92. this.size = size;
  93. }
  94. public OleDbParameter (string name, OleDbType dataType, int size, string srcColumn)
  95. : this (name, dataType, size)
  96. {
  97. this.sourceColumn = srcColumn;
  98. }
  99. [EditorBrowsableAttribute (EditorBrowsableState.Advanced)]
  100. public OleDbParameter(string name, OleDbType dataType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
  101. : this (name, dataType, size, srcColumn)
  102. {
  103. this.direction = direction;
  104. this.isNullable = isNullable;
  105. this.precision = precision;
  106. this.scale = scale;
  107. this.sourceVersion = srcVersion;
  108. this.value = value;
  109. }
  110. #if NET_2_0
  111. [EditorBrowsable (EditorBrowsableState.Advanced)]
  112. public OleDbParameter (string name, OleDbType dataType, int size, ParameterDirection direction, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, bool sourceColumnNullMapping, object value)
  113. : this (name, dataType, size, srcColumn)
  114. {
  115. this.direction = direction;
  116. this.precision = precision;
  117. this.scale = scale;
  118. this.sourceVersion = srcVersion;
  119. this.sourceColumnNullMapping = sourceColumnNullMapping;
  120. this.value = value;
  121. }
  122. #endif
  123. #endregion
  124. #region Properties
  125. #if !NET_2_0
  126. [BrowsableAttribute (false)]
  127. [DataSysDescriptionAttribute ("The parameter generic type.")]
  128. [RefreshPropertiesAttribute (RefreshProperties.All)]
  129. [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
  130. #endif
  131. [DataCategory ("DataCategory_Data")]
  132. public
  133. #if NET_2_0
  134. override
  135. #endif
  136. DbType DbType {
  137. get { return dbType; }
  138. set {
  139. dbType = value;
  140. oleDbType = DbTypeToOleDbType (value);
  141. }
  142. }
  143. #if NET_2_0
  144. [RefreshProperties (RefreshProperties.All)]
  145. #else
  146. [DataSysDescriptionAttribute ("Input, output, or bidirectional parameter.")]
  147. [DefaultValue (ParameterDirection.Input)]
  148. #endif
  149. [DataCategory ("DataCategory_Data")]
  150. public
  151. #if NET_2_0
  152. override
  153. #endif
  154. ParameterDirection Direction {
  155. get { return direction; }
  156. set { direction = value; }
  157. }
  158. #if !NET_2_0
  159. [BrowsableAttribute (false)]
  160. [DataSysDescriptionAttribute ("a design-time property used for strongly typed code-generation.")]
  161. [DesignOnlyAttribute (true)]
  162. [EditorBrowsableAttribute (EditorBrowsableState.Advanced)]
  163. [DefaultValue (false)]
  164. #endif
  165. public
  166. #if NET_2_0
  167. override
  168. #endif
  169. bool IsNullable {
  170. get { return isNullable; }
  171. set { isNullable = value; }
  172. }
  173. #if NET_2_0
  174. [DbProviderSpecificTypeProperty (true)]
  175. #else
  176. [DefaultValue (OleDbType.VarWChar)]
  177. [DataSysDescriptionAttribute ("The parameter native type.")]
  178. #endif
  179. [RefreshPropertiesAttribute (RefreshProperties.All)]
  180. [DataCategory ("DataCategory_Data")]
  181. public OleDbType OleDbType {
  182. get { return oleDbType; }
  183. set {
  184. oleDbType = value;
  185. dbType = OleDbTypeToDbType (value);
  186. }
  187. }
  188. #if !NET_2_0
  189. [DefaultValue ("")]
  190. [DataSysDescriptionAttribute ("Name of the parameter.")]
  191. #endif
  192. public
  193. #if NET_2_0
  194. override
  195. #endif
  196. string ParameterName {
  197. get { return name; }
  198. set { name = value; }
  199. }
  200. [DefaultValue (0)]
  201. #if !NET_2_0
  202. [DataSysDescriptionAttribute ("For decimal, numeric, varnumeric DBTypes.")]
  203. #endif
  204. [DataCategory ("DataCategory_Data")]
  205. public byte Precision {
  206. get { return precision; }
  207. set { precision = value; }
  208. }
  209. [DefaultValue (0)]
  210. #if !NET_2_0
  211. [DataSysDescriptionAttribute ("For decimal, numeric, varnumeric DBTypes.")]
  212. #endif
  213. [DataCategory ("DataCategory_Data")]
  214. public byte Scale {
  215. get { return scale; }
  216. set { scale = value; }
  217. }
  218. #if !NET_2_0
  219. [DefaultValue (0)]
  220. [DataSysDescriptionAttribute ("Size of variable length data types (string & arrays).")]
  221. #endif
  222. [DataCategory ("DataCategory_Data")]
  223. public
  224. #if NET_2_0
  225. override
  226. #endif
  227. int Size {
  228. get { return size; }
  229. set { size = value; }
  230. }
  231. #if !NET_2_0
  232. [DefaultValue ("")]
  233. [DataSysDescriptionAttribute ("When used by a DataAdapter.Update, the source column name that is used to find the DataSetColumn name in the ColumnMappings. This is to copy a value between the parameter and a datarow.")]
  234. #endif
  235. [DataCategory ("DataCategory_Data")]
  236. public
  237. #if NET_2_0
  238. override
  239. #endif
  240. string SourceColumn {
  241. get { return sourceColumn; }
  242. set { sourceColumn = value; }
  243. }
  244. #if NET_2_0
  245. public override bool SourceColumnNullMapping {
  246. get {
  247. return sourceColumnNullMapping;
  248. } set {
  249. sourceColumnNullMapping = value;
  250. }
  251. }
  252. #endif
  253. #if !NET_2_0
  254. [DefaultValue (DataRowVersion.Current)]
  255. [DataSysDescriptionAttribute ("When used by a DataAdapter.Update (UpdateCommand only), the version of the DataRow value that is used to update the data source.")]
  256. #endif
  257. [DataCategory ("DataCategory_Data")]
  258. public
  259. #if NET_2_0
  260. override
  261. #endif
  262. DataRowVersion SourceVersion {
  263. get { return sourceVersion; }
  264. set { sourceVersion = value; }
  265. }
  266. #if NET_2_0
  267. [RefreshPropertiesAttribute (RefreshProperties.All)]
  268. #else
  269. [DefaultValue (null)]
  270. [DataSysDescriptionAttribute ("Value of the parameter.")]
  271. #endif
  272. [TypeConverter (typeof (StringConverter))]
  273. [DataCategory ("DataCategory_Data")]
  274. public
  275. #if NET_2_0
  276. override
  277. #endif
  278. object Value {
  279. get { return value; }
  280. set { this.value = value; }
  281. }
  282. // Used to ensure that only one collection can contain this
  283. // parameter
  284. internal OleDbParameterCollection Container {
  285. get { return container; }
  286. set { container = value; }
  287. }
  288. #endregion // Properties
  289. #region Internal Properties
  290. internal IntPtr GdaParameter {
  291. get { return gdaParameter; }
  292. }
  293. #endregion // Internal Properties
  294. #region Methods
  295. [MonoTODO]
  296. object ICloneable.Clone ()
  297. {
  298. throw new NotImplementedException ();
  299. }
  300. #if NET_2_0
  301. public override void ResetDbType ()
  302. {
  303. ResetOleDbType ();
  304. }
  305. public void ResetOleDbType ()
  306. {
  307. oleDbType = GetOleDbType (Value);
  308. dbType = OleDbTypeToDbType (oleDbType);
  309. }
  310. #endif
  311. public override string ToString ()
  312. {
  313. return ParameterName;
  314. }
  315. private OleDbType DbTypeToOleDbType (DbType dbType)
  316. {
  317. switch (dbType) {
  318. case DbType.AnsiString :
  319. return OleDbType.VarChar;
  320. case DbType.AnsiStringFixedLength :
  321. return OleDbType.Char;
  322. case DbType.Binary :
  323. return OleDbType.Binary;
  324. case DbType.Boolean :
  325. return OleDbType.Boolean;
  326. case DbType.Byte :
  327. return OleDbType.UnsignedTinyInt;
  328. case DbType.Currency :
  329. return OleDbType.Currency;
  330. case DbType.Date :
  331. return OleDbType.Date;
  332. case DbType.DateTime :
  333. throw new NotImplementedException ();
  334. case DbType.Decimal :
  335. return OleDbType.Decimal;
  336. case DbType.Double :
  337. return OleDbType.Double;
  338. case DbType.Guid :
  339. return OleDbType.Guid;
  340. case DbType.Int16 :
  341. return OleDbType.SmallInt;
  342. case DbType.Int32 :
  343. return OleDbType.Integer;
  344. case DbType.Int64 :
  345. return OleDbType.BigInt;
  346. case DbType.Object :
  347. return OleDbType.Variant;
  348. case DbType.SByte :
  349. return OleDbType.TinyInt;
  350. case DbType.Single :
  351. return OleDbType.Single;
  352. case DbType.String :
  353. return OleDbType.WChar;
  354. case DbType.StringFixedLength :
  355. return OleDbType.VarWChar;
  356. case DbType.Time :
  357. throw new NotImplementedException ();
  358. case DbType.UInt16 :
  359. return OleDbType.UnsignedSmallInt;
  360. case DbType.UInt32 :
  361. return OleDbType.UnsignedInt;
  362. case DbType.UInt64 :
  363. return OleDbType.UnsignedBigInt;
  364. case DbType.VarNumeric :
  365. return OleDbType.VarNumeric;
  366. }
  367. return OleDbType.Variant;
  368. }
  369. private DbType OleDbTypeToDbType (OleDbType oleDbType)
  370. {
  371. switch (oleDbType) {
  372. case OleDbType.BigInt :
  373. return DbType.Int64;
  374. case OleDbType.Binary :
  375. return DbType.Binary;
  376. case OleDbType.Boolean :
  377. return DbType.Boolean;
  378. case OleDbType.BSTR :
  379. return DbType.AnsiString;
  380. case OleDbType.Char :
  381. return DbType.AnsiStringFixedLength;
  382. case OleDbType.Currency :
  383. return DbType.Currency;
  384. case OleDbType.Date :
  385. return DbType.DateTime;
  386. case OleDbType.DBDate :
  387. return DbType.DateTime;
  388. case OleDbType.DBTime :
  389. throw new NotImplementedException ();
  390. case OleDbType.DBTimeStamp :
  391. return DbType.DateTime;
  392. case OleDbType.Decimal :
  393. return DbType.Decimal;
  394. case OleDbType.Double :
  395. return DbType.Double;
  396. case OleDbType.Empty :
  397. throw new NotImplementedException ();
  398. case OleDbType.Error :
  399. throw new NotImplementedException ();
  400. case OleDbType.Filetime :
  401. return DbType.DateTime;
  402. case OleDbType.Guid :
  403. return DbType.Guid;
  404. case OleDbType.IDispatch :
  405. return DbType.Object;
  406. case OleDbType.Integer :
  407. return DbType.Int32;
  408. case OleDbType.IUnknown :
  409. return DbType.Object;
  410. case OleDbType.LongVarBinary :
  411. return DbType.Binary;
  412. case OleDbType.LongVarChar :
  413. return DbType.AnsiString;
  414. case OleDbType.LongVarWChar :
  415. return DbType.String;
  416. case OleDbType.Numeric :
  417. return DbType.Decimal;
  418. case OleDbType.PropVariant :
  419. return DbType.Object;
  420. case OleDbType.Single :
  421. return DbType.Single;
  422. case OleDbType.SmallInt :
  423. return DbType.Int16;
  424. case OleDbType.TinyInt :
  425. return DbType.SByte;
  426. case OleDbType.UnsignedBigInt :
  427. return DbType.UInt64;
  428. case OleDbType.UnsignedInt :
  429. return DbType.UInt32;
  430. case OleDbType.UnsignedSmallInt :
  431. return DbType.UInt16;
  432. case OleDbType.UnsignedTinyInt :
  433. return DbType.Byte;
  434. case OleDbType.VarBinary :
  435. return DbType.Binary;
  436. case OleDbType.VarChar :
  437. return DbType.AnsiString;
  438. case OleDbType.Variant :
  439. return DbType.Object;
  440. case OleDbType.VarNumeric :
  441. return DbType.VarNumeric;
  442. case OleDbType.VarWChar :
  443. return DbType.StringFixedLength;
  444. case OleDbType.WChar :
  445. return DbType.String;
  446. }
  447. return DbType.Object;
  448. }
  449. private OleDbType GetOleDbType (object value)
  450. {
  451. if (value is Guid) return OleDbType.Guid;
  452. if (value is TimeSpan) return OleDbType.DBTime;
  453. switch (Type.GetTypeCode (value.GetType ())) {
  454. case TypeCode.Boolean :
  455. return OleDbType.Boolean;
  456. case TypeCode.Byte :
  457. if (value.GetType().IsArray)
  458. return OleDbType.Binary;
  459. else
  460. return OleDbType.UnsignedTinyInt;
  461. case TypeCode.Char :
  462. return OleDbType.Char;
  463. case TypeCode.DateTime :
  464. return OleDbType.Date;
  465. case TypeCode.DBNull :
  466. return OleDbType.Empty;
  467. case TypeCode.Decimal :
  468. return OleDbType.Decimal;
  469. case TypeCode.Double :
  470. return OleDbType.Double;
  471. case TypeCode.Empty :
  472. return OleDbType.Empty;
  473. case TypeCode.Int16 :
  474. return OleDbType.SmallInt;
  475. case TypeCode.Int32 :
  476. return OleDbType.Integer;
  477. case TypeCode.Int64 :
  478. return OleDbType.BigInt;
  479. case TypeCode.SByte :
  480. return OleDbType.TinyInt;
  481. case TypeCode.String :
  482. return OleDbType.VarChar;
  483. case TypeCode.Single :
  484. return OleDbType.Single;
  485. case TypeCode.UInt64 :
  486. return OleDbType.UnsignedBigInt;
  487. case TypeCode.UInt32 :
  488. return OleDbType.UnsignedInt;
  489. case TypeCode.UInt16 :
  490. return OleDbType.UnsignedSmallInt;
  491. case TypeCode.Object :
  492. return OleDbType.Variant;
  493. }
  494. return OleDbType.IUnknown;
  495. }
  496. #endregion
  497. }
  498. }