SqlParameter.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //
  2. // System.Data.SqlClient.SqlParameter
  3. //
  4. // Author:
  5. // Boris Kirzner ([email protected])
  6. //
  7. using System;
  8. using System.Collections;
  9. using System.Data;
  10. using System.Data.ProviderBase;
  11. using System.Data.Common;
  12. using java.sql;
  13. namespace System.Data.SqlClient
  14. {
  15. public class SqlParameter : AbstractDbParameter, IDbDataParameter, ICloneable
  16. {
  17. #region Fields
  18. private SqlDbType _sqlDbType;
  19. #endregion // Fields
  20. #region Constructors
  21. public SqlParameter()
  22. {
  23. }
  24. public SqlParameter(String parameterName, Object value)
  25. : this(parameterName, SqlDbType.NVarChar, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, value,false)
  26. {
  27. }
  28. public SqlParameter(String parameterName, SqlDbType dbType)
  29. : this(parameterName, dbType, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null, true)
  30. {
  31. }
  32. public SqlParameter(String parameterName, SqlDbType dbType, int size)
  33. : this(parameterName, dbType, size, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null, true)
  34. {
  35. }
  36. public SqlParameter(String parameterName, SqlDbType dbType, int size, String sourceColumn)
  37. : this(parameterName, dbType, size, ParameterDirection.Input, false, 0, 0, sourceColumn, DataRowVersion.Current, null, true)
  38. {
  39. }
  40. public SqlParameter(
  41. String parameterName,
  42. SqlDbType dbType,
  43. int size,
  44. ParameterDirection direction,
  45. bool isNullable,
  46. byte precision,
  47. byte scale,
  48. String sourceColumn,
  49. DataRowVersion sourceVersion,
  50. Object value) : this(parameterName,dbType,size,direction,isNullable,precision,scale,sourceColumn,sourceVersion,value,true)
  51. {
  52. }
  53. public SqlParameter(
  54. String parameterName,
  55. SqlDbType dbType,
  56. int size,
  57. ParameterDirection direction,
  58. bool isNullable,
  59. byte precision,
  60. byte scale,
  61. String sourceColumn,
  62. DataRowVersion sourceVersion,
  63. Object value,
  64. bool dbTypeExplicit)
  65. {
  66. ParameterName = parameterName;
  67. SqlDbType = dbType;
  68. Size = size;
  69. Direction = direction;
  70. IsNullable = isNullable;
  71. Precision = precision;
  72. Scale = scale;
  73. SourceColumn = sourceColumn;
  74. SourceVersion = sourceVersion;
  75. if (!dbTypeExplicit) {
  76. _isDbTypeSet = false;
  77. }
  78. Value = value;
  79. }
  80. #endregion // Constructors
  81. #region Properties
  82. public override DbType DbType
  83. {
  84. get { return SqlConvert.SqlDbTypeToDbType(_sqlDbType); }
  85. set { _sqlDbType = SqlConvert.DbTypeToSqlDbType(value); }
  86. }
  87. public SqlDbType SqlDbType
  88. {
  89. get { return _sqlDbType; }
  90. set {
  91. _sqlDbType = value;
  92. _isDbTypeSet = true;
  93. }
  94. }
  95. public override byte Precision
  96. {
  97. get { return _precision; }
  98. set { _precision = value; }
  99. }
  100. public override int Size
  101. {
  102. get {
  103. int retVal = base.Size;
  104. return retVal;
  105. }
  106. set {
  107. if (value < 0) {
  108. throw ExceptionHelper.InvalidSizeValue(value);
  109. }
  110. if (value != 0) {
  111. base.Size = value;
  112. }
  113. else {
  114. base.Size = -1;
  115. }
  116. }
  117. }
  118. protected internal override string Placeholder {
  119. get {
  120. return ParameterName;
  121. }
  122. }
  123. public override Object Value
  124. {
  125. get { return base.Value; }
  126. set {
  127. if (!_isDbTypeSet && (value != null)) {
  128. _sqlDbType = SqlConvert.ValueTypeToSqlDbType(value.GetType());
  129. }
  130. base.Value = value;
  131. }
  132. }
  133. #endregion // Properties
  134. #region Methods
  135. public override String ToString()
  136. {
  137. return ParameterName;
  138. }
  139. public override object Clone()
  140. {
  141. SqlParameter clone = new SqlParameter();
  142. CopyTo(clone);
  143. clone._sqlDbType = _sqlDbType;
  144. return clone;
  145. }
  146. internal override object ConvertValue(object value)
  147. {
  148. // can not convert null or DbNull to other types
  149. if (value == null || value == DBNull.Value) {
  150. return value;
  151. }
  152. // .NET throws an exception to the user.
  153. object convertedValue = Convert.ChangeType(value,SqlConvert.SqlDbTypeToValueType(SqlDbType));
  154. return convertedValue;
  155. }
  156. internal override void SetParameterName(ResultSet res)
  157. {
  158. string name = res.getString("COLUMN_NAME");
  159. if (name != null && name.Length > 0 && name[0] != '@')
  160. name = String.Concat("@", name);
  161. ParameterName = name;
  162. }
  163. internal override void SetParameterDbType(ResultSet res)
  164. {
  165. int dataType = res.getInt("DATA_TYPE");
  166. SqlDbType = SqlConvert.JdbcTypeToSqlDbType(dataType);
  167. JdbcType = (DbTypes.JavaSqlTypes) dataType;
  168. }
  169. internal override void SetSpecialFeatures(ResultSet res)
  170. {
  171. // do nothing
  172. }
  173. internal override DbTypes.JavaSqlTypes JdbcTypeFromProviderType()
  174. {
  175. return (DbTypes.JavaSqlTypes)SqlConvert.SqlDbTypeToJdbcType(SqlDbType);
  176. }
  177. #endregion // Methods
  178. }
  179. }