DbParameterHelper.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. //------------------------------------------------------------------------------
  2. // <copyright file="DbParameterHelper.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">[....]</owner>
  6. //------------------------------------------------------------------------------
  7. namespace NAMESPACE {
  8. using System;
  9. using System.ComponentModel;
  10. using System.Data;
  11. using System.Data.Common;
  12. using System.Globalization;
  13. public sealed partial class PARAMETEROBJECTNAME : DbParameter { // V1.2.3300
  14. private object _value;
  15. private object _parent;
  16. private ParameterDirection _direction;
  17. private int _size;
  18. #if USEOFFSET // USEOFFSET is set in makefile.inc for SqlParameter class only
  19. private int _offset;
  20. #endif
  21. private string _sourceColumn;
  22. private DataRowVersion _sourceVersion;
  23. private bool _sourceColumnNullMapping;
  24. private bool _isNullable;
  25. private object _coercedValue;
  26. private PARAMETEROBJECTNAME(PARAMETEROBJECTNAME source) : this() { // V1.2.3300, Clone
  27. ADP.CheckArgumentNull(source, "source");
  28. source.CloneHelper(this);
  29. ICloneable cloneable = (_value as ICloneable);
  30. if (null != cloneable) { // MDAC 49322
  31. _value = cloneable.Clone();
  32. }
  33. }
  34. private object CoercedValue { // V1.2.3300
  35. get {
  36. return _coercedValue;
  37. }
  38. set {
  39. _coercedValue = value;
  40. }
  41. }
  42. [
  43. RefreshProperties(RefreshProperties.All),
  44. RESNAMESPACE.ResCategoryAttribute(Res.DataCategory_Data),
  45. RESNAMESPACE.ResDescriptionAttribute(Res.DbParameter_Direction),
  46. ]
  47. override public ParameterDirection Direction { // V1.2.3300, XXXParameter V1.0.3300
  48. get {
  49. ParameterDirection direction = _direction;
  50. return ((0 != direction) ? direction : ParameterDirection.Input);
  51. }
  52. set {
  53. if (_direction != value) {
  54. switch (value) { // @perfnote: Enum.IsDefined
  55. case ParameterDirection.Input:
  56. case ParameterDirection.Output:
  57. case ParameterDirection.InputOutput:
  58. case ParameterDirection.ReturnValue:
  59. PropertyChanging();
  60. _direction = value;
  61. break;
  62. default:
  63. throw ADP.InvalidParameterDirection(value);
  64. }
  65. }
  66. }
  67. }
  68. override public bool IsNullable { // V1.2.3300, XXXParameter V1.0.3300
  69. get {
  70. return _isNullable;
  71. }
  72. set {
  73. _isNullable = value;
  74. }
  75. }
  76. #if USEOFFSET
  77. [
  78. Browsable(false),
  79. EditorBrowsableAttribute(EditorBrowsableState.Advanced), // MDAC 69508
  80. RESNAMESPACE.ResCategoryAttribute(Res.DataCategory_Data),
  81. RESNAMESPACE.ResDescriptionAttribute(Res.DbParameter_Offset),
  82. ]
  83. public int Offset {
  84. get {
  85. return _offset;
  86. }
  87. set {
  88. if (value < 0) {
  89. throw ADP.InvalidOffsetValue(value);
  90. }
  91. _offset = value;
  92. }
  93. }
  94. #else
  95. internal int Offset {
  96. get {
  97. return 0;
  98. }
  99. }
  100. #endif
  101. [
  102. RESNAMESPACE.ResCategoryAttribute(Res.DataCategory_Data),
  103. RESNAMESPACE.ResDescriptionAttribute(Res.DbParameter_Size),
  104. ]
  105. override public int Size { // V1.2.3300, XXXParameter V1.0.3300
  106. get {
  107. int size = _size;
  108. if (0 == size) {
  109. size = ValueSize(Value);
  110. }
  111. return size;
  112. }
  113. set {
  114. if (_size != value) {
  115. if (value < -1) {
  116. throw ADP.InvalidSizeValue(value);
  117. }
  118. PropertyChanging();
  119. _size = value;
  120. }
  121. }
  122. }
  123. private void ResetSize() {
  124. if (0 != _size) {
  125. PropertyChanging();
  126. _size = 0;
  127. }
  128. }
  129. private bool ShouldSerializeSize() { // V1.2.3300
  130. return (0 != _size);
  131. }
  132. [
  133. RESNAMESPACE.ResCategoryAttribute(Res.DataCategory_Update),
  134. RESNAMESPACE.ResDescriptionAttribute(Res.DbParameter_SourceColumn),
  135. ]
  136. override public string SourceColumn { // V1.2.3300, XXXParameter V1.0.3300
  137. get {
  138. string sourceColumn = _sourceColumn;
  139. return ((null != sourceColumn) ? sourceColumn : ADP.StrEmpty);
  140. }
  141. set {
  142. _sourceColumn = value;
  143. }
  144. }
  145. public override bool SourceColumnNullMapping {
  146. get {
  147. return _sourceColumnNullMapping;
  148. }
  149. set {
  150. _sourceColumnNullMapping = value;
  151. }
  152. }
  153. [
  154. RESNAMESPACE.ResCategoryAttribute(Res.DataCategory_Update),
  155. RESNAMESPACE.ResDescriptionAttribute(Res.DbParameter_SourceVersion),
  156. ]
  157. override public DataRowVersion SourceVersion { // V1.2.3300, XXXParameter V1.0.3300
  158. get {
  159. DataRowVersion sourceVersion = _sourceVersion;
  160. return ((0 != sourceVersion) ? sourceVersion : DataRowVersion.Current);
  161. }
  162. set {
  163. switch(value) { // @perfnote: Enum.IsDefined
  164. case DataRowVersion.Original:
  165. case DataRowVersion.Current:
  166. case DataRowVersion.Proposed:
  167. case DataRowVersion.Default:
  168. _sourceVersion = value;
  169. break;
  170. default:
  171. throw ADP.InvalidDataRowVersion(value);
  172. }
  173. }
  174. }
  175. private void CloneHelperCore(PARAMETEROBJECTNAME destination) {
  176. destination._value = _value;
  177. // NOTE: _parent is not cloned
  178. destination._direction = _direction;
  179. destination._size = _size;
  180. #if USEOFFSET
  181. destination._offset = _offset;
  182. #endif
  183. destination._sourceColumn = _sourceColumn;
  184. destination._sourceVersion = _sourceVersion;
  185. destination._sourceColumnNullMapping = _sourceColumnNullMapping;
  186. destination._isNullable = _isNullable;
  187. }
  188. internal void CopyTo(DbParameter destination) {
  189. ADP.CheckArgumentNull(destination, "destination");
  190. CloneHelper((PARAMETEROBJECTNAME)destination);
  191. }
  192. internal object CompareExchangeParent(object value, object comparand) {
  193. // the interlock guarantees same parameter won't belong to multiple collections
  194. // at the same time, but to actually occur the user must really try
  195. // since we never declared thread safety, we don't care at this time
  196. //return System.Threading.Interlocked.CompareExchange(ref _parent, value, comparand);
  197. object parent = _parent;
  198. if (comparand == parent) {
  199. _parent = value;
  200. }
  201. return parent;
  202. }
  203. internal void ResetParent() {
  204. _parent = null;
  205. }
  206. override public string ToString() { // V1.2.3300, XXXParameter V1.0.3300
  207. return ParameterName;
  208. }
  209. private byte ValuePrecisionCore(object value) { // V1.2.3300
  210. if (value is Decimal) {
  211. return ((System.Data.SqlTypes.SqlDecimal)(Decimal) value).Precision; // WebData 102913
  212. }
  213. return 0;
  214. }
  215. private byte ValueScaleCore(object value) { // V1.2.3300
  216. if (value is Decimal) {
  217. return (byte)((Decimal.GetBits((Decimal)value)[3] & 0x00ff0000) >> 0x10);
  218. }
  219. return 0;
  220. }
  221. private int ValueSizeCore(object value) { // V1.2.3300
  222. if (!ADP.IsNull(value)) {
  223. string svalue = (value as string);
  224. if (null != svalue) {
  225. return svalue.Length;
  226. }
  227. byte[] bvalue = (value as byte[]);
  228. if (null != bvalue) {
  229. return bvalue.Length;
  230. }
  231. char[] cvalue = (value as char[]);
  232. if (null != cvalue) {
  233. return cvalue.Length;
  234. }
  235. if ((value is byte) || (value is char)) {
  236. return 1;
  237. }
  238. }
  239. return 0;
  240. }
  241. }
  242. }