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