2 // OdbcTypeConvert.cs : helps conversion between various odbc types.
5 // Sureshkumar T <tsureshkumar@novell.com>
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
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:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
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.
32 // For mapping between types, refer OdbcTypeMap.cs
38 using System.Collections;
39 using System.Data.Common;
41 namespace System.Data.Odbc
43 internal class OdbcTypeConverter
45 public static OdbcTypeMap GetTypeMap (OdbcType odbcType)
47 return (OdbcTypeMap) OdbcTypeMap.Maps [odbcType];
50 public static OdbcTypeMap InferFromValue (object value)
53 if (value.GetType ().IsArray)
54 if (value.GetType ().GetElementType () == typeof (byte))
55 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Binary];
57 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar]; // change
59 switch (Type.GetTypeCode (value.GetType ())) {
63 throw new ArgumentException (String.Format ("Infering OdbcType from {0} is not supported",
64 Type.GetTypeCode (value.GetType ())));
65 case TypeCode.Boolean:
66 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
68 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Char];
70 throw new ArgumentException ("infering OdbcType from SByte is not supported");
72 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
74 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
77 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
80 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.BigInt];
82 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
84 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
86 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Double];
87 case TypeCode.Decimal:
88 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
89 case TypeCode.DateTime:
90 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
92 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar];
99 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
102 public static OdbcTypeMap GetTypeMap (SQL_TYPE sqlType)
105 case SQL_TYPE.BINARY:
106 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Binary];
108 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
110 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Char];
112 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Date];
113 case SQL_TYPE.DECIMAL:
114 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Decimal];
115 case SQL_TYPE.DOUBLE:
116 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Double];
118 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.UniqueIdentifier];
119 case SQL_TYPE.INTEGER:
120 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
121 case SQL_TYPE.INTERVAL_DAY:
122 case SQL_TYPE.INTERVAL_DAY_TO_HOUR:
123 case SQL_TYPE.INTERVAL_DAY_TO_MINUTE:
124 case SQL_TYPE.INTERVAL_DAY_TO_SECOND:
125 case SQL_TYPE.INTERVAL_HOUR:
126 case SQL_TYPE.INTERVAL_HOUR_TO_MINUTE:
127 case SQL_TYPE.INTERVAL_HOUR_TO_SECOND:
128 case SQL_TYPE.INTERVAL_MINUTE:
129 case SQL_TYPE.INTERVAL_MINUTE_TO_SECOND:
130 case SQL_TYPE.INTERVAL_MONTH:
131 case SQL_TYPE.INTERVAL_SECOND:
132 case SQL_TYPE.INTERVAL_YEAR:
133 case SQL_TYPE.INTERVAL_YEAR_TO_MONTH:
134 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
135 case SQL_TYPE.LONGVARBINARY:
136 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Image];
137 case SQL_TYPE.LONGVARCHAR:
138 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Text];
139 case SQL_TYPE.NUMERIC:
140 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
142 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
143 case SQL_TYPE.SMALLINT:
144 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
146 case SQL_TYPE.TIMESTAMP:
147 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
148 case SQL_TYPE.TINYINT:
149 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
150 case SQL_TYPE.TYPE_DATE:
151 case SQL_TYPE.TYPE_TIME:
152 case SQL_TYPE.TYPE_TIMESTAMP:
153 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
154 case SQL_TYPE.VARBINARY:
155 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarBinary];
156 case SQL_TYPE.VARCHAR:
157 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
159 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NChar];
160 case SQL_TYPE.WLONGVARCHAR:
161 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NText];
162 case SQL_TYPE.WVARCHAR:
163 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar];
164 case SQL_TYPE.UNASSIGNED:
165 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
167 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
170 public static OdbcTypeMap GetTypeMap (DbType dbType)
173 case DbType.AnsiString:
174 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
176 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Binary];
178 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
180 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
181 case DbType.Currency:
182 throw new NotSupportedException ("Infering OdbcType from DbType.Currency is not" +
185 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Date];
186 case DbType.DateTime:
187 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
189 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
191 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Double];
193 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.UniqueIdentifier];
195 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
197 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
199 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.BigInt];
201 throw new NotSupportedException ("Infering OdbcType from DbType.Object is not" +
204 throw new NotSupportedException ("Infering OdbcType from DbType.SByte is not" +
207 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
209 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar];
211 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Time];
213 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
215 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.BigInt];
217 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
218 case DbType.VarNumeric:
219 throw new NotSupportedException ("Infering OdbcType from DbType.VarNumeric is not" +
221 case DbType.AnsiStringFixedLength:
222 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Char];
223 case DbType.StringFixedLength:
224 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NChar];
226 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];