OleDbConvert.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. //
  2. // System.Data.OlDb.OleDbConvert
  3. //
  4. // Author:
  5. // Boris Kirzner ([email protected])
  6. //
  7. using System;
  8. using System.Collections;
  9. using System.Data.Common;
  10. using java.sql;
  11. namespace System.Data.OleDb
  12. {
  13. internal sealed class OleDbConvert : DbConvert
  14. {
  15. #region Fields
  16. private static Hashtable _typeNamesMap;
  17. #endregion // Fields
  18. #region Constructors
  19. static OleDbConvert()
  20. {
  21. _typeNamesMap = new Hashtable(30,new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer());
  22. // SqlServer types mapping
  23. // _typeNamesMap.Add("numeric(3, 0)1","DBTYPE_I1");
  24. _typeNamesMap.Add("smallint","DBTYPE_I2");
  25. _typeNamesMap.Add("Int","DBTYPE_I4");
  26. _typeNamesMap.Add("bigint","DBTYPE_I8");
  27. _typeNamesMap.Add("tinyint","DBTYPE_UI1");
  28. // _typeNamesMap.Add("numeric(5,0)","DBTYPE_UI2");
  29. // _typeNamesMap.Add("numeric(10,0)","DBTYPE_UI4");
  30. // _typeNamesMap.Add("numeric(20,0)","DBTYPE_UI8");
  31. _typeNamesMap.Add("Float","DBTYPE_R8");
  32. _typeNamesMap.Add("Real","DBTYPE_R4");
  33. _typeNamesMap.Add("numeric","DBTYPE_NUMERIC");
  34. _typeNamesMap.Add("decimal","DBTYPE_NUMERIC");
  35. _typeNamesMap.Add("money","DBTYPE_CY");
  36. _typeNamesMap.Add("smallmoney","DBTYPE_CY");
  37. _typeNamesMap.Add("ntext","DBTYPE_WLONGVARCHAR");
  38. _typeNamesMap.Add("nchar","DBTYPE_WCHAR");
  39. _typeNamesMap.Add("nvarchar","DBTYPE_WVARCHAR");
  40. _typeNamesMap.Add("Bit","DBTYPE_BOOL");
  41. // _typeNamesMap.Add("nvarchar(4000)","DBTYPE_VARIANT");
  42. _typeNamesMap.Add("sql_variant","DBTYPE_VARIANT");
  43. _typeNamesMap.Add("uniqueidentifier","DBTYPE_GUID");
  44. _typeNamesMap.Add("image","DBTYPE_LONGVARBINARY");
  45. _typeNamesMap.Add("timestamp","DBTYPE_BINARY");
  46. _typeNamesMap.Add("binary","DBTYPE_BINARY");
  47. _typeNamesMap.Add("varbinary","DBTYPE_VARBINARY");
  48. _typeNamesMap.Add("char","DBTYPE_CHAR");
  49. _typeNamesMap.Add("varchar","DBTYPE_VARCHAR");
  50. _typeNamesMap.Add("text","DBTYPE_LONGVARCHAR");
  51. // _typeNamesMap.Add("nchar","DBTYPE_WSTR");
  52. // _typeNamesMap.Add("nvarchar","DBTYPE_WSTR");
  53. // _typeNamesMap.Add("ntext","DBTYPE_WSTR");
  54. // _typeNamesMap.Add("datetime","DBTYPE_DATE");
  55. _typeNamesMap.Add("datetime","DBTYPE_DBTIMESTAMP");
  56. _typeNamesMap.Add("smalldatetime","DBTYPE_DBTIMESTAMP");
  57. _typeNamesMap.Add("Ignored","DBTYPE_BYREF");
  58. }
  59. #endregion //Constructors
  60. #region Methods
  61. internal static String JdbcTypeNameToDbTypeName(string jdbcTypeName)
  62. {
  63. jdbcTypeName = jdbcTypeName.Trim();
  64. string dbTypeName = (string)_typeNamesMap[jdbcTypeName];
  65. return (dbTypeName != null) ? dbTypeName : jdbcTypeName;
  66. }
  67. internal static OleDbType JdbcTypeToOleDbType(int jdbcType)
  68. {
  69. switch ((DbTypes.JavaSqlTypes)jdbcType) {
  70. case DbTypes.JavaSqlTypes.ARRAY: return OleDbType.Binary;
  71. case DbTypes.JavaSqlTypes.BIGINT: return OleDbType.BigInt;
  72. case DbTypes.JavaSqlTypes.BINARY: return OleDbType.Binary;
  73. case DbTypes.JavaSqlTypes.BIT: return OleDbType.Boolean;
  74. case DbTypes.JavaSqlTypes.BLOB: return OleDbType.Binary;
  75. case DbTypes.JavaSqlTypes.BOOLEAN: return OleDbType.Boolean;
  76. case DbTypes.JavaSqlTypes.CHAR: return OleDbType.Char;
  77. case DbTypes.JavaSqlTypes.CLOB: return OleDbType.LongVarWChar;
  78. case DbTypes.JavaSqlTypes.DATALINK: return OleDbType.IUnknown;
  79. case DbTypes.JavaSqlTypes.DATE: return OleDbType.DBDate;
  80. case DbTypes.JavaSqlTypes.DECIMAL: return OleDbType.Decimal;
  81. case DbTypes.JavaSqlTypes.DISTINCT: return OleDbType.IUnknown;
  82. case DbTypes.JavaSqlTypes.DOUBLE: return OleDbType.Double;
  83. case DbTypes.JavaSqlTypes.FLOAT: return OleDbType.Double;
  84. case DbTypes.JavaSqlTypes.INTEGER: return OleDbType.Integer;
  85. case DbTypes.JavaSqlTypes.JAVA_OBJECT: return OleDbType.IUnknown;
  86. case DbTypes.JavaSqlTypes.LONGVARBINARY: return OleDbType.LongVarBinary;
  87. case DbTypes.JavaSqlTypes.LONGVARCHAR: return OleDbType.LongVarWChar;
  88. case DbTypes.JavaSqlTypes.NULL: return OleDbType.Empty;
  89. case DbTypes.JavaSqlTypes.NUMERIC: return OleDbType.Numeric;
  90. default:
  91. case DbTypes.JavaSqlTypes.OTHER: return OleDbType.IUnknown;
  92. case DbTypes.JavaSqlTypes.REAL: return OleDbType.Single;
  93. case DbTypes.JavaSqlTypes.REF: return OleDbType.IUnknown;
  94. case DbTypes.JavaSqlTypes.SMALLINT: return OleDbType.SmallInt;
  95. case DbTypes.JavaSqlTypes.STRUCT: return OleDbType.IUnknown;
  96. case DbTypes.JavaSqlTypes.TIME: return OleDbType.DBTime;
  97. case DbTypes.JavaSqlTypes.TIMESTAMP: return OleDbType.DBTimeStamp;
  98. case DbTypes.JavaSqlTypes.TINYINT: return OleDbType.TinyInt;
  99. case DbTypes.JavaSqlTypes.VARBINARY: return OleDbType.VarBinary;
  100. case DbTypes.JavaSqlTypes.VARCHAR: return OleDbType.VarChar;
  101. }
  102. }
  103. internal static OleDbType ValueTypeToOleDbType(Type type)
  104. {
  105. switch (Type.GetTypeCode(type)) {
  106. case TypeCode.Boolean: return OleDbType.Boolean;
  107. case TypeCode.Byte: return OleDbType.UnsignedTinyInt;
  108. case TypeCode.Char: return OleDbType.Char;
  109. case TypeCode.DateTime: return OleDbType.Date;
  110. case TypeCode.DBNull: return OleDbType.Empty;
  111. case TypeCode.Decimal: return OleDbType.Decimal;
  112. case TypeCode.Double: return OleDbType.Double;
  113. case TypeCode.Empty: return OleDbType.Empty;
  114. case TypeCode.Int16: return OleDbType.SmallInt;
  115. case TypeCode.Int32: return OleDbType.Integer;
  116. case TypeCode.Int64: return OleDbType.BigInt;
  117. default:
  118. case TypeCode.Object: {
  119. if (type.Equals(DbTypes.TypeOfByteArray)) return OleDbType.Binary;
  120. if (type.Equals(DbTypes.TypeOfTimespan)) return OleDbType.DBTime;
  121. if (type.Equals(DbTypes.TypeOfGuid)) return OleDbType.Guid;
  122. return OleDbType.IUnknown;
  123. }
  124. case TypeCode.SByte: return OleDbType.TinyInt;
  125. case TypeCode.Single: return OleDbType.Single;
  126. case TypeCode.String: return OleDbType.VarWChar;
  127. case TypeCode.UInt16: return OleDbType.UnsignedSmallInt;
  128. case TypeCode.UInt32: return OleDbType.UnsignedInt;
  129. case TypeCode.UInt64: return OleDbType.UnsignedBigInt;
  130. }
  131. }
  132. internal static Type OleDbTypeToValueType(OleDbType oleDbType)
  133. {
  134. switch (oleDbType) {
  135. case OleDbType.BigInt : return DbTypes.TypeOfInt64;// typeof(long);
  136. case OleDbType.Binary : return DbTypes.TypeOfByteArray;
  137. case OleDbType.Boolean : return DbTypes.TypeOfBoolean;
  138. case OleDbType.BSTR : return DbTypes.TypeOfString;
  139. case OleDbType.Char : return DbTypes.TypeOfString;
  140. case OleDbType.Currency : return DbTypes.TypeOfDecimal;
  141. case OleDbType.Date : return DbTypes.TypeOfDateTime;
  142. case OleDbType.DBDate : return DbTypes.TypeOfDateTime;
  143. case OleDbType.DBTime : return DbTypes.TypeOfTimespan;
  144. case OleDbType.DBTimeStamp : return DbTypes.TypeOfDateTime;
  145. case OleDbType.Decimal : return DbTypes.TypeOfDecimal;
  146. case OleDbType.Double : return DbTypes.TypeOfDouble;
  147. case OleDbType.Empty : return null; //typeof(DBNull);
  148. case OleDbType.Error : return typeof(Exception);
  149. case OleDbType.Filetime : return DbTypes.TypeOfDateTime;
  150. case OleDbType.Guid : return DbTypes.TypeOfGuid;
  151. case OleDbType.IDispatch : return DbTypes.TypeOfObject;
  152. case OleDbType.Integer : return DbTypes.TypeOfInt32;
  153. case OleDbType.IUnknown : return DbTypes.TypeOfObject;
  154. case OleDbType.LongVarBinary : return DbTypes.TypeOfByteArray;
  155. case OleDbType.LongVarChar : return DbTypes.TypeOfString;
  156. case OleDbType.LongVarWChar : return DbTypes.TypeOfString;
  157. case OleDbType.Numeric : return DbTypes.TypeOfDecimal;
  158. case OleDbType.PropVariant : return DbTypes.TypeOfObject;
  159. case OleDbType.Single : return DbTypes.TypeOfFloat;
  160. case OleDbType.SmallInt : return DbTypes.TypeOfInt16;
  161. case OleDbType.TinyInt : return DbTypes.TypeOfSByte;
  162. case OleDbType.UnsignedBigInt : return DbTypes.TypeOfUInt64;
  163. case OleDbType.UnsignedInt : return DbTypes.TypeOfUInt32;
  164. case OleDbType.UnsignedSmallInt : return DbTypes.TypeOfUInt16;
  165. case OleDbType.UnsignedTinyInt : return DbTypes.TypeOfByte;
  166. case OleDbType.VarBinary : return DbTypes.TypeOfByteArray;
  167. case OleDbType.VarChar : return DbTypes.TypeOfString;
  168. case OleDbType.Variant : return DbTypes.TypeOfObject;
  169. case OleDbType.VarNumeric : return DbTypes.TypeOfDecimal;
  170. case OleDbType.VarWChar : return DbTypes.TypeOfString;
  171. case OleDbType.WChar : return DbTypes.TypeOfString;
  172. default : return DbTypes.TypeOfObject;
  173. }
  174. }
  175. internal static OleDbType DbTypeToOleDbType(DbType dbType)
  176. {
  177. switch (dbType) {
  178. case DbType.AnsiString : return OleDbType.VarChar;
  179. case DbType.Binary : return OleDbType.VarBinary;
  180. case DbType.Byte : return OleDbType.UnsignedTinyInt;
  181. case DbType.Boolean : return OleDbType.Boolean;
  182. case DbType.Currency : return OleDbType.Currency;
  183. case DbType.Date : return OleDbType.DBDate;
  184. case DbType.DateTime : return OleDbType.DBTimeStamp;
  185. case DbType.Decimal : return OleDbType.Decimal;
  186. case DbType.Double : return OleDbType.Double;
  187. case DbType.Guid : return OleDbType.Guid;
  188. case DbType.Int16 : return OleDbType.SmallInt;
  189. case DbType.Int32 : return OleDbType.Integer;
  190. case DbType.Int64 : return OleDbType.BigInt;
  191. case DbType.Object : return OleDbType.Variant;
  192. case DbType.SByte : return OleDbType.TinyInt;
  193. case DbType.Single : return OleDbType.Single;
  194. case DbType.String : return OleDbType.VarWChar;
  195. case DbType.Time : return OleDbType.DBTime;
  196. case DbType.UInt16 : return OleDbType.UnsignedSmallInt;
  197. case DbType.UInt32 : return OleDbType.UnsignedInt;
  198. case DbType.UInt64 : return OleDbType.UnsignedBigInt;
  199. case DbType.VarNumeric : return OleDbType.VarNumeric;
  200. case DbType.AnsiStringFixedLength : return OleDbType.Char;
  201. case DbType.StringFixedLength : return OleDbType.WChar;
  202. default : throw ExceptionHelper.InvalidDbType((int)dbType);
  203. }
  204. }
  205. internal static DbType OleDbTypeToDbType(OleDbType oleDbType)
  206. {
  207. switch (oleDbType) {
  208. case OleDbType.Empty : return DbType.Object;
  209. case OleDbType.SmallInt : return DbType.Int16;
  210. case OleDbType.Integer : return DbType.Int32;
  211. case OleDbType.Single : return DbType.Single;
  212. case OleDbType.Double : return DbType.Double;
  213. case OleDbType.Currency : return DbType.Currency;
  214. case OleDbType.Date : return DbType.DateTime;
  215. case OleDbType.BSTR : return DbType.String;
  216. case OleDbType.IDispatch : return DbType.Object;
  217. case OleDbType.Error : return DbType.Object;
  218. case OleDbType.Boolean : return DbType.Boolean;
  219. case OleDbType.Variant : return DbType.Object;
  220. case OleDbType.IUnknown : return DbType.Object;
  221. case OleDbType.Decimal : return DbType.Decimal;
  222. case OleDbType.TinyInt : return DbType.SByte;
  223. case OleDbType.UnsignedTinyInt : return DbType.Byte;
  224. case OleDbType.UnsignedSmallInt : return DbType.UInt16;
  225. case OleDbType.UnsignedInt : return DbType.UInt32;
  226. case OleDbType.BigInt : return DbType.Int64;
  227. case OleDbType.UnsignedBigInt : return DbType.UInt64;
  228. case OleDbType.Filetime : return DbType.DateTime;
  229. case OleDbType.Guid : return DbType.Guid;
  230. case OleDbType.Binary : return DbType.Binary;
  231. case OleDbType.Char : return DbType.AnsiStringFixedLength;
  232. case OleDbType.WChar : return DbType.StringFixedLength;
  233. case OleDbType.Numeric : return DbType.Decimal;
  234. case OleDbType.DBDate : return DbType.Date;
  235. case OleDbType.DBTime : return DbType.Time;
  236. case OleDbType.DBTimeStamp : return DbType.DateTime;
  237. case OleDbType.PropVariant : return DbType.Object;
  238. case OleDbType.VarNumeric : return DbType.VarNumeric;
  239. case OleDbType.VarChar : return DbType.AnsiString;
  240. case OleDbType.LongVarChar : return DbType.AnsiString;
  241. case OleDbType.VarWChar : return DbType.String;
  242. case OleDbType.LongVarWChar : return DbType.String;
  243. case OleDbType.VarBinary : return DbType.Binary;
  244. case OleDbType.LongVarBinary : return DbType.Binary;
  245. default : throw ExceptionHelper.InvalidOleDbType((int)oleDbType);
  246. }
  247. }
  248. internal static int OleDbTypeToJdbcType(OleDbType oleDbType)
  249. {
  250. switch(oleDbType) {
  251. case OleDbType.BigInt : return Types.BIGINT;
  252. case OleDbType.Binary : return Types.BINARY;
  253. case OleDbType.Boolean : return Types.BIT;
  254. case OleDbType.BSTR : return Types.VARCHAR;
  255. case OleDbType.Char : return Types.CHAR;
  256. case OleDbType.Currency : return Types.DECIMAL;
  257. case OleDbType.Date : return Types.TIMESTAMP;
  258. case OleDbType.DBDate : return Types.DATE;
  259. case OleDbType.DBTime : return Types.TIME;
  260. case OleDbType.DBTimeStamp : return Types.TIMESTAMP;
  261. case OleDbType.Decimal : return Types.DECIMAL;
  262. case OleDbType.Double : return Types.DOUBLE;
  263. case OleDbType.Empty : return Types.NULL;
  264. case OleDbType.Error : return Types.OTHER;
  265. case OleDbType.Filetime : return Types.TIMESTAMP;
  266. case OleDbType.Guid : return Types.OTHER;
  267. case OleDbType.IDispatch : return Types.OTHER; //throw new ArgumentException("The " + oleDbType + " OleDbType value is not supported.");
  268. case OleDbType.Integer : return Types.INTEGER;
  269. case OleDbType.IUnknown : return Types.OTHER; //throw new ArgumentException("The " + oleDbType + " OleDbType value is not supported.");
  270. case OleDbType.LongVarBinary : return Types.LONGVARBINARY;
  271. case OleDbType.LongVarChar : return Types.LONGVARCHAR;
  272. case OleDbType.LongVarWChar : return Types.LONGVARCHAR;
  273. case OleDbType.Numeric : return Types.NUMERIC;
  274. case OleDbType.PropVariant : return Types.OTHER;
  275. case OleDbType.Single : return Types.FLOAT;
  276. case OleDbType.SmallInt : return Types.SMALLINT;
  277. case OleDbType.TinyInt : return Types.TINYINT;
  278. case OleDbType.UnsignedBigInt : return Types.BIGINT;
  279. case OleDbType.UnsignedInt : return Types.INTEGER;
  280. case OleDbType.UnsignedSmallInt : return Types.SMALLINT;
  281. case OleDbType.UnsignedTinyInt : return Types.TINYINT;
  282. case OleDbType.VarBinary : return Types.VARBINARY;
  283. case OleDbType.VarChar : return Types.VARCHAR;
  284. case OleDbType.Variant : return Types.VARCHAR;
  285. case OleDbType.VarNumeric : return Types.DECIMAL;
  286. case OleDbType.VarWChar : return Types.VARCHAR;
  287. case OleDbType.WChar : return Types.VARCHAR;
  288. default : throw ExceptionHelper.InvalidOleDbType((int)oleDbType);
  289. }
  290. #endregion // Methods
  291. }
  292. }
  293. }