2
0

OracleConvert.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. //
  2. // System.Data.Oracle.OracleConvert
  3. //
  4. // Authors:
  5. // Konstantin Triger <[email protected]>
  6. //
  7. // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
  8. //
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining
  11. // a copy of this software and associated documentation files (the
  12. // "Software"), to deal in the Software without restriction, including
  13. // without limitation the rights to use, copy, modify, merge, publish,
  14. // distribute, sublicense, and/or sell copies of the Software, and to
  15. // permit persons to whom the Software is furnished to do so, subject to
  16. // the following conditions:
  17. //
  18. // The above copyright notice and this permission notice shall be
  19. // included in all copies or substantial portions of the Software.
  20. //
  21. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  25. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  26. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  27. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  28. //
  29. using System;
  30. using System.Collections;
  31. using System.Data.Common;
  32. using System.Data.ProviderBase;
  33. using java.sql;
  34. namespace System.Data.OracleClient {
  35. internal sealed class OracleConvert : DbConvert {
  36. #region Fields
  37. private static Hashtable _typeNamesMap;
  38. #endregion // Fields
  39. #region Constructors
  40. static OracleConvert() {
  41. _typeNamesMap = new Hashtable(30,new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer());
  42. // SqlServer types mapping
  43. // _typeNamesMap.Add("numeric(3, 0)1","DBTYPE_I1");
  44. _typeNamesMap.Add("smallint","DBTYPE_I2");
  45. _typeNamesMap.Add("Int","DBTYPE_I4");
  46. _typeNamesMap.Add("bigint","DBTYPE_I8");
  47. _typeNamesMap.Add("tinyint","DBTYPE_UI1");
  48. // _typeNamesMap.Add("numeric(5,0)","DBTYPE_UI2");
  49. // _typeNamesMap.Add("numeric(10,0)","DBTYPE_UI4");
  50. // _typeNamesMap.Add("numeric(20,0)","DBTYPE_UI8");
  51. _typeNamesMap.Add("Float","DBTYPE_R8");
  52. _typeNamesMap.Add("Real","DBTYPE_R4");
  53. _typeNamesMap.Add("numeric","DBTYPE_NUMERIC");
  54. _typeNamesMap.Add("decimal","DBTYPE_NUMERIC");
  55. _typeNamesMap.Add("money","DBTYPE_CY");
  56. _typeNamesMap.Add("smallmoney","DBTYPE_CY");
  57. _typeNamesMap.Add("ntext","DBTYPE_WLONGVARCHAR");
  58. _typeNamesMap.Add("nchar","DBTYPE_WCHAR");
  59. _typeNamesMap.Add("nvarchar","DBTYPE_WVARCHAR");
  60. _typeNamesMap.Add("Bit","DBTYPE_BOOL");
  61. // _typeNamesMap.Add("nvarchar(4000)","DBTYPE_VARIANT");
  62. _typeNamesMap.Add("sql_variant","DBTYPE_VARIANT");
  63. _typeNamesMap.Add("uniqueidentifier","DBTYPE_GUID");
  64. _typeNamesMap.Add("image","DBTYPE_LONGVARBINARY");
  65. _typeNamesMap.Add("timestamp","DBTYPE_BINARY");
  66. _typeNamesMap.Add("binary","DBTYPE_BINARY");
  67. _typeNamesMap.Add("varbinary","DBTYPE_VARBINARY");
  68. _typeNamesMap.Add("char","DBTYPE_CHAR");
  69. _typeNamesMap.Add("varchar","DBTYPE_VARCHAR");
  70. _typeNamesMap.Add("text","DBTYPE_LONGVARCHAR");
  71. // _typeNamesMap.Add("nchar","DBTYPE_WSTR");
  72. // _typeNamesMap.Add("nvarchar","DBTYPE_WSTR");
  73. // _typeNamesMap.Add("ntext","DBTYPE_WSTR");
  74. // _typeNamesMap.Add("datetime","DBTYPE_DATE");
  75. _typeNamesMap.Add("datetime","DBTYPE_DBTIMESTAMP");
  76. _typeNamesMap.Add("smalldatetime","DBTYPE_DBTIMESTAMP");
  77. _typeNamesMap.Add("Ignored","DBTYPE_BYREF");
  78. }
  79. #endregion //Constructors
  80. #region Methods
  81. internal static String JdbcTypeNameToDbTypeName(string jdbcTypeName) {
  82. jdbcTypeName = jdbcTypeName.Trim();
  83. string dbTypeName = (string)_typeNamesMap[jdbcTypeName];
  84. return (dbTypeName != null) ? dbTypeName : jdbcTypeName;
  85. }
  86. //TBD
  87. internal static OracleType JdbcTypeToOracleType(int jdbcType) {
  88. switch ((DbTypes.JavaSqlTypes)jdbcType) {
  89. case DbTypes.JavaSqlTypes.ARRAY: return OracleType.Blob;
  90. case DbTypes.JavaSqlTypes.BIGINT: return OracleType.Number;
  91. case DbTypes.JavaSqlTypes.BINARY: return OracleType.Blob;
  92. //case DbTypes.JavaSqlTypes.BIT: return OracleType.Boolean;
  93. case DbTypes.JavaSqlTypes.BLOB: return OracleType.Blob;
  94. //case DbTypes.JavaSqlTypes.BOOLEAN: return OracleType.Boolean;
  95. case DbTypes.JavaSqlTypes.CHAR: return OracleType.Char;
  96. //case DbTypes.JavaSqlTypes.CLOB: return OracleType.Clob;
  97. // case DbTypes.JavaSqlTypes.DATALINK: return OracleType.IUnknown;
  98. // case DbTypes.JavaSqlTypes.DATE: return OracleType.DBDate;
  99. // case DbTypes.JavaSqlTypes.DECIMAL: return OracleType.Decimal;
  100. // case DbTypes.JavaSqlTypes.DISTINCT: return OracleType.IUnknown;
  101. case DbTypes.JavaSqlTypes.DOUBLE: return OracleType.Double;
  102. case DbTypes.JavaSqlTypes.FLOAT: return OracleType.Double;
  103. // case DbTypes.JavaSqlTypes.INTEGER: return OracleType.Integer;
  104. // case DbTypes.JavaSqlTypes.JAVA_OBJECT: return OracleType.IUnknown;
  105. // case DbTypes.JavaSqlTypes.LONGVARBINARY: return OracleType.LongVarBinary;
  106. // case DbTypes.JavaSqlTypes.LONGVARCHAR: return OracleType.LongVarWChar;
  107. // case DbTypes.JavaSqlTypes.NULL: return OracleType.Empty;
  108. // case DbTypes.JavaSqlTypes.NUMERIC: return OracleType.Numeric;
  109. default:
  110. // case DbTypes.JavaSqlTypes.OTHER: return OracleType.IUnknown;
  111. // case DbTypes.JavaSqlTypes.REAL: return OracleType.Single;
  112. // case DbTypes.JavaSqlTypes.REF: return OracleType.IUnknown;
  113. // case DbTypes.JavaSqlTypes.SMALLINT: return OracleType.SmallInt;
  114. // case DbTypes.JavaSqlTypes.STRUCT: return OracleType.IUnknown;
  115. // case DbTypes.JavaSqlTypes.TIME: return OracleType.DBTime;
  116. // case DbTypes.JavaSqlTypes.TIMESTAMP: return OracleType.DBTimeStamp;
  117. // case DbTypes.JavaSqlTypes.TINYINT: return OracleType.TinyInt;
  118. // case DbTypes.JavaSqlTypes.VARBINARY: return OracleType.VarBinary;
  119. case DbTypes.JavaSqlTypes.VARCHAR: return OracleType.VarChar;
  120. }
  121. }
  122. internal static OracleType ValueTypeToOracleType(Type type) {
  123. switch (Type.GetTypeCode(type)) {
  124. // case TypeCode.Boolean: return OracleType.Boolean;
  125. case TypeCode.Byte: return OracleType.Byte;
  126. case TypeCode.Char: return OracleType.Char;
  127. case TypeCode.DateTime: return OracleType.DateTime;
  128. // case TypeCode.DBNull: return OracleType.Empty;
  129. case TypeCode.Decimal: return OracleType.Number;
  130. case TypeCode.Double: return OracleType.Double;
  131. // case TypeCode.Empty: return OracleType.Empty;
  132. case TypeCode.Int16: return OracleType.Int16;
  133. case TypeCode.Int32: return OracleType.Int32;
  134. case TypeCode.Int64: return OracleType.Number;
  135. default:
  136. case TypeCode.Object: {
  137. return OracleType.VarChar;
  138. // if (type.Equals(DbTypes.TypeOfByteArray)) return OracleType.Binary;
  139. // if (type.Equals(DbTypes.TypeOfTimespan)) return OracleType.DBTime;
  140. // if (type.Equals(DbTypes.TypeOfGuid)) return OracleType.Guid;
  141. //
  142. // if (type.IsEnum)
  143. // return ValueTypeToOracleType (Enum.GetUnderlyingType (type));
  144. //
  145. // return OracleType.IUnknown;
  146. }
  147. case TypeCode.SByte: return OracleType.SByte;
  148. case TypeCode.Single: return OracleType.Float;
  149. case TypeCode.String: return OracleType.VarChar;
  150. case TypeCode.UInt16: return OracleType.UInt16;
  151. case TypeCode.UInt32: return OracleType.UInt32;
  152. // case TypeCode.UInt64: return OracleType.UnsignedBigInt;
  153. }
  154. }
  155. internal static Type OracleTypeToValueType(OracleType oleDbType) {
  156. switch (oleDbType) {
  157. // case OracleType.BigInt : return DbTypes.TypeOfInt64;// typeof(long);
  158. // case OracleType.Binary : return DbTypes.TypeOfByteArray;
  159. // case OracleType.Boolean : return DbTypes.TypeOfBoolean;
  160. // case OracleType.BSTR : return DbTypes.TypeOfString;
  161. case OracleType.Char : return DbTypes.TypeOfString;
  162. // case OracleType.Currency : return DbTypes.TypeOfDecimal;
  163. // case OracleType.Date : return DbTypes.TypeOfDateTime;
  164. // case OracleType.DBDate : return DbTypes.TypeOfDateTime;
  165. // case OracleType.DBTime : return DbTypes.TypeOfTimespan;
  166. // case OracleType.DBTimeStamp : return DbTypes.TypeOfDateTime;
  167. // case OracleType.Decimal : return DbTypes.TypeOfDecimal;
  168. case OracleType.Double : return DbTypes.TypeOfDouble;
  169. // case OracleType.Empty : return null; //typeof(DBNull);
  170. // case OracleType.Error : return typeof(Exception);
  171. // case OracleType.Filetime : return DbTypes.TypeOfDateTime;
  172. // case OracleType.Guid : return DbTypes.TypeOfGuid;
  173. // case OracleType.IDispatch : return DbTypes.TypeOfObject;
  174. // case OracleType.Integer : return DbTypes.TypeOfInt32;
  175. // case OracleType.IUnknown : return DbTypes.TypeOfObject;
  176. // case OracleType.LongVarBinary : return DbTypes.TypeOfByteArray;
  177. case OracleType.LongVarChar : return DbTypes.TypeOfString;
  178. // case OracleType.LongVarWChar : return DbTypes.TypeOfString;
  179. // case OracleType.Numeric : return DbTypes.TypeOfDecimal;
  180. // case OracleType.PropVariant : return DbTypes.TypeOfObject;
  181. // case OracleType.Single : return DbTypes.TypeOfFloat;
  182. // case OracleType.SmallInt : return DbTypes.TypeOfInt16;
  183. // case OracleType.TinyInt : return DbTypes.TypeOfSByte;
  184. // case OracleType.UnsignedBigInt : return DbTypes.TypeOfUInt64;
  185. // case OracleType.UnsignedInt : return DbTypes.TypeOfUInt32;
  186. // case OracleType.UnsignedSmallInt : return DbTypes.TypeOfUInt16;
  187. // case OracleType.UnsignedTinyInt : return DbTypes.TypeOfByte;
  188. // case OracleType.VarBinary : return DbTypes.TypeOfByteArray;
  189. // case OracleType.VarChar : return DbTypes.TypeOfString;
  190. // case OracleType.Variant : return DbTypes.TypeOfObject;
  191. // case OracleType.VarNumeric : return DbTypes.TypeOfDecimal;
  192. // case OracleType.VarWChar : return DbTypes.TypeOfString;
  193. // case OracleType.WChar : return DbTypes.TypeOfString;
  194. default : return DbTypes.TypeOfObject;
  195. }
  196. }
  197. internal static OracleType DbTypeToOracleType(DbType dbType) {
  198. switch (dbType) {
  199. case DbType.AnsiString : return OracleType.VarChar;
  200. // case DbType.Binary : return OracleType.VarBinary;
  201. // case DbType.Byte : return OracleType.UnsignedTinyInt;
  202. // case DbType.Boolean : return OracleType.Boolean;
  203. // case DbType.Currency : return OracleType.Currency;
  204. // case DbType.Date : return OracleType.DBDate;
  205. // case DbType.DateTime : return OracleType.DBTimeStamp;
  206. // case DbType.Decimal : return OracleType.Decimal;
  207. case DbType.Double : return OracleType.Double;
  208. // case DbType.Guid : return OracleType.Guid;
  209. // case DbType.Int16 : return OracleType.SmallInt;
  210. // case DbType.Int32 : return OracleType.Integer;
  211. // case DbType.Int64 : return OracleType.BigInt;
  212. // case DbType.Object : return OracleType.Variant;
  213. // case DbType.SByte : return OracleType.TinyInt;
  214. // case DbType.Single : return OracleType.Single;
  215. // case DbType.String : return OracleType.VarWChar;
  216. // case DbType.Time : return OracleType.DBTime;
  217. // case DbType.UInt16 : return OracleType.UnsignedSmallInt;
  218. // case DbType.UInt32 : return OracleType.UnsignedInt;
  219. // case DbType.UInt64 : return OracleType.UnsignedBigInt;
  220. // case DbType.VarNumeric : return OracleType.VarNumeric;
  221. case DbType.AnsiStringFixedLength : return OracleType.Char;
  222. // case DbType.StringFixedLength : return OracleType.WChar;
  223. default : throw ExceptionHelper.InvalidDbType((int)dbType);
  224. }
  225. }
  226. internal static DbType OracleTypeToDbType(OracleType oleDbType) {
  227. switch (oleDbType) {
  228. // case OracleType.Empty : return DbType.Object;
  229. // case OracleType.SmallInt : return DbType.Int16;
  230. // case OracleType.Integer : return DbType.Int32;
  231. // case OracleType.Single : return DbType.Single;
  232. // case OracleType.Double : return DbType.Double;
  233. // case OracleType.Currency : return DbType.Currency;
  234. // case OracleType.Date : return DbType.DateTime;
  235. // case OracleType.BSTR : return DbType.String;
  236. // case OracleType.IDispatch : return DbType.Object;
  237. // case OracleType.Error : return DbType.Object;
  238. // case OracleType.Boolean : return DbType.Boolean;
  239. // case OracleType.Variant : return DbType.Object;
  240. // case OracleType.IUnknown : return DbType.Object;
  241. // case OracleType.Decimal : return DbType.Decimal;
  242. // case OracleType.TinyInt : return DbType.SByte;
  243. // case OracleType.UnsignedTinyInt : return DbType.Byte;
  244. // case OracleType.UnsignedSmallInt : return DbType.UInt16;
  245. // case OracleType.UnsignedInt : return DbType.UInt32;
  246. // case OracleType.BigInt : return DbType.Int64;
  247. // case OracleType.UnsignedBigInt : return DbType.UInt64;
  248. // case OracleType.Filetime : return DbType.DateTime;
  249. // case OracleType.Guid : return DbType.Guid;
  250. // case OracleType.Binary : return DbType.Binary;
  251. // case OracleType.Char : return DbType.AnsiStringFixedLength;
  252. // case OracleType.WChar : return DbType.StringFixedLength;
  253. // case OracleType.Numeric : return DbType.Decimal;
  254. // case OracleType.DBDate : return DbType.Date;
  255. // case OracleType.DBTime : return DbType.Time;
  256. // case OracleType.DBTimeStamp : return DbType.DateTime;
  257. // case OracleType.PropVariant : return DbType.Object;
  258. // case OracleType.VarNumeric : return DbType.VarNumeric;
  259. // case OracleType.VarChar : return DbType.AnsiString;
  260. // case OracleType.LongVarChar : return DbType.AnsiString;
  261. // case OracleType.VarWChar : return DbType.String;
  262. // case OracleType.LongVarWChar : return DbType.String;
  263. // case OracleType.VarBinary : return DbType.Binary;
  264. // case OracleType.LongVarBinary : return DbType.Binary;
  265. default : throw ExceptionHelper.InvalidOleDbType((int)oleDbType);
  266. }
  267. }
  268. internal static int OracleTypeToJdbcType(OracleType oleDbType) {
  269. switch(oleDbType) {
  270. // case OracleType.BigInt : return Types.BIGINT;
  271. // case OracleType.Binary : return Types.BINARY;
  272. // case OracleType.Boolean : return Types.BIT;
  273. // case OracleType.BSTR : return Types.VARCHAR;
  274. case OracleType.Char : return Types.CHAR;
  275. // case OracleType.Currency : return Types.DECIMAL;
  276. // case OracleType.Date : return Types.TIMESTAMP;
  277. // case OracleType.DBDate : return Types.DATE;
  278. // case OracleType.DBTime : return Types.TIME;
  279. // case OracleType.DBTimeStamp : return Types.TIMESTAMP;
  280. // case OracleType.Decimal : return Types.DECIMAL;
  281. case OracleType.Double : return Types.DOUBLE;
  282. // case OracleType.Empty : return Types.NULL;
  283. // case OracleType.Error : return Types.OTHER;
  284. // case OracleType.Filetime : return Types.TIMESTAMP;
  285. // case OracleType.Guid : return Types.CHAR;
  286. // case OracleType.IDispatch : return Types.OTHER; //throw new ArgumentException("The " + oleDbType + " OracleType value is not supported.");
  287. // case OracleType.Integer : return Types.INTEGER;
  288. // case OracleType.IUnknown : return Types.OTHER; //throw new ArgumentException("The " + oleDbType + " OracleType value is not supported.");
  289. // case OracleType.LongVarBinary : return Types.LONGVARBINARY;
  290. // case OracleType.LongVarChar : return Types.LONGVARCHAR;
  291. // case OracleType.LongVarWChar : return Types.LONGVARCHAR;
  292. // case OracleType.Numeric : return Types.NUMERIC;
  293. // case OracleType.PropVariant : return Types.OTHER;
  294. // case OracleType.Single : return Types.FLOAT;
  295. // case OracleType.SmallInt : return Types.SMALLINT;
  296. // case OracleType.TinyInt : return Types.TINYINT;
  297. // case OracleType.UnsignedBigInt : return Types.BIGINT;
  298. // case OracleType.UnsignedInt : return Types.INTEGER;
  299. // case OracleType.UnsignedSmallInt : return Types.SMALLINT;
  300. // case OracleType.UnsignedTinyInt : return Types.TINYINT;
  301. // case OracleType.VarBinary : return Types.VARBINARY;
  302. // case OracleType.VarChar : return Types.VARCHAR;
  303. // case OracleType.Variant : return Types.VARCHAR;
  304. // case OracleType.VarNumeric : return Types.DECIMAL;
  305. // case OracleType.VarWChar : return Types.VARCHAR;
  306. // case OracleType.WChar : return Types.VARCHAR;
  307. default : throw ExceptionHelper.InvalidOleDbType((int)oleDbType);
  308. }
  309. #endregion // Methods
  310. }
  311. }
  312. }