OleDbParameter.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //
  2. // System.Data.OleDb.OleDbParameter
  3. //
  4. // Authors:
  5. // Konstantin Triger <[email protected]>
  6. // Boris Kirzner <[email protected]>
  7. //
  8. // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
  9. //
  10. //
  11. // Permission is hereby granted, free of charge, to any person obtaining
  12. // a copy of this software and associated documentation files (the
  13. // "Software"), to deal in the Software without restriction, including
  14. // without limitation the rights to use, copy, modify, merge, publish,
  15. // distribute, sublicense, and/or sell copies of the Software, and to
  16. // permit persons to whom the Software is furnished to do so, subject to
  17. // the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be
  20. // included in all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29. //
  30. using System;
  31. using System.Text;
  32. using System.Data;
  33. using System.Data.Common;
  34. using System.Data.ProviderBase;
  35. using java.sql;
  36. using java.lang;
  37. namespace System.Data.OleDb
  38. {
  39. public sealed class OleDbParameter : AbstractDbParameter, IDbDataParameter, ICloneable
  40. {
  41. #region Fields
  42. internal OleDbType _oleDbType = OleDbType.VarWChar;
  43. private bool _isOracleRefCursor = false;
  44. #endregion // Fields
  45. #region Constructors
  46. public OleDbParameter()
  47. {
  48. }
  49. public OleDbParameter(String parameterName, Object value)
  50. : this (parameterName, OleDbType.VarWChar, 0, ParameterDirection.Input,
  51. false, 0, 0, String.Empty, DataRowVersion.Current, value)
  52. {
  53. _isDbTypeSet = false;
  54. }
  55. public OleDbParameter(String parameterName, OleDbType dbType)
  56. : this (parameterName, dbType, 0, ParameterDirection.Input,
  57. false, 0, 0, String.Empty, DataRowVersion.Current, null)
  58. {
  59. }
  60. public OleDbParameter(String parameterName, OleDbType dbType, int size)
  61. : this (parameterName, dbType, size, ParameterDirection.Input,
  62. false, 0, 0, String.Empty, DataRowVersion.Current, null)
  63. {
  64. }
  65. public OleDbParameter(String parameterName, OleDbType dbType, int size,
  66. String sourceColumn)
  67. : this (parameterName, dbType, size, ParameterDirection.Input,
  68. false, 0, 0, sourceColumn, DataRowVersion.Current, null)
  69. {
  70. }
  71. public OleDbParameter(String parameterName,
  72. OleDbType dbType,
  73. int size,
  74. ParameterDirection direction,
  75. bool isNullable,
  76. byte precision,
  77. byte scale,
  78. String sourceColumn,
  79. DataRowVersion sourceVersion,
  80. Object value)
  81. {
  82. ParameterName = parameterName;
  83. OleDbType = dbType;
  84. Size = size;
  85. Direction = direction;
  86. IsNullable = isNullable;
  87. Precision = precision;
  88. Scale = scale;
  89. SourceColumn = sourceColumn;
  90. SourceVersion = sourceVersion;
  91. Value = value;
  92. }
  93. #endregion // Constructors
  94. #region Properties
  95. public override DbType DbType
  96. {
  97. get { return OleDbConvert.OleDbTypeToDbType(_oleDbType); }
  98. set { OleDbType = OleDbConvert.DbTypeToOleDbType(value); }
  99. }
  100. public OleDbType OleDbType
  101. {
  102. get { return _oleDbType; }
  103. set {
  104. _oleDbType = value;
  105. _isDbTypeSet = true;
  106. }
  107. }
  108. public new Object Value
  109. {
  110. get { return base.Value; }
  111. set {
  112. if (!_isDbTypeSet && (value != null) && (value != DBNull.Value)) {
  113. _oleDbType = OleDbConvert.ValueTypeToOleDbType(value.GetType());
  114. }
  115. base.Value = value;
  116. }
  117. }
  118. protected internal sealed override bool IsSpecial {
  119. get {
  120. return (Direction == ParameterDirection.Output) && IsOracleRefCursor;
  121. }
  122. }
  123. internal bool IsOracleRefCursor
  124. {
  125. get { return _isOracleRefCursor; }
  126. set { _isOracleRefCursor = value; }
  127. }
  128. #endregion // Properties
  129. #region Methods
  130. public override String ToString()
  131. {
  132. return ParameterName;
  133. }
  134. public override object Clone()
  135. {
  136. OleDbParameter clone = new OleDbParameter();
  137. CopyTo(clone);
  138. clone._oleDbType = _oleDbType;
  139. clone._isDbTypeSet = _isDbTypeSet;
  140. clone._isOracleRefCursor = _isOracleRefCursor;
  141. return clone;
  142. }
  143. protected internal sealed override object ConvertValue(object value)
  144. {
  145. // can not convert null or DbNull to other types
  146. if (value == null || value == DBNull.Value) {
  147. return value;
  148. }
  149. // FIXME : some other way to do this?
  150. if (OleDbType == OleDbType.Binary) {
  151. return value;
  152. }
  153. // .NET throws an exception to the user.
  154. object convertedValue = value;
  155. // note : if we set user parameter jdbc type inside prepare interbal, the db type is not set
  156. if (value is IConvertible && (_isDbTypeSet || IsJdbcTypeSet)) {
  157. OleDbType oleDbType = (_isDbTypeSet) ? OleDbType : OleDbConvert.JdbcTypeToOleDbType((int)JdbcType);
  158. Type to = OleDbConvert.OleDbTypeToValueType(oleDbType);
  159. if (!(value is DateTime && to == DbTypes.TypeOfTimespan)) //anyway will go by jdbc type
  160. convertedValue = Convert.ChangeType(value,to);
  161. }
  162. return convertedValue;
  163. }
  164. protected internal sealed override void SetParameterName(ResultSet res)
  165. {
  166. ParameterName = res.getString("COLUMN_NAME");
  167. if (ParameterName.StartsWith("@")) {
  168. ParameterName = ParameterName.Remove(0,1);
  169. }
  170. }
  171. protected internal sealed override void SetParameterDbType(ResultSet res)
  172. {
  173. int jdbcType = res.getInt("DATA_TYPE");
  174. // FIXME : is that correct?
  175. if (jdbcType == Types.OTHER) {
  176. string typeName = res.getString("TYPE_NAME");
  177. if (String.Compare("BLOB",typeName,true) == 0) {
  178. jdbcType = Types.BLOB;
  179. }
  180. else if (String.Compare("CLOB",typeName,true) == 0) {
  181. jdbcType = Types.CLOB;
  182. }
  183. else if(String.Compare("FLOAT",typeName,true) == 0) {
  184. jdbcType = Types.FLOAT;
  185. }
  186. else if(String.Compare("NVARCHAR2",typeName,true) == 0) {
  187. jdbcType = Types.VARCHAR;
  188. }
  189. else if(String.Compare("NCHAR",typeName,true) == 0) {
  190. jdbcType = Types.CHAR;
  191. }
  192. }
  193. OleDbType = OleDbConvert.JdbcTypeToOleDbType(jdbcType);
  194. JdbcType = jdbcType;
  195. }
  196. protected internal sealed override void SetSpecialFeatures(ResultSet res)
  197. {
  198. IsOracleRefCursor = (res.getString("TYPE_NAME") == "REF CURSOR");
  199. }
  200. protected internal sealed override int JdbcTypeFromProviderType()
  201. {
  202. return OleDbConvert.OleDbTypeToJdbcType(OleDbType);
  203. }
  204. #endregion // Methods
  205. }
  206. }