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 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar]; //Default to NVarChar as in MS.net. OdbcParameter.Bind() will take care.
64 case TypeCode.Boolean:
65 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
67 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Char];
69 throw new ArgumentException ("infering OdbcType from SByte is not supported");
71 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
73 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
76 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
79 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.BigInt];
81 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
83 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
85 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Double];
86 case TypeCode.Decimal:
87 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
88 case TypeCode.DateTime:
89 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
91 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar];
98 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
101 public static OdbcTypeMap GetTypeMap (SQL_TYPE sqlType)
104 case SQL_TYPE.BINARY:
105 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Binary];
107 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
109 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Char];
111 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Date];
112 case SQL_TYPE.DECIMAL:
113 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Decimal];
114 case SQL_TYPE.DOUBLE:
115 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Double];
117 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.UniqueIdentifier];
118 case SQL_TYPE.INTEGER:
119 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
120 case SQL_TYPE.INTERVAL_DAY:
121 case SQL_TYPE.INTERVAL_DAY_TO_HOUR:
122 case SQL_TYPE.INTERVAL_DAY_TO_MINUTE:
123 case SQL_TYPE.INTERVAL_DAY_TO_SECOND:
124 case SQL_TYPE.INTERVAL_HOUR:
125 case SQL_TYPE.INTERVAL_HOUR_TO_MINUTE:
126 case SQL_TYPE.INTERVAL_HOUR_TO_SECOND:
127 case SQL_TYPE.INTERVAL_MINUTE:
128 case SQL_TYPE.INTERVAL_MINUTE_TO_SECOND:
129 case SQL_TYPE.INTERVAL_MONTH:
130 case SQL_TYPE.INTERVAL_SECOND:
131 case SQL_TYPE.INTERVAL_YEAR:
132 case SQL_TYPE.INTERVAL_YEAR_TO_MONTH:
133 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
134 case SQL_TYPE.LONGVARBINARY:
135 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Image];
136 case SQL_TYPE.LONGVARCHAR:
137 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Text];
138 case SQL_TYPE.NUMERIC:
139 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
141 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
142 case SQL_TYPE.SMALLINT:
143 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
144 case SQL_TYPE.TYPE_TIME:
146 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Time];
147 case SQL_TYPE.TIMESTAMP:
148 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
149 case SQL_TYPE.TINYINT:
150 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
151 case SQL_TYPE.TYPE_DATE:
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];