OleDbParameter.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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
  40. {
  41. #region Fields
  42. private 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. #if NET_2_0
  109. public new byte Precision
  110. {
  111. get { return base.Precision; }
  112. set { base.Precision = value; }
  113. }
  114. public new byte Scale
  115. {
  116. get { return base.Scale; }
  117. set { base.Scale = value; }
  118. }
  119. #endif
  120. public new Object Value
  121. {
  122. get { return base.Value; }
  123. set {
  124. if (!IsDbTypeSet && (value != null) && (value != DBNull.Value)) {
  125. _oleDbType = OleDbConvert.ValueTypeToOleDbType(value.GetType());
  126. }
  127. base.Value = value;
  128. }
  129. }
  130. protected internal sealed override bool IsSpecial {
  131. get {
  132. return (Direction == ParameterDirection.Output) && IsOracleRefCursor;
  133. }
  134. }
  135. internal bool IsOracleRefCursor
  136. {
  137. get { return _isOracleRefCursor; }
  138. set { _isOracleRefCursor = value; }
  139. }
  140. #endregion // Properties
  141. #region Methods
  142. protected internal sealed override object ConvertValue(object value)
  143. {
  144. // can not convert null or DbNull to other types
  145. if (value == null || value == DBNull.Value) {
  146. return value;
  147. }
  148. // FIXME : some other way to do this?
  149. if (OleDbType == OleDbType.Binary) {
  150. return value;
  151. }
  152. // .NET throws an exception to the user.
  153. object convertedValue = value;
  154. // note : if we set user parameter jdbc type inside prepare interbal, the db type is not set
  155. if (value is IConvertible && (IsDbTypeSet || IsJdbcTypeSet)) {
  156. OleDbType oleDbType = (IsDbTypeSet) ? OleDbType : OleDbConvert.JdbcTypeToOleDbType((int)JdbcType);
  157. Type to = OleDbConvert.OleDbTypeToValueType(oleDbType);
  158. if (!(value is DateTime && to == DbTypes.TypeOfTimespan)) //anyway will go by jdbc type
  159. convertedValue = Convert.ChangeType(value,to);
  160. }
  161. return convertedValue;
  162. }
  163. protected internal sealed override void SetParameterName(ResultSet res)
  164. {
  165. ParameterName = res.getString("COLUMN_NAME");
  166. if (ParameterName.StartsWith("@")) {
  167. ParameterName = ParameterName.Remove(0,1);
  168. }
  169. }
  170. protected internal sealed override void SetParameterDbType(ResultSet res)
  171. {
  172. int jdbcType = res.getInt("DATA_TYPE");
  173. // FIXME : is that correct?
  174. if (jdbcType == Types.OTHER) {
  175. string typeName = res.getString("TYPE_NAME");
  176. if (String.Compare("BLOB",typeName,true) == 0) {
  177. jdbcType = Types.BLOB;
  178. }
  179. else if (String.Compare("CLOB",typeName,true) == 0) {
  180. jdbcType = Types.CLOB;
  181. }
  182. else if(String.Compare("FLOAT",typeName,true) == 0) {
  183. jdbcType = Types.FLOAT;
  184. }
  185. else if(String.Compare("NVARCHAR2",typeName,true) == 0) {
  186. jdbcType = Types.VARCHAR;
  187. }
  188. else if(String.Compare("NCHAR",typeName,true) == 0) {
  189. jdbcType = Types.VARCHAR;
  190. }
  191. }
  192. OleDbType = OleDbConvert.JdbcTypeToOleDbType(jdbcType);
  193. JdbcType = jdbcType;
  194. }
  195. protected internal sealed override void SetSpecialFeatures(ResultSet res)
  196. {
  197. IsOracleRefCursor = (res.getString("TYPE_NAME") == "REF CURSOR");
  198. }
  199. protected internal sealed override int JdbcTypeFromProviderType()
  200. {
  201. return OleDbConvert.OleDbTypeToJdbcType(OleDbType);
  202. }
  203. #endregion // Methods
  204. }
  205. }